Skip to content

Commit 842a8c6

Browse files
wzssyqaDinistro
authored andcommitted
LoongArch: Set FMAXNUM and FMINNUM as Legal (#139010)
Now we define FMAXNUM and FMINNUM as IEEE754-2008 with +0.0>-0.0. LoongArch's fmax/fmin just follow this rules full. FMAXNUM_IEEE and FMINNUM_IEEE will be removed in future once: Fixes FMAXNUM/FMINNUM for all targets The use of FMAXNUM_IEEE/FMINNUM_IEEE are not used by middle end anymore.
1 parent 68dccb9 commit 842a8c6

File tree

6 files changed

+67
-94
lines changed

6 files changed

+67
-94
lines changed

llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,9 @@ def : PatFprFpr<fmul, FMUL_S, FPR32>;
172172
def : PatFprFpr<fdiv, FDIV_S, FPR32>;
173173
def : PatFprFpr<fcopysign, FCOPYSIGN_S, FPR32>;
174174
def : PatFprFpr<fmaxnum_ieee, FMAX_S, FPR32>;
175+
def : PatFprFpr<fmaxnum, FMAX_S, FPR32>;
175176
def : PatFprFpr<fminnum_ieee, FMIN_S, FPR32>;
177+
def : PatFprFpr<fminnum, FMIN_S, FPR32>;
176178
def : PatFpr<fneg, FNEG_S, FPR32>;
177179
def : PatFpr<fabs, FABS_S, FPR32>;
178180
def : PatFpr<fsqrt, FSQRT_S, FPR32>;

llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,9 @@ def : PatFprFpr<fmul, FMUL_D, FPR64>;
140140
def : PatFprFpr<fdiv, FDIV_D, FPR64>;
141141
def : PatFprFpr<fcopysign, FCOPYSIGN_D, FPR64>;
142142
def : PatFprFpr<fmaxnum_ieee, FMAX_D, FPR64>;
143+
def : PatFprFpr<fmaxnum, FMAX_D, FPR64>;
143144
def : PatFprFpr<fminnum_ieee, FMIN_D, FPR64>;
145+
def : PatFprFpr<fminnum, FMIN_D, FPR64>;
144146
def : PatFpr<fneg, FNEG_D, FPR64>;
145147
def : PatFpr<fabs, FABS_D, FPR64>;
146148
def : PatFpr<fsqrt, FSQRT_D, FPR64>;

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,9 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
176176
setOperationAction(ISD::BR_CC, MVT::f32, Expand);
177177
setOperationAction(ISD::FMA, MVT::f32, Legal);
178178
setOperationAction(ISD::FMINNUM_IEEE, MVT::f32, Legal);
179+
setOperationAction(ISD::FMINNUM, MVT::f32, Legal);
179180
setOperationAction(ISD::FMAXNUM_IEEE, MVT::f32, Legal);
181+
setOperationAction(ISD::FMAXNUM, MVT::f32, Legal);
180182
setOperationAction(ISD::STRICT_FSETCCS, MVT::f32, Legal);
181183
setOperationAction(ISD::STRICT_FSETCC, MVT::f32, Legal);
182184
setOperationAction(ISD::IS_FPCLASS, MVT::f32, Legal);
@@ -215,7 +217,9 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
215217
setOperationAction(ISD::STRICT_FSETCC, MVT::f64, Legal);
216218
setOperationAction(ISD::FMA, MVT::f64, Legal);
217219
setOperationAction(ISD::FMINNUM_IEEE, MVT::f64, Legal);
220+
setOperationAction(ISD::FMINNUM, MVT::f64, Legal);
218221
setOperationAction(ISD::FMAXNUM_IEEE, MVT::f64, Legal);
222+
setOperationAction(ISD::FMAXNUM, MVT::f64, Legal);
219223
setOperationAction(ISD::IS_FPCLASS, MVT::f64, Legal);
220224
setOperationAction(ISD::FSIN, MVT::f64, Expand);
221225
setOperationAction(ISD::FCOS, MVT::f64, Expand);

llvm/test/CodeGen/LoongArch/fp-max-min.ll

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,21 @@ declare double @llvm.minnum.f64(double, double)
1212
define float @maxnum_float(float %x, float %y) {
1313
; LA32F-LABEL: maxnum_float:
1414
; LA32F: # %bb.0:
15-
; LA32F-NEXT: fmax.s $fa1, $fa1, $fa1
16-
; LA32F-NEXT: fmax.s $fa0, $fa0, $fa0
1715
; LA32F-NEXT: fmax.s $fa0, $fa0, $fa1
1816
; LA32F-NEXT: ret
1917
;
2018
; LA32D-LABEL: maxnum_float:
2119
; LA32D: # %bb.0:
22-
; LA32D-NEXT: fmax.s $fa1, $fa1, $fa1
23-
; LA32D-NEXT: fmax.s $fa0, $fa0, $fa0
2420
; LA32D-NEXT: fmax.s $fa0, $fa0, $fa1
2521
; LA32D-NEXT: ret
2622
;
2723
; LA64F-LABEL: maxnum_float:
2824
; LA64F: # %bb.0:
29-
; LA64F-NEXT: fmax.s $fa1, $fa1, $fa1
30-
; LA64F-NEXT: fmax.s $fa0, $fa0, $fa0
3125
; LA64F-NEXT: fmax.s $fa0, $fa0, $fa1
3226
; LA64F-NEXT: ret
3327
;
3428
; LA64D-LABEL: maxnum_float:
3529
; LA64D: # %bb.0:
36-
; LA64D-NEXT: fmax.s $fa1, $fa1, $fa1
37-
; LA64D-NEXT: fmax.s $fa0, $fa0, $fa0
3830
; LA64D-NEXT: fmax.s $fa0, $fa0, $fa1
3931
; LA64D-NEXT: ret
4032
%z = call float @llvm.maxnum.f32(float %x, float %y)
@@ -55,8 +47,6 @@ define double @maxnum_double(double %x, double %y) {
5547
;
5648
; LA32D-LABEL: maxnum_double:
5749
; LA32D: # %bb.0:
58-
; LA32D-NEXT: fmax.d $fa1, $fa1, $fa1
59-
; LA32D-NEXT: fmax.d $fa0, $fa0, $fa0
6050
; LA32D-NEXT: fmax.d $fa0, $fa0, $fa1
6151
; LA32D-NEXT: ret
6252
;
@@ -74,8 +64,6 @@ define double @maxnum_double(double %x, double %y) {
7464
;
7565
; LA64D-LABEL: maxnum_double:
7666
; LA64D: # %bb.0:
77-
; LA64D-NEXT: fmax.d $fa1, $fa1, $fa1
78-
; LA64D-NEXT: fmax.d $fa0, $fa0, $fa0
7967
; LA64D-NEXT: fmax.d $fa0, $fa0, $fa1
8068
; LA64D-NEXT: ret
8169
%z = call double @llvm.maxnum.f64(double %x, double %y)
@@ -85,29 +73,21 @@ define double @maxnum_double(double %x, double %y) {
8573
define float @minnum_float(float %x, float %y) {
8674
; LA32F-LABEL: minnum_float:
8775
; LA32F: # %bb.0:
88-
; LA32F-NEXT: fmax.s $fa1, $fa1, $fa1
89-
; LA32F-NEXT: fmax.s $fa0, $fa0, $fa0
9076
; LA32F-NEXT: fmin.s $fa0, $fa0, $fa1
9177
; LA32F-NEXT: ret
9278
;
9379
; LA32D-LABEL: minnum_float:
9480
; LA32D: # %bb.0:
95-
; LA32D-NEXT: fmax.s $fa1, $fa1, $fa1
96-
; LA32D-NEXT: fmax.s $fa0, $fa0, $fa0
9781
; LA32D-NEXT: fmin.s $fa0, $fa0, $fa1
9882
; LA32D-NEXT: ret
9983
;
10084
; LA64F-LABEL: minnum_float:
10185
; LA64F: # %bb.0:
102-
; LA64F-NEXT: fmax.s $fa1, $fa1, $fa1
103-
; LA64F-NEXT: fmax.s $fa0, $fa0, $fa0
10486
; LA64F-NEXT: fmin.s $fa0, $fa0, $fa1
10587
; LA64F-NEXT: ret
10688
;
10789
; LA64D-LABEL: minnum_float:
10890
; LA64D: # %bb.0:
109-
; LA64D-NEXT: fmax.s $fa1, $fa1, $fa1
110-
; LA64D-NEXT: fmax.s $fa0, $fa0, $fa0
11191
; LA64D-NEXT: fmin.s $fa0, $fa0, $fa1
11292
; LA64D-NEXT: ret
11393
%z = call float @llvm.minnum.f32(float %x, float %y)
@@ -128,8 +108,6 @@ define double @minnum_double(double %x, double %y) {
128108
;
129109
; LA32D-LABEL: minnum_double:
130110
; LA32D: # %bb.0:
131-
; LA32D-NEXT: fmax.d $fa1, $fa1, $fa1
132-
; LA32D-NEXT: fmax.d $fa0, $fa0, $fa0
133111
; LA32D-NEXT: fmin.d $fa0, $fa0, $fa1
134112
; LA32D-NEXT: ret
135113
;
@@ -147,8 +125,6 @@ define double @minnum_double(double %x, double %y) {
147125
;
148126
; LA64D-LABEL: minnum_double:
149127
; LA64D: # %bb.0:
150-
; LA64D-NEXT: fmax.d $fa1, $fa1, $fa1
151-
; LA64D-NEXT: fmax.d $fa0, $fa0, $fa0
152128
; LA64D-NEXT: fmin.d $fa0, $fa0, $fa1
153129
; LA64D-NEXT: ret
154130
%z = call double @llvm.minnum.f64(double %x, double %y)

0 commit comments

Comments
 (0)