Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit 95a5df8

Browse files
[AArch64] optimise v4f16 fcmps to utilise vector instructions
Improves the code generation for v4f16 FCMP instructions when FullFP16 is not supported. Generating FCTVL(s) rather than a longer series of FCVTs. Differential Revision: https://reviews.llvm.org/D41772 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323118 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 731becc commit 95a5df8

File tree

2 files changed

+100
-178
lines changed

2 files changed

+100
-178
lines changed

lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7298,8 +7298,21 @@ SDValue AArch64TargetLowering::LowerVSETCC(SDValue Op,
72987298
return DAG.getSExtOrTrunc(Cmp, dl, Op.getValueType());
72997299
}
73007300

7301-
if (LHS.getValueType().getVectorElementType() == MVT::f16)
7302-
return SDValue();
7301+
const bool FullFP16 =
7302+
static_cast<const AArch64Subtarget &>(DAG.getSubtarget()).hasFullFP16();
7303+
7304+
// Make v4f16 (only) fcmp operations utilise vector instructions
7305+
// v8f16 support will be a litle more complicated
7306+
if (LHS.getValueType().getVectorElementType() == MVT::f16) {
7307+
if (!FullFP16 && LHS.getValueType().getVectorNumElements() == 4) {
7308+
LHS = DAG.getNode(ISD::FP_EXTEND, dl, MVT::v4f32, LHS);
7309+
RHS = DAG.getNode(ISD::FP_EXTEND, dl, MVT::v4f32, RHS);
7310+
SDValue NewSetcc = DAG.getSetCC(dl, MVT::v4i16, LHS, RHS, CC);
7311+
DAG.ReplaceAllUsesWith(Op, NewSetcc);
7312+
CmpVT = MVT::v4i32;
7313+
} else
7314+
return SDValue();
7315+
}
73037316

73047317
assert(LHS.getValueType().getVectorElementType() == MVT::f32 ||
73057318
LHS.getValueType().getVectorElementType() == MVT::f64);

test/CodeGen/AArch64/fp16-v4-instructions.ll

Lines changed: 85 additions & 176 deletions
Original file line numberDiff line numberDiff line change
@@ -295,18 +295,12 @@ define <4 x i16> @fptoui_i16(<4 x half> %a) #0 {
295295

296296
define <4 x i1> @test_fcmp_une(<4 x half> %a, <4 x half> %b) #0 {
297297
; CHECK-CVT-LABEL: test_fcmp_une:
298-
; CHECK-CVT-DAG: fcvt
299-
; CHECK-CVT-DAG: fcvt
300-
; CHECK-CVT-DAG: fcvt
301-
; CHECK-CVT-DAG: fcvt
302-
; CHECK-CVT-DAG: fcvt
303-
; CHECK-CVT-DAG: fcvt
304-
; CHECK-CVT-DAG: fcvt
305-
; CHECK-CVT-DAG: fcvt
306-
; CHECK-CVT-DAG: csetm {{.*}}, ne
307-
; CHECK-CVT-DAG: csetm {{.*}}, ne
308-
; CHECK-CVT-DAG: csetm {{.*}}, ne
309-
; CHECK-CVT-DAG: csetm {{.*}}, ne
298+
; CHECK-CVT: fcvtl
299+
; CHECK-CVT: fcvtl
300+
; CHECK-CVT: fcmeq
301+
; CHECK-CVT: mvn
302+
; CHECK-CVT: xtn
303+
; CHECK-CVT: ret
310304

311305
; CHECK-FP16-LABEL: test_fcmp_une:
312306
; CHECK-FP16-NOT: fcvt
@@ -325,22 +319,14 @@ define <4 x i1> @test_fcmp_une(<4 x half> %a, <4 x half> %b) #0 {
325319

