Skip to content

Commit 0022f49

Browse files
koachanGeorgeARM
authored andcommitted
[SPARC] Use op-then-neg instructions when we have VIS3 (llvm#138603)
1 parent ebeb11a commit 0022f49

File tree

4 files changed

+147
-0
lines changed

4 files changed

+147
-0
lines changed

llvm/lib/Target/Sparc/SparcISelLowering.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3556,6 +3556,12 @@ bool SparcTargetLowering::useLoadStackGuardNode(const Module &M) const {
35563556
return true;
35573557
}
35583558

3559+
bool SparcTargetLowering::isFNegFree(EVT VT) const {
3560+
if (Subtarget->isVIS3())
3561+
return VT == MVT::f32 || VT == MVT::f64;
3562+
return false;
3563+
}
3564+
35593565
bool SparcTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT,
35603566
bool ForCodeSize) const {
35613567
return Subtarget->isVIS() && (VT == MVT::f32 || VT == MVT::f64) &&

llvm/lib/Target/Sparc/SparcISelLowering.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ namespace llvm {
164164
return VT != MVT::f128;
165165
}
166166

167+
bool isFNegFree(EVT VT) const override;
168+
167169
bool isFPImmLegal(const APFloat &Imm, EVT VT,
168170
bool ForCodeSize) const override;
169171

llvm/lib/Target/Sparc/SparcInstrVIS.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,4 +321,12 @@ def : Pat<(i64 (sext (i32 (bitconvert f32:$src)))), (MOVSTOSW $src)>;
321321
def : Pat<(f32 (bitconvert i32:$src)), (MOVWTOS $src)>;
322322
def : Pat<(i64 (bitconvert f64:$src)), (MOVDTOX $src)>;
323323
def : Pat<(f64 (bitconvert i64:$src)), (MOVXTOD $src)>;
324+
325+
// OP-then-neg FP operations.
326+
// TODO handle equivalent patterns like `rs1*-rs2`.
327+
def : Pat<(f32 (fneg (fadd f32:$rs1, f32:$rs2))), (FNADDS $rs1, $rs2)>;
328+
def : Pat<(f64 (fneg (fadd f64:$rs1, f64:$rs2))), (FNADDD $rs1, $rs2)>;
329+
def : Pat<(f32 (fneg (fmul f32:$rs1, f32:$rs2))), (FNMULS $rs1, $rs2)>;
330+
def : Pat<(f64 (fneg (fmul f64:$rs1, f64:$rs2))), (FNMULD $rs1, $rs2)>;
331+
def : Pat<(f64 (fneg (fmul (fpextend f32:$rs1), (fpextend f32:$rs2)))), (FNSMULD $rs1, $rs2)>;
324332
} // Predicates = [HasVIS3]

