1010//
1111//===----------------------------------------------------------------------===//
1212
13- def SDT_CMPFP0 : SDTypeProfile<0, 1, [SDTCisFP<0>]>;
13+ def SDT_CMPFP : SDTypeProfile<1, 2, [
14+ SDTCisVT<0, FlagsVT>, // out flags
15+ SDTCisFP<1>, // lhs
16+ SDTCisSameAs<2, 1> // rhs
17+ ]>;
18+
19+ def SDT_CMPFP0 : SDTypeProfile<1, 1, [
20+ SDTCisVT<0, FlagsVT>, // out flags
21+ SDTCisFP<1> // operand
22+ ]>;
23+
1424def SDT_VMOVDRR : SDTypeProfile<1, 2, [SDTCisVT<0, f64>, SDTCisVT<1, i32>,
1525 SDTCisSameAs<1, 2>]>;
1626def SDT_VMOVRRD : SDTypeProfile<2, 1, [SDTCisVT<0, i32>, SDTCisSameAs<0, 1>,
1727 SDTCisVT<2, f64>]>;
1828
1929def SDT_VMOVSR : SDTypeProfile<1, 1, [SDTCisVT<0, f32>, SDTCisVT<1, i32>]>;
2030
21- def arm_fmstat : SDNode<"ARMISD::FMSTAT", SDTNone, [SDNPInGlue, SDNPOutGlue]>;
22- def arm_cmpfp : SDNode<"ARMISD::CMPFP", SDT_ARMCmp, [SDNPOutGlue]>;
23- def arm_cmpfp0 : SDNode<"ARMISD::CMPFPw0", SDT_CMPFP0, [SDNPOutGlue]>;
24- def arm_cmpfpe : SDNode<"ARMISD::CMPFPE", SDT_ARMCmp, [SDNPOutGlue]>;
25- def arm_cmpfpe0: SDNode<"ARMISD::CMPFPEw0",SDT_CMPFP0, [SDNPOutGlue]>;
31+ def arm_cmpfp : SDNode<"ARMISD::CMPFP", SDT_CMPFP>;
32+ def arm_cmpfp0 : SDNode<"ARMISD::CMPFPw0", SDT_CMPFP0>;
33+ def arm_cmpfpe : SDNode<"ARMISD::CMPFPE", SDT_CMPFP>;
34+ def arm_cmpfpe0 : SDNode<"ARMISD::CMPFPEw0", SDT_CMPFP0>;
35+
36+ def arm_fmstat : SDNode<"ARMISD::FMSTAT",
37+ SDTypeProfile<0, 1, [
38+ SDTCisVT<0, FlagsVT> // in flags
39+ ]>,
40+ [SDNPOutGlue] // TODO: Change Glue to a normal result.
41+ >;
42+
2643def arm_fmdrr : SDNode<"ARMISD::VMOVDRR", SDT_VMOVDRR>;
2744def arm_fmrrd : SDNode<"ARMISD::VMOVRRD", SDT_VMOVRRD>;
2845def arm_vmovsr : SDNode<"ARMISD::VMOVSR", SDT_VMOVSR>;
@@ -606,12 +623,12 @@ let Defs = [FPSCR_NZCV] in {
606623def VCMPED : ADuI<0b11101, 0b11, 0b0100, 0b11, 0,
607624 (outs), (ins DPR:$Dd, DPR:$Dm),
608625 IIC_fpCMP64, "vcmpe", ".f64\t$Dd, $Dm", "",
609- [(arm_cmpfpe DPR:$Dd, (f64 DPR:$Dm))]>;
626+ [(set FPSCR_NZCV, ( arm_cmpfpe DPR:$Dd, (f64 DPR:$Dm) ))]>;
610627
611628def VCMPES : ASuI<0b11101, 0b11, 0b0100, 0b11, 0,
612629 (outs), (ins SPR:$Sd, SPR:$Sm),
613630 IIC_fpCMP32, "vcmpe", ".f32\t$Sd, $Sm", "",
614- [(arm_cmpfpe SPR:$Sd, SPR:$Sm)]> {
631+ [(set FPSCR_NZCV, ( arm_cmpfpe SPR:$Sd, SPR:$Sm) )]> {
615632 // Some single precision VFP instructions may be executed on both NEON and
616633 // VFP pipelines on A8.
617634 let D = VFPNeonA8Domain;
@@ -620,17 +637,17 @@ def VCMPES : ASuI<0b11101, 0b11, 0b0100, 0b11, 0,
620637def VCMPEH : AHuI<0b11101, 0b11, 0b0100, 0b11, 0,
621638 (outs), (ins HPR:$Sd, HPR:$Sm),
622639 IIC_fpCMP16, "vcmpe", ".f16\t$Sd, $Sm",
623- [(arm_cmpfpe (f16 HPR:$Sd), (f16 HPR:$Sm))]>;
640+ [(set FPSCR_NZCV, ( arm_cmpfpe (f16 HPR:$Sd), (f16 HPR:$Sm) ))]>;
624641
625642def VCMPD : ADuI<0b11101, 0b11, 0b0100, 0b01, 0,
626643 (outs), (ins DPR:$Dd, DPR:$Dm),
627644 IIC_fpCMP64, "vcmp", ".f64\t$Dd, $Dm", "",
628- [(arm_cmpfp DPR:$Dd, (f64 DPR:$Dm))]>;
645+ [(set FPSCR_NZCV, ( arm_cmpfp DPR:$Dd, (f64 DPR:$Dm) ))]>;
629646
630647def VCMPS : ASuI<0b11101, 0b11, 0b0100, 0b01, 0,
631648 (outs), (ins SPR:$Sd, SPR:$Sm),
632649 IIC_fpCMP32, "vcmp", ".f32\t$Sd, $Sm", "",
633- [(arm_cmpfp SPR:$Sd, SPR:$Sm)]> {
650+ [(set FPSCR_NZCV, ( arm_cmpfp SPR:$Sd, SPR:$Sm) )]> {
634651 // Some single precision VFP instructions may be executed on both NEON and
635652 // VFP pipelines on A8.
636653 let D = VFPNeonA8Domain;
@@ -639,7 +656,7 @@ def VCMPS : ASuI<0b11101, 0b11, 0b0100, 0b01, 0,
639656def VCMPH : AHuI<0b11101, 0b11, 0b0100, 0b01, 0,
640657 (outs), (ins HPR:$Sd, HPR:$Sm),
641658 IIC_fpCMP16, "vcmp", ".f16\t$Sd, $Sm",
642- [(arm_cmpfp (f16 HPR:$Sd), (f16 HPR:$Sm))]>;
659+ [(set FPSCR_NZCV, ( arm_cmpfp (f16 HPR:$Sd), (f16 HPR:$Sm) ))]>;
643660} // Defs = [FPSCR_NZCV]
644661
645662//===----------------------------------------------------------------------===//
@@ -669,15 +686,15 @@ let Defs = [FPSCR_NZCV] in {
669686def VCMPEZD : ADuI<0b11101, 0b11, 0b0101, 0b11, 0,
670687 (outs), (ins DPR:$Dd),
671688 IIC_fpCMP64, "vcmpe", ".f64\t$Dd, #0", "",
672- [(arm_cmpfpe0 (f64 DPR:$Dd))]> {
689+ [(set FPSCR_NZCV, ( arm_cmpfpe0 (f64 DPR:$Dd) ))]> {
673690 let Inst{3-0} = 0b0000;
674691 let Inst{5} = 0;
675692}
676693
677694def VCMPEZS : ASuI<0b11101, 0b11, 0b0101, 0b11, 0,
678695 (outs), (ins SPR:$Sd),
679696 IIC_fpCMP32, "vcmpe", ".f32\t$Sd, #0", "",
680- [(arm_cmpfpe0 SPR:$Sd)]> {
697+ [(set FPSCR_NZCV, ( arm_cmpfpe0 SPR:$Sd) )]> {
681698 let Inst{3-0} = 0b0000;
682699 let Inst{5} = 0;
683700
@@ -689,23 +706,23 @@ def VCMPEZS : ASuI<0b11101, 0b11, 0b0101, 0b11, 0,
689706def VCMPEZH : AHuI<0b11101, 0b11, 0b0101, 0b11, 0,
690707 (outs), (ins HPR:$Sd),
691708 IIC_fpCMP16, "vcmpe", ".f16\t$Sd, #0",
692- [(arm_cmpfpe0 (f16 HPR:$Sd))]> {
709+ [(set FPSCR_NZCV, ( arm_cmpfpe0 (f16 HPR:$Sd) ))]> {
693710 let Inst{3-0} = 0b0000;
694711 let Inst{5} = 0;
695712}
696713
697714def VCMPZD : ADuI<0b11101, 0b11, 0b0101, 0b01, 0,
698715 (outs), (ins DPR:$Dd),
699716 IIC_fpCMP64, "vcmp", ".f64\t$Dd, #0", "",
700- [(arm_cmpfp0 (f64 DPR:$Dd))]> {
717+ [(set FPSCR_NZCV, ( arm_cmpfp0 (f64 DPR:$Dd) ))]> {
701718 let Inst{3-0} = 0b0000;
702719 let Inst{5} = 0;
703720}
704721
705722def VCMPZS : ASuI<0b11101, 0b11, 0b0101, 0b01, 0,
706723 (outs), (ins SPR:$Sd),
707724 IIC_fpCMP32, "vcmp", ".f32\t$Sd, #0", "",
708- [(arm_cmpfp0 SPR:$Sd)]> {
725+ [(set FPSCR_NZCV, ( arm_cmpfp0 SPR:$Sd) )]> {
709726 let Inst{3-0} = 0b0000;
710727 let Inst{5} = 0;
711728
@@ -717,7 +734,7 @@ def VCMPZS : ASuI<0b11101, 0b11, 0b0101, 0b01, 0,
717734def VCMPZH : AHuI<0b11101, 0b11, 0b0101, 0b01, 0,
718735 (outs), (ins HPR:$Sd),
719736 IIC_fpCMP16, "vcmp", ".f16\t$Sd, #0",
720- [(arm_cmpfp0 (f16 HPR:$Sd))]> {
737+ [(set FPSCR_NZCV, ( arm_cmpfp0 (f16 HPR:$Sd) ))]> {
721738 let Inst{3-0} = 0b0000;
722739 let Inst{5} = 0;
723740}
@@ -2492,7 +2509,8 @@ let DecoderMethod = "DecodeForVMRSandVMSR" in {
24922509 let Defs = [CPSR], Uses = [FPSCR_NZCV], Predicates = [HasFPRegs],
24932510 Rt = 0b1111 /* apsr_nzcv */ in
24942511 def FMSTAT : MovFromVFP<0b0001 /* fpscr */, (outs), (ins),
2495- "vmrs", "\tAPSR_nzcv, fpscr", [(arm_fmstat)]>;
2512+ "vmrs", "\tAPSR_nzcv, fpscr",
2513+ [(arm_fmstat FPSCR_NZCV)]>;
24962514
24972515 // Application level FPSCR -> GPR
24982516 let hasSideEffects = 1, Uses = [FPSCR], Predicates = [HasFPRegs] in
0 commit comments