326320
define <4 x i1> @test_fcmp_ueq(<4 x half> %a, <4 x half> %b) #0 {
327321
; CHECK-CVT-LABEL: test_fcmp_ueq:
328-
; CHECK-CVT-DAG: fcvt
329-
; CHECK-CVT-DAG: fcvt
330-
; CHECK-CVT-DAG: fcvt
331-
; CHECK-CVT-DAG: fcvt
332-
; CHECK-CVT-DAG: fcvt
333-
; CHECK-CVT-DAG: fcvt
334-
; CHECK-CVT-DAG: fcvt
335-
; CHECK-CVT-DAG: fcvt
336-
; CHECK-CVT-DAG: csetm [[REG1:w[0-9]+]], eq
337-
; CHECK-CVT-DAG: csetm [[REG2:w[0-9]+]], eq
338-
; CHECK-CVT-DAG: csetm [[REG3:w[0-9]+]], eq
339-
; CHECK-CVT-DAG: csetm [[REG4:w[0-9]+]], eq
340-
; CHECK-CVT-DAG: csinv {{.*}}, [[REG1]], wzr, vc
341-
; CHECK-CVT-DAG: csinv {{.*}}, [[REG2]], wzr, vc
342-
; CHECK-CVT-DAG: csinv {{.*}}, [[REG3]], wzr, vc
343-
; CHECK-CVT-DAG: csinv {{.*}}, [[REG4]], wzr, vc
322+
; CHECK-CVT: fcvtl
323+
; CHECK-CVT: fcvtl
324+
; CHECK-CVT: fcmgt
325+
; CHECK-CVT: fcmgt
326+
; CHECK-CVT: orr
327+
; CHECK-CVT: xtn
328+
; CHECK-CVT: mvn
329+
; CHECK-CVT: ret
344330

345331
; CHECK-FP16-LABEL: test_fcmp_ueq:
346332
; CHECK-FP16-NOT: fcvt
@@ -359,18 +345,12 @@ define <4 x i1> @test_fcmp_ueq(<4 x half> %a, <4 x half> %b) #0 {
359345

360346
define <4 x i1> @test_fcmp_ugt(<4 x half> %a, <4 x half> %b) #0 {
361347
; CHECK-CVT-LABEL: test_fcmp_ugt:
362-
; CHECK-CVT-DAG: fcvt
363-
; CHECK-CVT-DAG: fcvt
364-
; CHECK-CVT-DAG: fcvt
365-
; CHECK-CVT-DAG: fcvt
366-
; CHECK-CVT-DAG: fcvt
367-
; CHECK-CVT-DAG: fcvt
368-
; CHECK-CVT-DAG: fcvt
369-
; CHECK-CVT-DAG: fcvt
370-
; CHECK-CVT-DAG: csetm {{.*}}, hi
371-
; CHECK-CVT-DAG: csetm {{.*}}, hi
372-
; CHECK-CVT-DAG: csetm {{.*}}, hi
373-
; CHECK-CVT-DAG: csetm {{.*}}, hi
348+
; CHECK-CVT: fcvtl
349+
; CHECK-CVT: fcvtl
350+
; CHECK-CVT: fcmge
351+
; CHECK-CVT: xtn
352+
; CHECK-CVT: mvn
353+
; CHECK-CVT: ret
374354

375355
; CHECK-FP16-LABEL: test_fcmp_ugt:
376356
; CHECK-FP16-NOT: fcvt
@@ -389,18 +369,12 @@ define <4 x i1> @test_fcmp_ugt(<4 x half> %a, <4 x half> %b) #0 {
389369

390370
define <4 x i1> @test_fcmp_uge(<4 x half> %a, <4 x half> %b) #0 {
391371
; CHECK-CVT-LABEL: test_fcmp_uge:
392-
; CHECK-CVT-DAG: fcvt
393-
; CHECK-CVT-DAG: fcvt
394-
; CHECK-CVT-DAG: fcvt
395-
; CHECK-CVT-DAG: fcvt
396-
; CHECK-CVT-DAG: fcvt
397-
; CHECK-CVT-DAG: fcvt
398-
; CHECK-CVT-DAG: fcvt
399-
; CHECK-CVT-DAG: fcvt
400-
; CHECK-CVT-DAG: csetm {{.*}}, pl
401-
; CHECK-CVT-DAG: csetm {{.*}}, pl
402-
; CHECK-CVT-DAG: csetm {{.*}}, pl
403-
; CHECK-CVT-DAG: csetm {{.*}}, pl
372+
; CHECK-CVT: fcvtl
373+
; CHECK-CVT: fcvtl
374+
; CHECK-CVT: fcmgt
375+
; CHECK-CVT: xtn
376+
; CHECK-CVT: mvn
377+
; CHECK-CVT: ret
404378

