Skip to content

Commit f3e16cc

Browse files
committed
Add llvm intrinsic tests
1 parent 3e3fd82 commit f3e16cc

File tree

5 files changed

+291
-143
lines changed

5 files changed

+291
-143
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8572,15 +8572,14 @@ SDValue TargetLowering::expandFMINIMUM_FMAXIMUM(SDNode *N,
85728572
unsigned CompOpcIeee = IsMax ? ISD::FMAXNUM_IEEE : ISD::FMINNUM_IEEE;
85738573
unsigned CompOpc = IsMax ? ISD::FMAXNUM : ISD::FMINNUM;
85748574

8575-
// FIXME: We should probably define fminnum/fmaxnum variants with correct
8576-
// signed zero behavior.
85778575
bool MinMaxMustRespectOrderedZero = false;
85788576

85798577
if (isOperationLegalOrCustom(CompOpcIeee, VT)) {
85808578
MinMax = DAG.getNode(CompOpcIeee, DL, VT, LHS, RHS, Flags);
85818579
MinMaxMustRespectOrderedZero = true;
85828580
} else if (isOperationLegalOrCustom(CompOpc, VT)) {
85838581
MinMax = DAG.getNode(CompOpc, DL, VT, LHS, RHS, Flags);
8582+
MinMaxMustRespectOrderedZero = true;
85848583
} else {
85858584
if (VT.isVector() && !isOperationLegalOrCustom(ISD::VSELECT, VT))
85868585
return DAG.UnrollVectorOp(N);

llvm/lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -773,14 +773,12 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
773773
setOperationAction(ISD::FSHR, MVT::i32, Custom);
774774

775775
if (Subtarget.hasVSX()) {
776-
setOperationAction(ISD::FMAXNUM_IEEE, MVT::f64, Legal);
777-
setOperationAction(ISD::FMAXNUM_IEEE, MVT::f32, Legal);
778-
setOperationAction(ISD::FMINNUM_IEEE, MVT::f64, Legal);
779-
setOperationAction(ISD::FMINNUM_IEEE, MVT::f32, Legal);
780776
setOperationAction(ISD::FMAXNUM, MVT::f64, Legal);
781777
setOperationAction(ISD::FMAXNUM, MVT::f32, Legal);
782778
setOperationAction(ISD::FMINNUM, MVT::f64, Legal);
783779
setOperationAction(ISD::FMINNUM, MVT::f32, Legal);
780+
setOperationAction(ISD::FCANONICALIZE, MVT::f64, Legal);
781+
setOperationAction(ISD::FCANONICALIZE, MVT::f32, Legal);
784782
}
785783

786784
if (Subtarget.hasAltivec()) {
@@ -815,6 +813,7 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
815813
if (Subtarget.hasVSX()) {
816814
setOperationAction(ISD::FMAXNUM, VT, Legal);
817815
setOperationAction(ISD::FMINNUM, VT, Legal);
816+
setOperationAction(ISD::FCANONICALIZE, VT, Legal);
818817
}
819818

820819
// Vector instructions introduced in P8

llvm/lib/Target/PowerPC/PPCInstrVSX.td

Lines changed: 12 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1822,6 +1822,9 @@ def FpMinMax {
18221822
dag F32Max = (COPY_TO_REGCLASS (XSMAXDP (COPY_TO_REGCLASS $A, VSFRC),
18231823
(COPY_TO_REGCLASS $B, VSFRC)),
18241824
VSSRC);
1825+
dag F32Can = (COPY_TO_REGCLASS (XSMAXDP (COPY_TO_REGCLASS $A, VSFRC),
1826+
(COPY_TO_REGCLASS $A, VSFRC)),
1827+
VSSRC);
18251828
}
18261829

18271830
def ScalarLoads {
@@ -2715,10 +2718,14 @@ def : Pat<(v4f32 (any_fmaxnum v4f32:$src1, v4f32:$src2)),
27152718
(v4f32 (XVMAXSP $src1, $src2))>;
27162719
def : Pat<(v4f32 (any_fminnum v4f32:$src1, v4f32:$src2)),
27172720
(v4f32 (XVMINSP $src1, $src2))>;
2721+
def : Pat<(v4f32 (fcanonicalize v4f32:$src1)),
2722+
(v4f32 (XVMAXSP $src1, $src1))>;
27182723
def : Pat<(v2f64 (any_fmaxnum v2f64:$src1, v2f64:$src2)),
27192724
(v2f64 (XVMAXDP $src1, $src2))>;
27202725
def : Pat<(v2f64 (any_fminnum v2f64:$src1, v2f64:$src2)),
27212726
(v2f64 (XVMINDP $src1, $src2))>;
2727+
def : Pat<(v2f64 (fcanonicalize v2f64:$src1)),
2728+
(v2f64 (XVMAXDP $src1, $src1))>;
27222729

27232730
// f32 abs
27242731
def : Pat<(f32 (fabs f32:$S)),
@@ -2730,51 +2737,19 @@ def : Pat<(f32 (fneg (fabs f32:$S))),
27302737
(f32 (COPY_TO_REGCLASS (XSNABSDP
27312738
(COPY_TO_REGCLASS $S, VSFRC)), VSSRC))>;
27322739

2733-
// f32 Min.
2740+
// Max and Min
27342741
def : Pat<(f32 (fminnum f32:$A, f32:$B)),
27352742
(f32 FpMinMax.F32Min)>;
2736-
def : Pat<(f32 (fminnum_ieee f32:$A, f32:$B)),
2737-
(f32 FpMinMax.F32Min)>;
2738-
def : Pat<(f32 (fminnum_ieee (fcanonicalize f32:$A), f32:$B)),
2739-
(f32 FpMinMax.F32Min)>;
2740-
def : Pat<(f32 (fminnum_ieee f32:$A, (fcanonicalize f32:$B))),
2741-
(f32 FpMinMax.F32Min)>;
2742-
def : Pat<(f32 (fminnum_ieee (fcanonicalize f32:$A), (fcanonicalize f32:$B))),
2743-
(f32 FpMinMax.F32Min)>;
2744-
// F32 Max.
2745-
def : Pat<(f32 (fmaxnum_ieee f32:$A, f32:$B)),
2746-
(f32 FpMinMax.F32Max)>;
27472743
def : Pat<(f32 (fmaxnum f32:$A, f32:$B)),
27482744
(f32 FpMinMax.F32Max)>;
2749-
def : Pat<(f32 (fmaxnum_ieee (fcanonicalize f32:$A), f32:$B)),
2750-
(f32 FpMinMax.F32Max)>;
2751-
def : Pat<(f32 (fmaxnum_ieee f32:$A, (fcanonicalize f32:$B))),
2752-
(f32 FpMinMax.F32Max)>;
2753-
def : Pat<(f32 (fmaxnum_ieee (fcanonicalize f32:$A), (fcanonicalize f32:$B))),
2754-
(f32 FpMinMax.F32Max)>;
2755-
2756-
// f64 Min.
2745+
def : Pat<(f32 (fcanonicalize f32:$A)),
2746+
(f32 FpMinMax.F32Can)>;
27572747
def : Pat<(f64 (fminnum f64:$A, f64:$B)),
27582748
(f64 (XSMINDP $A, $B))>;
2759-
def : Pat<(f64 (fminnum_ieee f64:$A, f64:$B)),
2760-
(f64 (XSMINDP $A, $B))>;
2761-
def : Pat<(f64 (fminnum_ieee (fcanonicalize f64:$A), f64:$B)),
2762-
(f64 (XSMINDP $A, $B))>;
2763-
def : Pat<(f64 (fminnum_ieee f64:$A, (fcanonicalize f64:$B))),
2764-
(f64 (XSMINDP $A, $B))>;
2765-
def : Pat<(f64 (fminnum_ieee (fcanonicalize f64:$A), (fcanonicalize f64:$B))),
2766-
(f64 (XSMINDP $A, $B))>;
2767-
// f64 Max.
27682749
def : Pat<(f64 (fmaxnum f64:$A, f64:$B)),
27692750
(f64 (XSMAXDP $A, $B))>;
2770-
def : Pat<(f64 (fmaxnum_ieee f64:$A, f64:$B)),
2771-
(f64 (XSMAXDP $A, $B))>;
2772-
def : Pat<(f64 (fmaxnum_ieee (fcanonicalize f64:$A), f64:$B)),
2773-
(f64 (XSMAXDP $A, $B))>;
2774-
def : Pat<(f64 (fmaxnum_ieee f64:$A, (fcanonicalize f64:$B))),
2775-
(f64 (XSMAXDP $A, $B))>;
2776-
def : Pat<(f64 (fmaxnum_ieee (fcanonicalize f64:$A), (fcanonicalize f64:$B))),
2777-
(f64 (XSMAXDP $A, $B))>;
2751+
def : Pat<(f64 (fcanonicalize f64:$A)),
2752+
(f64 (XSMAXDP $A, $A))>;
27782753

27792754
def : Pat<(int_ppc_vsx_stxvd2x_be v2f64:$rS, ForceXForm:$dst),
27802755
(STXVD2X $rS, ForceXForm:$dst)>;

llvm/test/CodeGen/PowerPC/fminimum-fmaximum.ll

Lines changed: 34 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -301,44 +301,26 @@ define <4 x float> @v4f32_minimum(<4 x float> %a, <4 x float> %b) {
301301
; VSX-NEXT: xvcmpeqsp 1, 35, 35
302302
; VSX-NEXT: xvcmpeqsp 2, 34, 34
303303
; VSX-NEXT: addis 3, 2, .LCPI4_0@toc@ha
304-
; VSX-NEXT: xxleqv 36, 36, 36
305-
; VSX-NEXT: xvminsp 0, 34, 35
306-
; VSX-NEXT: vslw 4, 4, 4
307304
; VSX-NEXT: addi 3, 3, .LCPI4_0@toc@l
308305
; VSX-NEXT: xxlnor 1, 1, 1
309306
; VSX-NEXT: xxlnor 2, 2, 2
310-
; VSX-NEXT: vcmpequw 5, 2, 4
307+
; VSX-NEXT: xvminsp 0, 34, 35
311308
; VSX-NEXT: xxlor 1, 2, 1
312309
; VSX-NEXT: lxvd2x 2, 0, 3
313-
; VSX-NEXT: xxsel 0, 0, 2, 1
314-
; VSX-NEXT: xxlxor 2, 2, 2
315-
; VSX-NEXT: xvcmpeqsp 2, 0, 2
316-
; VSX-NEXT: xxsel 1, 0, 34, 37
317-
; VSX-NEXT: vcmpequw 2, 3, 4
318-
; VSX-NEXT: xxsel 1, 1, 35, 34
319-
; VSX-NEXT: xxsel 34, 0, 1, 2
310+
; VSX-NEXT: xxsel 34, 0, 2, 1
320311
; VSX-NEXT: blr
321312
;
322313
; AIX-LABEL: v4f32_minimum:
323314
; AIX: # %bb.0: # %entry
324315
; AIX-NEXT: xvcmpeqsp 1, 35, 35
325316
; AIX-NEXT: xvcmpeqsp 2, 34, 34
326317
; AIX-NEXT: ld 3, L..C4(2) # %const.0
327-
; AIX-NEXT: xxleqv 36, 36, 36
328318
; AIX-NEXT: xvminsp 0, 34, 35
329-
; AIX-NEXT: vslw 4, 4, 4
330319
; AIX-NEXT: xxlnor 1, 1, 1
331320
; AIX-NEXT: xxlnor 2, 2, 2
332-
; AIX-NEXT: vcmpequw 5, 2, 4
333321
; AIX-NEXT: xxlor 1, 2, 1
334322
; AIX-NEXT: lxvw4x 2, 0, 3
335-
; AIX-NEXT: xxsel 0, 0, 2, 1
336-
; AIX-NEXT: xxlxor 2, 2, 2
337-
; AIX-NEXT: xvcmpeqsp 2, 0, 2
338-
; AIX-NEXT: xxsel 1, 0, 34, 37
339-
; AIX-NEXT: vcmpequw 2, 3, 4
340-
; AIX-NEXT: xxsel 1, 1, 35, 34
341-
; AIX-NEXT: xxsel 34, 0, 1, 2
323+
; AIX-NEXT: xxsel 34, 0, 2, 1
342324
; AIX-NEXT: blr
343325
entry:
344326
%m = call <4 x float> @llvm.minimum.v4f32(<4 x float> %a, <4 x float> %b)
@@ -377,16 +359,9 @@ define <4 x float> @v4f32_maximum(<4 x float> %a, <4 x float> %b) {
377359
; VSX-NEXT: xxlnor 1, 1, 1
378360
; VSX-NEXT: xxlnor 2, 2, 2
379361
; VSX-NEXT: xvmaxsp 0, 34, 35
380-
; VSX-NEXT: xxlxor 36, 36, 36
381-
; VSX-NEXT: vcmpequw 5, 2, 4
382362
; VSX-NEXT: xxlor 1, 2, 1
383363
; VSX-NEXT: lxvd2x 2, 0, 3
384-
; VSX-NEXT: xxsel 0, 0, 2, 1
385-
; VSX-NEXT: xvcmpeqsp 2, 0, 36
386-
; VSX-NEXT: xxsel 1, 0, 34, 37
387-
; VSX-NEXT: vcmpequw 2, 3, 4
388-
; VSX-NEXT: xxsel 1, 1, 35, 34
389-
; VSX-NEXT: xxsel 34, 0, 1, 2
364+
; VSX-NEXT: xxsel 34, 0, 2, 1
390365
; VSX-NEXT: blr
391366
;
392367
; AIX-LABEL: v4f32_maximum:
@@ -395,18 +370,11 @@ define <4 x float> @v4f32_maximum(<4 x float> %a, <4 x float> %b) {
395370
; AIX-NEXT: xvcmpeqsp 2, 34, 34
396371
; AIX-NEXT: ld 3, L..C5(2) # %const.0
397372
; AIX-NEXT: xvmaxsp 0, 34, 35
398-
; AIX-NEXT: xxlxor 36, 36, 36
399373
; AIX-NEXT: xxlnor 1, 1, 1
400374
; AIX-NEXT: xxlnor 2, 2, 2
401-
; AIX-NEXT: vcmpequw 5, 2, 4
402375
; AIX-NEXT: xxlor 1, 2, 1
403376
; AIX-NEXT: lxvw4x 2, 0, 3
404-
; AIX-NEXT: xxsel 0, 0, 2, 1
405-
; AIX-NEXT: xvcmpeqsp 2, 0, 36
406-
; AIX-NEXT: xxsel 1, 0, 34, 37
407-
; AIX-NEXT: vcmpequw 2, 3, 4
408-
; AIX-NEXT: xxsel 1, 1, 35, 34
409-
; AIX-NEXT: xxsel 34, 0, 1, 2
377+
; AIX-NEXT: xxsel 34, 0, 2, 1
410378
; AIX-NEXT: blr
411379
entry:
412380
%m = call <4 x float> @llvm.maximum.v4f32(<4 x float> %a, <4 x float> %b)
@@ -493,47 +461,28 @@ define <2 x double> @v2f64_minimum(<2 x double> %a, <2 x double> %b) {
493461
; VSX-LABEL: v2f64_minimum:
494462
; VSX: # %bb.0: # %entry
495463
; VSX-NEXT: addis 3, 2, .LCPI6_0@toc@ha
496-
; VSX-NEXT: xvcmpeqdp 36, 35, 35
497-
; VSX-NEXT: xvcmpeqdp 37, 34, 34
498-
; VSX-NEXT: addi 3, 3, .LCPI6_0@toc@l
499-
; VSX-NEXT: xxlnor 36, 36, 36
500-
; VSX-NEXT: xxlnor 37, 37, 37
501464
; VSX-NEXT: xvmindp 0, 34, 35
465+
; VSX-NEXT: xvcmpeqdp 35, 35, 35
466+
; VSX-NEXT: addi 3, 3, .LCPI6_0@toc@l
467+
; VSX-NEXT: xvcmpeqdp 34, 34, 34
468+
; VSX-NEXT: xxlnor 35, 35, 35
469+
; VSX-NEXT: xxlnor 34, 34, 34
502470
; VSX-NEXT: lxvd2x 2, 0, 3
503-
; VSX-NEXT: addis 3, 2, .LCPI6_1@toc@ha
504-
; VSX-NEXT: xxlor 1, 37, 36
505-
; VSX-NEXT: addi 3, 3, .LCPI6_1@toc@l
506-
; VSX-NEXT: lxvd2x 36, 0, 3
507-
; VSX-NEXT: vcmpequd 5, 2, 4
508-
; VSX-NEXT: xxsel 0, 0, 2, 1
509-
; VSX-NEXT: xxlxor 2, 2, 2
510-
; VSX-NEXT: xxsel 1, 0, 34, 37
511-
; VSX-NEXT: vcmpequd 2, 3, 4
512-
; VSX-NEXT: xxsel 1, 1, 35, 34
513-
; VSX-NEXT: xvcmpeqdp 34, 0, 2
514-
; VSX-NEXT: xxsel 34, 0, 1, 34
471+
; VSX-NEXT: xxlor 1, 34, 35
472+
; VSX-NEXT: xxsel 34, 0, 2, 1
515473
; VSX-NEXT: blr
516474
;
517475
; AIX-LABEL: v2f64_minimum:
518476
; AIX: # %bb.0: # %entry
519477
; AIX-NEXT: ld 3, L..C6(2) # %const.0
520-
; AIX-NEXT: xvcmpeqdp 36, 35, 35
521-
; AIX-NEXT: xvcmpeqdp 37, 34, 34
522-
; AIX-NEXT: lxvd2x 2, 0, 3
523-
; AIX-NEXT: ld 3, L..C7(2) # %const.1
524-
; AIX-NEXT: xxlnor 36, 36, 36
525-
; AIX-NEXT: xxlnor 37, 37, 37
526478
; AIX-NEXT: xvmindp 0, 34, 35
527-
; AIX-NEXT: xxlor 1, 37, 36
528-
; AIX-NEXT: lxvd2x 36, 0, 3
529-
; AIX-NEXT: vcmpequd 5, 2, 4
530-
; AIX-NEXT: xxsel 0, 0, 2, 1
531-
; AIX-NEXT: xxlxor 2, 2, 2
532-
; AIX-NEXT: xxsel 1, 0, 34, 37
533-
; AIX-NEXT: vcmpequd 2, 3, 4
534-
; AIX-NEXT: xxsel 1, 1, 35, 34
535-
; AIX-NEXT: xvcmpeqdp 34, 0, 2
536-
; AIX-NEXT: xxsel 34, 0, 1, 34
479+
; AIX-NEXT: xvcmpeqdp 35, 35, 35
480+
; AIX-NEXT: lxvd2x 2, 0, 3
481+
; AIX-NEXT: xvcmpeqdp 34, 34, 34
482+
; AIX-NEXT: xxlnor 35, 35, 35
483+
; AIX-NEXT: xxlnor 34, 34, 34
484+
; AIX-NEXT: xxlor 1, 34, 35
485+
; AIX-NEXT: xxsel 34, 0, 2, 1
537486
; AIX-NEXT: blr
538487
entry:
539488
%m = call <2 x double> @llvm.minimum.v2f64(<2 x double> %a, <2 x double> %b)
@@ -618,42 +567,28 @@ define <2 x double> @v2f64_maximum(<2 x double> %a, <2 x double> %b) {
618567
; VSX-LABEL: v2f64_maximum:
619568
; VSX: # %bb.0: # %entry
620569
; VSX-NEXT: addis 3, 2, .LCPI7_0@toc@ha
621-
; VSX-NEXT: xvcmpeqdp 36, 35, 35
622-
; VSX-NEXT: xvcmpeqdp 37, 34, 34
623-
; VSX-NEXT: addi 3, 3, .LCPI7_0@toc@l
624-
; VSX-NEXT: xxlnor 36, 36, 36
625-
; VSX-NEXT: xxlnor 37, 37, 37
626570
; VSX-NEXT: xvmaxdp 0, 34, 35
571+
; VSX-NEXT: xvcmpeqdp 35, 35, 35
572+
; VSX-NEXT: addi 3, 3, .LCPI7_0@toc@l
573+
; VSX-NEXT: xvcmpeqdp 34, 34, 34
574+
; VSX-NEXT: xxlnor 35, 35, 35
575+
; VSX-NEXT: xxlnor 34, 34, 34
627576
; VSX-NEXT: lxvd2x 2, 0, 3
628-
; VSX-NEXT: xxlor 1, 37, 36
629-
; VSX-NEXT: xxlxor 36, 36, 36
630-
; VSX-NEXT: vcmpequd 5, 2, 4
631-
; VSX-NEXT: xxsel 0, 0, 2, 1
632-
; VSX-NEXT: xxsel 1, 0, 34, 37
633-
; VSX-NEXT: vcmpequd 2, 3, 4
634-
; VSX-NEXT: xxsel 1, 1, 35, 34
635-
; VSX-NEXT: xvcmpeqdp 34, 0, 36
636-
; VSX-NEXT: xxsel 34, 0, 1, 34
577+
; VSX-NEXT: xxlor 1, 34, 35
578+
; VSX-NEXT: xxsel 34, 0, 2, 1
637579
; VSX-NEXT: blr
638580
;
639581
; AIX-LABEL: v2f64_maximum:
640582
; AIX: # %bb.0: # %entry
641-
; AIX-NEXT: ld 3, L..C8(2) # %const.0
642-
; AIX-NEXT: xvcmpeqdp 36, 35, 35
643-
; AIX-NEXT: xvcmpeqdp 37, 34, 34
644-
; AIX-NEXT: lxvd2x 2, 0, 3
645-
; AIX-NEXT: xxlnor 36, 36, 36
646-
; AIX-NEXT: xxlnor 37, 37, 37
583+
; AIX-NEXT: ld 3, L..C7(2) # %const.0
647584
; AIX-NEXT: xvmaxdp 0, 34, 35
648-
; AIX-NEXT: xxlor 1, 37, 36
649-
; AIX-NEXT: xxlxor 36, 36, 36
650-
; AIX-NEXT: vcmpequd 5, 2, 4
651-
; AIX-NEXT: xxsel 0, 0, 2, 1
652-
; AIX-NEXT: xxsel 1, 0, 34, 37
653-
; AIX-NEXT: vcmpequd 2, 3, 4
654-
; AIX-NEXT: xxsel 1, 1, 35, 34
655-
; AIX-NEXT: xvcmpeqdp 34, 0, 36
656-
; AIX-NEXT: xxsel 34, 0, 1, 34
585+
; AIX-NEXT: xvcmpeqdp 35, 35, 35
586+
; AIX-NEXT: lxvd2x 2, 0, 3
587+
; AIX-NEXT: xvcmpeqdp 34, 34, 34
588+
; AIX-NEXT: xxlnor 35, 35, 35
589+
; AIX-NEXT: xxlnor 34, 34, 34
590+
; AIX-NEXT: xxlor 1, 34, 35
591+
; AIX-NEXT: xxsel 34, 0, 2, 1
657592
; AIX-NEXT: blr
658593
entry:
659594
%m = call <2 x double> @llvm.maximum.v2f64(<2 x double> %a, <2 x double> %b)

0 commit comments

Comments
 (0)