Skip to content

Commit 9c70f3d

Browse files
committed
SelectionDAG/expandFMINNUM_FMAXNUM: skips vector if Op is legal for elements
If we are working on an vector, and the operation is legal for the elements, just skip will be better than expand it. So that, some simple scale instructions can be emitted instead of some pairs of comparation+selection. It cannot be more earlier, since we may use some similar instruction (such as fminimum/fminnum_ieee) for some cases, such as fast math.
1 parent e8a7390 commit 9c70f3d

File tree

3 files changed

+171
-350
lines changed

3 files changed

+171
-350
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8485,6 +8485,11 @@ SDValue TargetLowering::expandFMINNUM_FMAXNUM(SDNode *Node,
84858485
Node->getOperand(1), Node->getFlags());
84868486
}
84878487

8488+
// If we have INSN fitting this operation strictly for the elements of the
8489+
// vector, normally, splitting it is better than compare+select.
8490+
if (VT.isVector() && isOperationLegal(Node->getOpcode(), VT.getScalarType()))
8491+
return SDValue();
8492+
84888493
if (SDValue SelCC = createSelectForFMINNUM_FMAXNUM(Node, DAG))
84898494
return SelCC;
84908495

llvm/test/CodeGen/ARM/minnum-maxnum-intrinsics.ll