405379
; CHECK-FP16-LABEL: test_fcmp_uge:
406380
; CHECK-FP16-NOT: fcvt
@@ -419,18 +393,12 @@ define <4 x i1> @test_fcmp_uge(<4 x half> %a, <4 x half> %b) #0 {
419393

420394
define <4 x i1> @test_fcmp_ult(<4 x half> %a, <4 x half> %b) #0 {
421395
; CHECK-CVT-LABEL: test_fcmp_ult:
422-
; CHECK-CVT-DAG: fcvt
423-
; CHECK-CVT-DAG: fcvt
424-
; CHECK-CVT-DAG: fcvt
425-
; CHECK-CVT-DAG: fcvt
426-
; CHECK-CVT-DAG: fcvt
427-
; CHECK-CVT-DAG: fcvt
428-
; CHECK-CVT-DAG: fcvt
429-
; CHECK-CVT-DAG: fcvt
430-
; CHECK-CVT-DAG: csetm {{.*}}, lt
431-
; CHECK-CVT-DAG: csetm {{.*}}, lt
432-
; CHECK-CVT-DAG: csetm {{.*}}, lt
433-
; CHECK-CVT-DAG: csetm {{.*}}, lt
396+
; CHECK-CVT: fcvtl
397+
; CHECK-CVT: fcvtl
398+
; CHECK-CVT: fcmge
399+
; CHECK-CVT: xtn
400+
; CHECK-CVT: mvn
401+
; CHECK-CVT: ret
434402

435403
; CHECK-FP16-LABEL: test_fcmp_ult:
436404
; CHECK-FP16-NOT: fcvt
@@ -449,18 +417,12 @@ define <4 x i1> @test_fcmp_ult(<4 x half> %a, <4 x half> %b) #0 {
449417

450418
define <4 x i1> @test_fcmp_ule(<4 x half> %a, <4 x half> %b) #0 {
451419
; CHECK-CVT-LABEL: test_fcmp_ule:
452-
; CHECK-CVT-DAG: fcvt
453-
; CHECK-CVT-DAG: fcvt
454-
; CHECK-CVT-DAG: fcvt
455-
; CHECK-CVT-DAG: fcvt
456-
; CHECK-CVT-DAG: fcvt
457-
; CHECK-CVT-DAG: fcvt
458-
; CHECK-CVT-DAG: fcvt
459-
; CHECK-CVT-DAG: fcvt
460-
; CHECK-CVT-DAG: csetm {{.*}}, le
461-
; CHECK-CVT-DAG: csetm {{.*}}, le
462-
; CHECK-CVT-DAG: csetm {{.*}}, le
463-
; CHECK-CVT-DAG: csetm {{.*}}, le
420+
; CHECK-CVT: fcvtl
421+
; CHECK-CVT: fcvtl
422+
; CHECK-CVT: fcmgt
423+
; CHECK-CVT: xtn
424+
; CHECK-CVT: mvn
425+
; CHECK-CVT: ret
464426

465427
; CHECK-FP16-LABEL: test_fcmp_ule:
466428
; CHECK-FP16-NOT: fcvt
@@ -479,18 +441,14 @@ define <4 x i1> @test_fcmp_ule(<4 x half> %a, <4 x half> %b) #0 {
479441