llvm/test/CodeGen/SPARC/float-vis3.ll

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=sparc64 -mattr=+vis3 < %s | FileCheck %s
3+
4+
define float @fnadds(float %a, float %b) nounwind {
5+
; CHECK-LABEL: fnadds:
6+
; CHECK: ! %bb.0: ! %entry
7+
; CHECK-NEXT: retl
8+
; CHECK-NEXT: fnadds %f1, %f3, %f0
9+
entry:
10+
%add = fadd float %a, %b
11+
%fneg = fneg float %add
12+
ret float %fneg
13+
}
14+
15+
define double @fnaddd(double %a, double %b) nounwind {
16+
; CHECK-LABEL: fnaddd:
17+
; CHECK: ! %bb.0: ! %entry
18+
; CHECK-NEXT: retl
19+
; CHECK-NEXT: fnaddd %f0, %f2, %f0
20+
entry:
21+
%add = fadd double %a, %b
22+
%fneg = fneg double %add
23+
ret double %fneg
24+
}
25+
26+
define float @fnmuls(float %a, float %b) nounwind {
27+
; CHECK-LABEL: fnmuls:
28+
; CHECK: ! %bb.0: ! %entry
29+
; CHECK-NEXT: retl
30+
; CHECK-NEXT: fnmuls %f1, %f3, %f0
31+
entry:
32+
%mul = fmul float %a, %b
33+
%fneg = fneg float %mul
34+
ret float %fneg
35+
}
36+
37+
define double @fnmuld(double %a, double %b) nounwind {
38+
; CHECK-LABEL: fnmuld:
39+
; CHECK: ! %bb.0: ! %entry
40+
; CHECK-NEXT: retl
41+
; CHECK-NEXT: fnmuld %f0, %f2, %f0
42+
entry:
43+
%mul = fmul double %a, %b
44+
%fneg = fneg double %mul
45+
ret double %fneg
46+
}
47+
48+
define double @fnsmuld(float %a, float %b) nounwind {
49+
; CHECK-LABEL: fnsmuld:
50+
; CHECK: ! %bb.0: ! %entry
51+
; CHECK-NEXT: retl
52+
; CHECK-NEXT: fnsmuld %f1, %f3, %f0
53+
entry:
54+
%da = fpext float %a to double
55+
%db = fpext float %b to double
56+
%mul = fmul double %da, %db
57+
%fneg = fneg double %mul
58+
ret double %fneg
59+
}
60+
61+
define <4 x float> @vec_fnadds(<4 x float> %a, <4 x float> %b) nounwind {
62+
; CHECK-LABEL: vec_fnadds:
63+
; CHECK: ! %bb.0: ! %entry
64+
; CHECK-NEXT: fnadds %f1, %f9, %f0
65+
; CHECK-NEXT: fnadds %f3, %f11, %f1
66+
; CHECK-NEXT: fnadds %f5, %f13, %f2
67+
; CHECK-NEXT: retl
68+
; CHECK-NEXT: fnadds %f7, %f15, %f3
69+
entry:
70+
%add = fadd <4 x float> %a, %b
71+
%fneg = fneg <4 x float> %add
72+
ret <4 x float> %fneg
73+
}
74+
75+
define <4 x double> @vec_fnaddd(<4 x double> %a, <4 x double> %b) nounwind {
76+
; CHECK-LABEL: vec_fnaddd:
77+
; CHECK: ! %bb.0: ! %entry
78+
; CHECK-NEXT: fnaddd %f0, %f8, %f0
79+
; CHECK-NEXT: fnaddd %f2, %f10, %f2
80+
; CHECK-NEXT: fnaddd %f4, %f12, %f4
81+
; CHECK-NEXT: retl
82+
; CHECK-NEXT: fnaddd %f6, %f14, %f6
83+
entry:
84+
%add = fadd <4 x double> %a, %b
85+
%fneg = fneg <4 x double> %add
86+
ret <4 x double> %fneg
87+
}
88+
89+
define <4 x float> @vec_fnmuls(<4 x float> %a, <4 x float> %b) nounwind {
90+
; CHECK-LABEL: vec_fnmuls:
91+
; CHECK: ! %bb.0: ! %entry
92+
; CHECK-NEXT: fnmuls %f1, %f9, %f0
93+
; CHECK-NEXT: fnmuls %f3, %f11, %f1
94+
; CHECK-NEXT: fnmuls %f5, %f13, %f2
95+
; CHECK-NEXT: retl
96+
; CHECK-NEXT: fnmuls %f7, %f15, %f3
97+
entry:
98+
%mul = fmul <4 x float> %a, %b
99+
%fneg = fneg <4 x float> %mul
100+
ret <4 x float> %fneg
101+
}
102+
103+
define <4 x double> @vec_fnmuld(<4 x double> %a, <4 x double> %b) nounwind {
104+
; CHECK-LABEL: vec_fnmuld:
105+
; CHECK: ! %bb.0: ! %entry
106+
; CHECK-NEXT: fnmuld %f0, %f8, %f0
107+
; CHECK-NEXT: fnmuld %f2, %f10, %f2
108+
; CHECK-NEXT: fnmuld %f4, %f12, %f4
109+
; CHECK-NEXT: retl
110+
; CHECK-NEXT: fnmuld %f6, %f14, %f6
111+
entry:
112+
%mul = fmul <4 x double> %a, %b
113+
%fneg = fneg <4 x double> %mul
114+
ret <4 x double> %fneg
115+
}
116+
117+
define <4 x double> @vec_fnsmuld(<4 x float> %a, <4 x float> %b) nounwind {
118+
; CHECK-LABEL: vec_fnsmuld:
119+
; CHECK: ! %bb.0: ! %entry
120+
; CHECK-NEXT: fnsmuld %f1, %f9, %f0
121+
; CHECK-NEXT: fnsmuld %f3, %f11, %f2
122+
; CHECK-NEXT: fnsmuld %f5, %f13, %f4
123+
; CHECK-NEXT: retl
124+
; CHECK-NEXT: fnsmuld %f7, %f15, %f6
125+
entry:
126+
%da = fpext <4 x float> %a to <4 x double>
127+
%db = fpext <4 x float> %b to <4 x double>
128+
%mul = fmul <4 x double> %da, %db
129+
%fneg = fneg <4 x double> %mul
130+
ret <4 x double> %fneg
131+
}

0 commit comments

Comments
 (0)