Lines changed: 90 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -918,32 +918,24 @@ define <2 x double> @fminnumv264_intrinsic(<2 x double> %x, <2 x double> %y) {
918918
; ARMV8: @ %bb.0:
919919
; ARMV8-NEXT: mov r12, sp
920920
; ARMV8-NEXT: vld1.64 {d16, d17}, [r12]
921-
; ARMV8-NEXT: vmov d18, r0, r1
922-
; ARMV8-NEXT: vmov d19, r2, r3
923-
; ARMV8-NEXT: vcmp.f64 d16, d18
924-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
925-
; ARMV8-NEXT: vcmp.f64 d17, d19
926-
; ARMV8-NEXT: vselgt.f64 d18, d18, d16
927-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
928-
; ARMV8-NEXT: vmov r0, r1, d18
929-
; ARMV8-NEXT: vselgt.f64 d16, d19, d17
921+
; ARMV8-NEXT: vmov d19, r0, r1
922+
; ARMV8-NEXT: vmov d18, r2, r3
923+
; ARMV8-NEXT: vminnm.f64 d19, d19, d16
924+
; ARMV8-NEXT: vminnm.f64 d16, d18, d17
925+
; ARMV8-NEXT: vmov r0, r1, d19
930926
; ARMV8-NEXT: vmov r2, r3, d16
931927
; ARMV8-NEXT: bx lr
932928
;
933929
; ARMV8M-LABEL: fminnumv264_intrinsic:
934930
; ARMV8M: @ %bb.0:
935931
; ARMV8M-NEXT: mov r12, sp
936-
; ARMV8M-NEXT: vmov d0, r0, r1
932+
; ARMV8M-NEXT: vmov d0, r2, r3
937933
; ARMV8M-NEXT: vldrw.u32 q1, [r12]
938-
; ARMV8M-NEXT: vmov d1, r2, r3
939-
; ARMV8M-NEXT: vcmp.f64 d2, d0
940-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
941-
; ARMV8M-NEXT: vcmp.f64 d3, d1
942-
; ARMV8M-NEXT: vselgt.f64 d0, d0, d2
943-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
944-
; ARMV8M-NEXT: vmov r0, r1, d0
945-
; ARMV8M-NEXT: vselgt.f64 d1, d1, d3
946-
; ARMV8M-NEXT: vmov r2, r3, d1
934+
; ARMV8M-NEXT: vmov d1, r0, r1
935+
; ARMV8M-NEXT: vminnm.f64 d1, d1, d2
936+
; ARMV8M-NEXT: vminnm.f64 d0, d0, d3
937+
; ARMV8M-NEXT: vmov r0, r1, d1
938+
; ARMV8M-NEXT: vmov r2, r3, d0
947939
; ARMV8M-NEXT: bx lr
948940
%a = call nnan <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double> %y)
949941
ret <2 x double> %a
@@ -970,32 +962,24 @@ define <2 x double> @fminnumv264_nsz_intrinsic(<2 x double> %x, <2 x double> %y)
970962
; ARMV8: @ %bb.0:
971963
; ARMV8-NEXT: mov r12, sp
972964
; ARMV8-NEXT: vld1.64 {d16, d17}, [r12]
973-
; ARMV8-NEXT: vmov d18, r0, r1
974-
; ARMV8-NEXT: vmov d19, r2, r3
975-
; ARMV8-NEXT: vcmp.f64 d16, d18
976-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
977-
; ARMV8-NEXT: vcmp.f64 d17, d19
978-
; ARMV8-NEXT: vselgt.f64 d18, d18, d16
979-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
980-
; ARMV8-NEXT: vmov r0, r1, d18
981-
; ARMV8-NEXT: vselgt.f64 d16, d19, d17
965+
; ARMV8-NEXT: vmov d19, r0, r1
966+
; ARMV8-NEXT: vmov d18, r2, r3
967+
; ARMV8-NEXT: vminnm.f64 d19, d19, d16
968+
; ARMV8-NEXT: vminnm.f64 d16, d18, d17
969+
; ARMV8-NEXT: vmov r0, r1, d19
982970
; ARMV8-NEXT: vmov r2, r3, d16
983971
; ARMV8-NEXT: bx lr
984972
;
985973
; ARMV8M-LABEL: fminnumv264_nsz_intrinsic:
986974
; ARMV8M: @ %bb.0:
987975
; ARMV8M-NEXT: mov r12, sp
988-
; ARMV8M-NEXT: vmov d0, r0, r1
976+
; ARMV8M-NEXT: vmov d0, r2, r3
989977
; ARMV8M-NEXT: vldrw.u32 q1, [r12]
990-
; ARMV8M-NEXT: vmov d1, r2, r3
991-
; ARMV8M-NEXT: vcmp.f64 d2, d0
992-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
993-
; ARMV8M-NEXT: vcmp.f64 d3, d1
994-
; ARMV8M-NEXT: vselgt.f64 d0, d0, d2
995-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
996-
; ARMV8M-NEXT: vmov r0, r1, d0
997-
; ARMV8M-NEXT: vselgt.f64 d1, d1, d3
998-
; ARMV8M-NEXT: vmov r2, r3, d1
978+
; ARMV8M-NEXT: vmov d1, r0, r1
979+
; ARMV8M-NEXT: vminnm.f64 d1, d1, d2
980+
; ARMV8M-NEXT: vminnm.f64 d0, d0, d3
981+
; ARMV8M-NEXT: vmov r0, r1, d1
982+
; ARMV8M-NEXT: vmov r2, r3, d0
999983
; ARMV8M-NEXT: bx lr
1000984
%a = call nnan nsz <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double> %y)
1001985
ret <2 x double> %a
@@ -1020,31 +1004,23 @@ define <2 x double> @fminnumv264_non_zero_intrinsic(<2 x double> %x) {
10201004
;
10211005
; ARMV8-LABEL: fminnumv264_non_zero_intrinsic:
10221006
; ARMV8: @ %bb.0:
1023-
; ARMV8-NEXT: vmov d17, r0, r1
10241007
; ARMV8-NEXT: vmov.f64 d16, #1.000000e+00
1025-
; ARMV8-NEXT: vcmp.f64 d16, d17
1026-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1027-
; ARMV8-NEXT: vmov d18, r2, r3
1028-
; ARMV8-NEXT: vcmp.f64 d16, d18
1029-
; ARMV8-NEXT: vselgt.f64 d17, d17, d16
1030-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1031-
; ARMV8-NEXT: vmov r0, r1, d17
1032-
; ARMV8-NEXT: vselgt.f64 d16, d18, d16
1008+
; ARMV8-NEXT: vmov d18, r0, r1
1009+
; ARMV8-NEXT: vmov d17, r2, r3
1010+
; ARMV8-NEXT: vminnm.f64 d18, d18, d16
1011+
; ARMV8-NEXT: vminnm.f64 d16, d17, d16
1012+
; ARMV8-NEXT: vmov r0, r1, d18
10331013
; ARMV8-NEXT: vmov r2, r3, d16
10341014
; ARMV8-NEXT: bx lr
10351015
;
10361016
; ARMV8M-LABEL: fminnumv264_non_zero_intrinsic:
10371017
; ARMV8M: @ %bb.0:
1038-
; ARMV8M-NEXT: vmov d1, r0, r1
10391018
; ARMV8M-NEXT: vmov.f64 d0, #1.000000e+00
1040-
; ARMV8M-NEXT: vcmp.f64 d0, d1
1041-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1042-
; ARMV8M-NEXT: vmov d2, r2, r3
1043-
; ARMV8M-NEXT: vcmp.f64 d0, d2
1044-
; ARMV8M-NEXT: vselgt.f64 d1, d1, d0
1045-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1046-
; ARMV8M-NEXT: vmov r0, r1, d1
1047-
; ARMV8M-NEXT: vselgt.f64 d0, d2, d0
1019+
; ARMV8M-NEXT: vmov d2, r0, r1
1020+
; ARMV8M-NEXT: vmov d1, r2, r3
1021+
; ARMV8M-NEXT: vminnm.f64 d2, d2, d0
1022+
; ARMV8M-NEXT: vminnm.f64 d0, d1, d0
1023+
; ARMV8M-NEXT: vmov r0, r1, d2
10481024
; ARMV8M-NEXT: vmov r2, r3, d0
10491025
; ARMV8M-NEXT: bx lr
10501026
%a = call nnan <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double><double 1.0, double 1.0>)
@@ -1070,34 +1046,26 @@ define <2 x double> @fminnumv264_one_zero_intrinsic(<2 x double> %x) {
10701046
;
10711047
; ARMV8-LABEL: fminnumv264_one_zero_intrinsic:
10721048
; ARMV8: @ %bb.0:
1073-
; ARMV8-NEXT: vmov d19, r2, r3
1074-
; ARMV8-NEXT: vcmp.f64 d19, #0
1075-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1076-
; ARMV8-NEXT: vmov d18, r0, r1
10771049
; ARMV8-NEXT: vmov.f64 d16, #-1.000000e+00
1078-
; ARMV8-NEXT: vcmp.f64 d16, d18
1050+
; ARMV8-NEXT: vmov d18, r0, r1
10791051
; ARMV8-NEXT: vmov.i32 d17, #0x0
1080-
; ARMV8-NEXT: vmovlt.f64 d17, d19
1081-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1082-
; ARMV8-NEXT: vmov r2, r3, d17
1083-
; ARMV8-NEXT: vselgt.f64 d16, d18, d16
1052+
; ARMV8-NEXT: vminnm.f64 d16, d18, d16
1053+
; ARMV8-NEXT: vmov d19, r2, r3
1054+
; ARMV8-NEXT: vminnm.f64 d17, d19, d17
10841055
; ARMV8-NEXT: vmov r0, r1, d16
1056+
; ARMV8-NEXT: vmov r2, r3, d17
10851057
; ARMV8-NEXT: bx lr
10861058
;
10871059
; ARMV8M-LABEL: fminnumv264_one_zero_intrinsic:
10881060
; ARMV8M: @ %bb.0:
1089-
; ARMV8M-NEXT: vmov d3, r2, r3
1061+
; ARMV8M-NEXT: vmov.f64 d0, #-1.000000e+00
10901062
; ARMV8M-NEXT: vldr d1, .LCPI27_0
1091-
; ARMV8M-NEXT: vcmp.f64 d3, #0
1092-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
10931063
; ARMV8M-NEXT: vmov d2, r0, r1
1094-
; ARMV8M-NEXT: vmov.f64 d0, #-1.000000e+00
1095-
; ARMV8M-NEXT: vcmp.f64 d0, d2
1096-
; ARMV8M-NEXT: vmovlt.f64 d1, d3
1097-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1098-
; ARMV8M-NEXT: vmov r2, r3, d1
1099-
; ARMV8M-NEXT: vselgt.f64 d0, d2, d0
1064+
; ARMV8M-NEXT: vmov d3, r2, r3
1065+
; ARMV8M-NEXT: vminnm.f64 d0, d2, d0
1066+
; ARMV8M-NEXT: vminnm.f64 d1, d3, d1
11001067
; ARMV8M-NEXT: vmov r0, r1, d0
1068+
; ARMV8M-NEXT: vmov r2, r3, d1
11011069
; ARMV8M-NEXT: bx lr
11021070
; ARMV8M-NEXT: .p2align 3
11031071
; ARMV8M-NEXT: @ %bb.1:
@@ -1129,31 +1097,23 @@ define <2 x double> @fmaxnumv264_intrinsic(<2 x double> %x, <2 x double> %y) {
11291097
; ARMV8: @ %bb.0:
11301098
; ARMV8-NEXT: mov r12, sp
11311099
; ARMV8-NEXT: vld1.64 {d16, d17}, [r12]
1132-
; ARMV8-NEXT: vmov d18, r0, r1
1133-
; ARMV8-NEXT: vcmp.f64 d18, d16
1134-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1135-
; ARMV8-NEXT: vmov d19, r2, r3
1136-
; ARMV8-NEXT: vcmp.f64 d19, d17
1137-
; ARMV8-NEXT: vselgt.f64 d18, d18, d16
1138-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1139-
; ARMV8-NEXT: vmov r0, r1, d18
1140-
; ARMV8-NEXT: vselgt.f64 d16, d19, d17
1100+
; ARMV8-NEXT: vmov d19, r0, r1
1101+
; ARMV8-NEXT: vmov d18, r2, r3
1102+
; ARMV8-NEXT: vmaxnm.f64 d19, d19, d16
1103+
; ARMV8-NEXT: vmaxnm.f64 d16, d18, d17
1104+
; ARMV8-NEXT: vmov r0, r1, d19
11411105
; ARMV8-NEXT: vmov r2, r3, d16
11421106
; ARMV8-NEXT: bx lr
11431107
;
11441108
; ARMV8M-LABEL: fmaxnumv264_intrinsic:
11451109
; ARMV8M: @ %bb.0:
11461110
; ARMV8M-NEXT: mov r12, sp
1147-
; ARMV8M-NEXT: vmov d1, r0, r1
1148-
; ARMV8M-NEXT: vldrw.u32 q1, [r12]
11491111
; ARMV8M-NEXT: vmov d0, r2, r3
1150-
; ARMV8M-NEXT: vcmp.f64 d1, d2
1151-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1152-
; ARMV8M-NEXT: vcmp.f64 d0, d3
1153-
; ARMV8M-NEXT: vselgt.f64 d1, d1, d2
1154-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1112+
; ARMV8M-NEXT: vldrw.u32 q1, [r12]
1113+
; ARMV8M-NEXT: vmov d1, r0, r1
1114+
; ARMV8M-NEXT: vmaxnm.f64 d1, d1, d2
1115+
; ARMV8M-NEXT: vmaxnm.f64 d0, d0, d3
11551116
; ARMV8M-NEXT: vmov r0, r1, d1
1156-
; ARMV8M-NEXT: vselgt.f64 d0, d0, d3
11571117
; ARMV8M-NEXT: vmov r2, r3, d0
11581118
; ARMV8M-NEXT: bx lr
11591119
%a = call nnan <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double> %y)
@@ -1181,31 +1141,23 @@ define <2 x double> @fmaxnumv264_nsz_intrinsic(<2 x double> %x, <2 x double> %y)
11811141
; ARMV8: @ %bb.0:
11821142
; ARMV8-NEXT: mov r12, sp
11831143
; ARMV8-NEXT: vld1.64 {d16, d17}, [r12]
1184-
; ARMV8-NEXT: vmov d18, r0, r1
1185-
; ARMV8-NEXT: vcmp.f64 d18, d16
1186-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1187-
; ARMV8-NEXT: vmov d19, r2, r3
1188-
; ARMV8-NEXT: vcmp.f64 d19, d17
1189-
; ARMV8-NEXT: vselgt.f64 d18, d18, d16
1190-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1191-
; ARMV8-NEXT: vmov r0, r1, d18
1192-
; ARMV8-NEXT: vselgt.f64 d16, d19, d17
1144+
; ARMV8-NEXT: vmov d19, r0, r1
1145+
; ARMV8-NEXT: vmov d18, r2, r3
1146+
; ARMV8-NEXT: vmaxnm.f64 d19, d19, d16
1147+
; ARMV8-NEXT: vmaxnm.f64 d16, d18, d17
1148+
; ARMV8-NEXT: vmov r0, r1, d19
11931149
; ARMV8-NEXT: vmov r2, r3, d16
11941150
; ARMV8-NEXT: bx lr
11951151
;
11961152
; ARMV8M-LABEL: fmaxnumv264_nsz_intrinsic:
11971153
; ARMV8M: @ %bb.0:
11981154
; ARMV8M-NEXT: mov r12, sp
1199-
; ARMV8M-NEXT: vmov d1, r0, r1
1200-
; ARMV8M-NEXT: vldrw.u32 q1, [r12]
12011155
; ARMV8M-NEXT: vmov d0, r2, r3
1202-
; ARMV8M-NEXT: vcmp.f64 d1, d2
1203-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1204-
; ARMV8M-NEXT: vcmp.f64 d0, d3
1205-
; ARMV8M-NEXT: vselgt.f64 d1, d1, d2
1206-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1156+
; ARMV8M-NEXT: vldrw.u32 q1, [r12]
1157+
; ARMV8M-NEXT: vmov d1, r0, r1
1158+
; ARMV8M-NEXT: vmaxnm.f64 d1, d1, d2
1159+
; ARMV8M-NEXT: vmaxnm.f64 d0, d0, d3
12071160
; ARMV8M-NEXT: vmov r0, r1, d1
1208-
; ARMV8M-NEXT: vselgt.f64 d0, d0, d3
12091161
; ARMV8M-NEXT: vmov r2, r3, d0
12101162
; ARMV8M-NEXT: bx lr
12111163
%a = call nnan nsz <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double> %y)
@@ -1236,18 +1188,14 @@ define <2 x double> @fmaxnumv264_zero_intrinsic(<2 x double> %x) {
12361188
;
12371189
; ARMV8-LABEL: fmaxnumv264_zero_intrinsic:
12381190
; ARMV8: @ %bb.0:
1239-
; ARMV8-NEXT: vmov d18, r0, r1
12401191
; ARMV8-NEXT: vldr d16, .LCPI30_0
1241-
; ARMV8-NEXT: vcmp.f64 d18, #0
1242-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1243-
; ARMV8-NEXT: vmov d19, r2, r3
1244-
; ARMV8-NEXT: vcmp.f64 d19, d16
1192+
; ARMV8-NEXT: vmov d18, r2, r3
12451193
; ARMV8-NEXT: vmov.i32 d17, #0x0
1246-
; ARMV8-NEXT: vselgt.f64 d17, d18, d17
1247-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1248-
; ARMV8-NEXT: vmov r0, r1, d17
1249-
; ARMV8-NEXT: vselgt.f64 d16, d19, d16
1194+
; ARMV8-NEXT: vmov d19, r0, r1
1195+
; ARMV8-NEXT: vmaxnm.f64 d16, d18, d16
1196+
; ARMV8-NEXT: vmaxnm.f64 d17, d19, d17
12501197
; ARMV8-NEXT: vmov r2, r3, d16
1198+
; ARMV8-NEXT: vmov r0, r1, d17
12511199
; ARMV8-NEXT: bx lr
12521200
; ARMV8-NEXT: .p2align 3
12531201
; ARMV8-NEXT: @ %bb.1:
@@ -1257,18 +1205,14 @@ define <2 x double> @fmaxnumv264_zero_intrinsic(<2 x double> %x) {
12571205
;
12581206
; ARMV8M-LABEL: fmaxnumv264_zero_intrinsic:
12591207
; ARMV8M: @ %bb.0:
1260-
; ARMV8M-NEXT: vmov d2, r0, r1
12611208
; ARMV8M-NEXT: vldr d0, .LCPI30_0
1262-
; ARMV8M-NEXT: vcmp.f64 d2, #0
1263-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1264-
; ARMV8M-NEXT: vmov d3, r2, r3
1265-
; ARMV8M-NEXT: vcmp.f64 d3, d0
1209+
; ARMV8M-NEXT: vmov d2, r2, r3
12661210
; ARMV8M-NEXT: vldr d1, .LCPI30_1
1267-
; ARMV8M-NEXT: vselgt.f64 d1, d2, d1
1268-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1269-
; ARMV8M-NEXT: vmov r0, r1, d1
1270-
; ARMV8M-NEXT: vselgt.f64 d0, d3, d0
1211+
; ARMV8M-NEXT: vmov d3, r0, r1
1212+
; ARMV8M-NEXT: vmaxnm.f64 d0, d2, d0
1213+
; ARMV8M-NEXT: vmaxnm.f64 d1, d3, d1
12711214
; ARMV8M-NEXT: vmov r2, r3, d0
1215+
; ARMV8M-NEXT: vmov r0, r1, d1
12721216
; ARMV8M-NEXT: bx lr
12731217
; ARMV8M-NEXT: .p2align 3
12741218
; ARMV8M-NEXT: @ %bb.1:
@@ -1307,15 +1251,11 @@ define <2 x double> @fmaxnumv264_minus_zero_intrinsic(<2 x double> %x) {
13071251
; ARMV8-LABEL: fmaxnumv264_minus_zero_intrinsic:
13081252
; ARMV8: @ %bb.0:
13091253
; ARMV8-NEXT: vldr d16, .LCPI31_0
1310-
; ARMV8-NEXT: vmov d17, r0, r1
1311-
; ARMV8-NEXT: vmov d18, r2, r3
1312-
; ARMV8-NEXT: vcmp.f64 d17, d16
1313-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1314-
; ARMV8-NEXT: vcmp.f64 d18, d16
1315-
; ARMV8-NEXT: vselgt.f64 d17, d17, d16
1316-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1317-
; ARMV8-NEXT: vmov r0, r1, d17
1318-
; ARMV8-NEXT: vselgt.f64 d16, d18, d16
1254+
; ARMV8-NEXT: vmov d18, r0, r1
1255+
; ARMV8-NEXT: vmov d17, r2, r3
1256+
; ARMV8-NEXT: vmaxnm.f64 d18, d18, d16
1257+
; ARMV8-NEXT: vmaxnm.f64 d16, d17, d16
1258+
; ARMV8-NEXT: vmov r0, r1, d18
13191259
; ARMV8-NEXT: vmov r2, r3, d16
13201260
; ARMV8-NEXT: bx lr
13211261
; ARMV8-NEXT: .p2align 3
@@ -1327,15 +1267,11 @@ define <2 x double> @fmaxnumv264_minus_zero_intrinsic(<2 x double> %x) {
13271267
; ARMV8M-LABEL: fmaxnumv264_minus_zero_intrinsic:
13281268
; ARMV8M: @ %bb.0:
13291269
; ARMV8M-NEXT: vldr d0, .LCPI31_0
1330-
; ARMV8M-NEXT: vmov d1, r0, r1
1331-
; ARMV8M-NEXT: vmov d2, r2, r3
1332-
; ARMV8M-NEXT: vcmp.f64 d1, d0
1333-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1334-
; ARMV8M-NEXT: vcmp.f64 d2, d0
1335-
; ARMV8M-NEXT: vselgt.f64 d1, d1, d0
1336-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1337-
; ARMV8M-NEXT: vmov r0, r1, d1
1338-
; ARMV8M-NEXT: vselgt.f64 d0, d2, d0
1270+
; ARMV8M-NEXT: vmov d2, r0, r1
1271+
; ARMV8M-NEXT: vmov d1, r2, r3
1272+
; ARMV8M-NEXT: vmaxnm.f64 d2, d2, d0
1273+
; ARMV8M-NEXT: vmaxnm.f64 d0, d1, d0
1274+
; ARMV8M-NEXT: vmov r0, r1, d2
13391275
; ARMV8M-NEXT: vmov r2, r3, d0
13401276
; ARMV8M-NEXT: bx lr
13411277
; ARMV8M-NEXT: .p2align 3
@@ -1367,30 +1303,22 @@ define <2 x double> @fmaxnumv264_non_zero_intrinsic(<2 x double> %x) {
13671303
; ARMV8-LABEL: fmaxnumv264_non_zero_intrinsic:
13681304
; ARMV8: @ %bb.0:
13691305
; ARMV8-NEXT: vmov.f64 d16, #1.000000e+00
1370-
; ARMV8-NEXT: vmov d17, r0, r1
1371-
; ARMV8-NEXT: vcmp.f64 d17, d16
1372-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1373-
; ARMV8-NEXT: vmov d18, r2, r3
1374-
; ARMV8-NEXT: vcmp.f64 d18, d16
1375-
; ARMV8-NEXT: vselgt.f64 d17, d17, d16
1376-
; ARMV8-NEXT: vmrs APSR_nzcv, fpscr
1377-
; ARMV8-NEXT: vmov r0, r1, d17
1378-
; ARMV8-NEXT: vselgt.f64 d16, d18, d16
1306+
; ARMV8-NEXT: vmov d18, r0, r1
1307+
; ARMV8-NEXT: vmov d17, r2, r3
1308+
; ARMV8-NEXT: vmaxnm.f64 d18, d18, d16
1309+
; ARMV8-NEXT: vmaxnm.f64 d16, d17, d16
1310+
; ARMV8-NEXT: vmov r0, r1, d18
13791311
; ARMV8-NEXT: vmov r2, r3, d16
13801312
; ARMV8-NEXT: bx lr
13811313
;
13821314
; ARMV8M-LABEL: fmaxnumv264_non_zero_intrinsic:
13831315
; ARMV8M: @ %bb.0:
13841316
; ARMV8M-NEXT: vmov.f64 d0, #1.000000e+00
1385-
; ARMV8M-NEXT: vmov d1, r0, r1
1386-
; ARMV8M-NEXT: vcmp.f64 d1, d0
1387-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1388-
; ARMV8M-NEXT: vmov d2, r2, r3
1389-
; ARMV8M-NEXT: vcmp.f64 d2, d0
1390-
; ARMV8M-NEXT: vselgt.f64 d1, d1, d0
1391-
; ARMV8M-NEXT: vmrs APSR_nzcv, fpscr
1392-
; ARMV8M-NEXT: vmov r0, r1, d1
1393-
; ARMV8M-NEXT: vselgt.f64 d0, d2, d0
1317+
; ARMV8M-NEXT: vmov d2, r0, r1
1318+
; ARMV8M-NEXT: vmov d1, r2, r3
1319+
; ARMV8M-NEXT: vmaxnm.f64 d2, d2, d0
1320+
; ARMV8M-NEXT: vmaxnm.f64 d0, d1, d0
1321+
; ARMV8M-NEXT: vmov r0, r1, d2
13941322
; ARMV8M-NEXT: vmov r2, r3, d0
13951323
; ARMV8M-NEXT: bx lr
13961324
%a = call nnan <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double><double 1.0, double 1.0>)

0 commit comments

Comments
 (0)