480442
define <4 x i1> @test_fcmp_uno(<4 x half> %a, <4 x half> %b) #0 {
481443
; CHECK-CVT-LABEL: test_fcmp_uno:
482-
; CHECK-CVT-DAG: fcvt
483-
; CHECK-CVT-DAG: fcvt
484-
; CHECK-CVT-DAG: fcvt
485-
; CHECK-CVT-DAG: fcvt
486-
; CHECK-CVT-DAG: fcvt
487-
; CHECK-CVT-DAG: fcvt
488-
; CHECK-CVT-DAG: fcvt
489-
; CHECK-CVT-DAG: fcvt
490-
; CHECK-CVT-DAG: csetm {{.*}}, vs
491-
; CHECK-CVT-DAG: csetm {{.*}}, vs
492-
; CHECK-CVT-DAG: csetm {{.*}}, vs
493-
; CHECK-CVT-DAG: csetm {{.*}}, vs
444+
; CHECK-CVT: fcvtl
445+
; CHECK-CVT: fcvtl
446+
; CHECK-CVT: fcmge
447+
; CHECK-CVT: fcmgt
448+
; CHECK-CVT: orr
449+
; CHECK-CVT: xtn
450+
; CHECK-CVT: mvn
451+
; CHECK-CVT: ret
494452

495453
; CHECK-FP16-LABEL: test_fcmp_uno:
496454
; CHECK-FP16-NOT: fcvt
@@ -509,22 +467,13 @@ define <4 x i1> @test_fcmp_uno(<4 x half> %a, <4 x half> %b) #0 {
509467

510468
define <4 x i1> @test_fcmp_one(<4 x half> %a, <4 x half> %b) #0 {
511469
; CHECK-CVT-LABEL: test_fcmp_one:
512-
; CHECK-CVT-DAG: fcvt
513-
; CHECK-CVT-DAG: fcvt
514-
; CHECK-CVT-DAG: fcvt
515-
; CHECK-CVT-DAG: fcvt
516-
; CHECK-CVT-DAG: fcvt
517-
; CHECK-CVT-DAG: fcvt
518-
; CHECK-CVT-DAG: fcvt
519-
; CHECK-CVT-DAG: fcvt
520-
; CHECK-CVT-DAG: csetm [[REG1:w[0-9]+]], mi
521-
; CHECK-CVT-DAG: csetm [[REG2:w[0-9]+]], mi
522-
; CHECK-CVT-DAG: csetm [[REG3:w[0-9]+]], mi
523-
; CHECK-CVT-DAG: csetm [[REG4:w[0-9]+]], mi
524-
; CHECK-CVT-DAG: csinv {{.*}}, [[REG1]], wzr, le
525-
; CHECK-CVT-DAG: csinv {{.*}}, [[REG2]], wzr, le
526-
; CHECK-CVT-DAG: csinv {{.*}}, [[REG3]], wzr, le
527-
; CHECK-CVT-DAG: csinv {{.*}}, [[REG4]], wzr, le
470+
; CHECK-CVT: fcvtl
471+
; CHECK-CVT: fcvtl
472+
; CHECK-CVT: fcmgt
473+
; CHECK-CVT: fcmgt
474+
; CHECK-CVT: orr
475+
; CHECK-CVT: xtn
476+
; CHECK-CVT: ret
528477

529478
; CHECK-FP16-LABEL: test_fcmp_one:
530479
; CHECK-FP16-NOT: fcvt
@@ -543,18 +492,11 @@ define <4 x i1> @test_fcmp_one(<4 x half> %a, <4 x half> %b) #0 {
543492

544493
define <4 x i1> @test_fcmp_oeq(<4 x half> %a, <4 x half> %b) #0 {
545494
; CHECK-CVT-LABEL: test_fcmp_oeq:
546-
; CHECK-CVT-DAG: fcvt
547-
; CHECK-CVT-DAG: fcvt
548-
; CHECK-CVT-DAG: fcvt
549-
; CHECK-CVT-DAG: fcvt
550-
; CHECK-CVT-DAG: fcvt
551-
; CHECK-CVT-DAG: fcvt
552-
; CHECK-CVT-DAG: fcvt
553-
; CHECK-CVT-DAG: fcvt
554-
; CHECK-CVT-DAG: csetm {{.*}}, eq
555-
; CHECK-CVT-DAG: csetm {{.*}}, eq
556-
; CHECK-CVT-DAG: csetm {{.*}}, eq
557-
; CHECK-CVT-DAG: csetm {{.*}}, eq
495+
; CHECK-CVT: fcvtl
496+
; CHECK-CVT: fcvtl
497+
; CHECK-CVT: fcmeq
498+
; CHECK-CVT: xtn
499+
; CHECK-CVT: ret
558500

559501
; CHECK-FP16-LABEL: test_fcmp_oeq:
560502
; CHECK-FP16-NOT: fcvt
@@ -573,18 +515,11 @@ define <4 x i1> @test_fcmp_oeq(<4 x half> %a, <4 x half> %b) #0 {
573515

574516
define <4 x i1> @test_fcmp_ogt(<4 x half> %a, <4 x half> %b) #0 {
575517
; CHECK-CVT-LABEL: test_fcmp_ogt:
576-
; CHECK-CVT-DAG: fcvt
577-
; CHECK-CVT-DAG: fcvt
578-
; CHECK-CVT-DAG: fcvt
579-
; CHECK-CVT-DAG: fcvt
580-
; CHECK-CVT-DAG: fcvt
581-
; CHECK-CVT-DAG: fcvt
582-
; CHECK-CVT-DAG: fcvt
583-
; CHECK-CVT-DAG: fcvt
584-
; CHECK-CVT-DAG: csetm {{.*}}, gt
585-
; CHECK-CVT-DAG: csetm {{.*}}, gt
586-
; CHECK-CVT-DAG: csetm {{.*}}, gt
587-
; CHECK-CVT-DAG: csetm {{.*}}, gt
518+
; CHECK-CVT: fcvtl
519+
; CHECK-CVT: fcvtl
520+
; CHECK-CVT: fcmgt
521+
; CHECK-CVT: xtn
522+
; CHECK-CVT: ret
588523

589524
; CHECK-FP16-LABEL: test_fcmp_ogt:
590525
; CHECK-FP16-NOT: fcvt
@@ -603,18 +538,11 @@ define <4 x i1> @test_fcmp_ogt(<4 x half> %a, <4 x half> %b) #0 {
603538

604539
define <4 x i1> @test_fcmp_oge(<4 x half> %a, <4 x half> %b) #0 {
605540
; CHECK-CVT-LABEL: test_fcmp_oge:
606-
; CHECK-CVT-DAG: fcvt
607-
; CHECK-CVT-DAG: fcvt
608-
; CHECK-CVT-DAG: fcvt
609-
; CHECK-CVT-DAG: fcvt
610-
; CHECK-CVT-DAG: fcvt
611-
; CHECK-CVT-DAG: fcvt
612-
; CHECK-CVT-DAG: fcvt
613-
; CHECK-CVT-DAG: fcvt
614-
; CHECK-CVT-DAG: csetm {{.*}}, ge
615-
; CHECK-CVT-DAG: csetm {{.*}}, ge
616-
; CHECK-CVT-DAG: csetm {{.*}}, ge
617-
; CHECK-CVT-DAG: csetm {{.*}}, ge
541+
; CHECK-CVT: fcvtl
542+
; CHECK-CVT: fcvtl
543+
; CHECK-CVT: fcmge
544+
; CHECK-CVT: xtn
545+
; CHECK-CVT: ret
618546

619547
; CHECK-FP16-LABEL: test_fcmp_oge:
620548
; CHECK-FP16-NOT: fcvt
@@ -633,18 +561,11 @@ define <4 x i1> @test_fcmp_oge(<4 x half> %a, <4 x half> %b) #0 {
633561

634562
define <4 x i1> @test_fcmp_olt(<4 x half> %a, <4 x half> %b) #0 {
635563
; CHECK-CVT-LABEL: test_fcmp_olt:
636-
; CHECK-CVT-DAG: fcvt
637-
; CHECK-CVT-DAG: fcvt
638-
; CHECK-CVT-DAG: fcvt
639-
; CHECK-CVT-DAG: fcvt
640-
; CHECK-CVT-DAG: fcvt
641-
; CHECK-CVT-DAG: fcvt
642-
; CHECK-CVT-DAG: fcvt
643-
; CHECK-CVT-DAG: fcvt
644-
; CHECK-CVT-DAG: csetm {{.*}}, mi
645-
; CHECK-CVT-DAG: csetm {{.*}}, mi
646-
; CHECK-CVT-DAG: csetm {{.*}}, mi
647-
; CHECK-CVT-DAG: csetm {{.*}}, mi
564+
; CHECK-CVT: fcvtl
565+
; CHECK-CVT: fcvtl
566+
; CHECK-CVT: fcmgt
567+
; CHECK-CVT: xtn
568+
; CHECK-CVT: ret
648569

649570
; CHECK-FP16-LABEL: test_fcmp_olt:
650571
; CHECK-FP16-NOT: fcvt
@@ -663,18 +584,11 @@ define <4 x i1> @test_fcmp_olt(<4 x half> %a, <4 x half> %b) #0 {
663584

664585
define <4 x i1> @test_fcmp_ole(<4 x half> %a, <4 x half> %b) #0 {
665586
; CHECK-CVT-LABEL: test_fcmp_ole:
666-
; CHECK-CVT-DAG: fcvt
667-
; CHECK-CVT-DAG: fcvt
668-
; CHECK-CVT-DAG: fcvt
669-
; CHECK-CVT-DAG: fcvt
670-
; CHECK-CVT-DAG: fcvt
671-
; CHECK-CVT-DAG: fcvt
672-
; CHECK-CVT-DAG: fcvt
673-
; CHECK-CVT-DAG: fcvt
674-
; CHECK-CVT-DAG: csetm {{.*}}, ls
675-
; CHECK-CVT-DAG: csetm {{.*}}, ls
676-
; CHECK-CVT-DAG: csetm {{.*}}, ls
677-
; CHECK-CVT-DAG: csetm {{.*}}, ls
587+
; CHECK-CVT: fcvtl
588+
; CHECK-CVT: fcvtl
589+
; CHECK-CVT: fcmge
590+
; CHECK-CVT: xtn
591+
; CHECK-CVT: ret
678592

679593
; CHECK-FP16-LABEL: test_fcmp_ole:
680594
; CHECK-FP16-NOT: fcvt
@@ -693,18 +607,13 @@ define <4 x i1> @test_fcmp_ole(<4 x half> %a, <4 x half> %b) #0 {
693607

694608
define <4 x i1> @test_fcmp_ord(<4 x half> %a, <4 x half> %b) #0 {
695609
; CHECK-CVT-LABEL: test_fcmp_ord:
696-
; CHECK-CVT-DAG: fcvt
697-
; CHECK-CVT-DAG: fcvt
698-
; CHECK-CVT-DAG: fcvt
699-
; CHECK-CVT-DAG: fcvt
700-
; CHECK-CVT-DAG: fcvt
701-
; CHECK-CVT-DAG: fcvt
702-
; CHECK-CVT-DAG: fcvt
703-
; CHECK-CVT-DAG: fcvt
704-
; CHECK-CVT-DAG: csetm {{.*}}, vc
705-
; CHECK-CVT-DAG: csetm {{.*}}, vc
706-
; CHECK-CVT-DAG: csetm {{.*}}, vc
707-
; CHECK-CVT-DAG: csetm {{.*}}, vc
610+
; CHECK-CVT: fcvtl
611+
; CHECK-CVT: fcvtl
612+
; CHECK-CVT: fcmge
613+
; CHECK-CVT: fcmgt
614+
; CHECK-CVT: orr
615+
; CHECK-CVT: xtn
616+
; CHECK-CVT: ret
708617

709618
; CHECK-FP16-LABEL: test_fcmp_ord:
710619
; CHECK-FP16-NOT: fcvt

0 commit comments

Comments
 (0)