10
10
//
11
11
//===----------------------------------------------------------------------===//
12
12
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
+
14
24
def SDT_VMOVDRR : SDTypeProfile<1, 2, [SDTCisVT<0, f64>, SDTCisVT<1, i32>,
15
25
SDTCisSameAs<1, 2>]>;
16
26
def SDT_VMOVRRD : SDTypeProfile<2, 1, [SDTCisVT<0, i32>, SDTCisSameAs<0, 1>,
17
27
SDTCisVT<2, f64>]>;
18
28
19
29
def SDT_VMOVSR : SDTypeProfile<1, 1, [SDTCisVT<0, f32>, SDTCisVT<1, i32>]>;
20
30
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
+
26
43
def arm_fmdrr : SDNode<"ARMISD::VMOVDRR", SDT_VMOVDRR>;
27
44
def arm_fmrrd : SDNode<"ARMISD::VMOVRRD", SDT_VMOVRRD>;
28
45
def arm_vmovsr : SDNode<"ARMISD::VMOVSR", SDT_VMOVSR>;
@@ -606,12 +623,12 @@ let Defs = [FPSCR_NZCV] in {
606
623
def VCMPED : ADuI<0b11101, 0b11, 0b0100, 0b11, 0,
607
624
(outs), (ins DPR:$Dd, DPR:$Dm),
608
625
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) ))]>;
610
627
611
628
def VCMPES : ASuI<0b11101, 0b11, 0b0100, 0b11, 0,
612
629
(outs), (ins SPR:$Sd, SPR:$Sm),
613
630
IIC_fpCMP32, "vcmpe", ".f32\t$Sd, $Sm", "",
614
- [(arm_cmpfpe SPR:$Sd, SPR:$Sm)]> {
631
+ [(set FPSCR_NZCV, ( arm_cmpfpe SPR:$Sd, SPR:$Sm) )]> {
615
632
// Some single precision VFP instructions may be executed on both NEON and
616
633
// VFP pipelines on A8.
617
634
let D = VFPNeonA8Domain;
@@ -620,17 +637,17 @@ def VCMPES : ASuI<0b11101, 0b11, 0b0100, 0b11, 0,
620
637
def VCMPEH : AHuI<0b11101, 0b11, 0b0100, 0b11, 0,
621
638
(outs), (ins HPR:$Sd, HPR:$Sm),
622
639
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) ))]>;
624
641
625
642
def VCMPD : ADuI<0b11101, 0b11, 0b0100, 0b01, 0,
626
643
(outs), (ins DPR:$Dd, DPR:$Dm),
627
644
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) ))]>;
629
646
630
647
def VCMPS : ASuI<0b11101, 0b11, 0b0100, 0b01, 0,
631
648
(outs), (ins SPR:$Sd, SPR:$Sm),
632
649
IIC_fpCMP32, "vcmp", ".f32\t$Sd, $Sm", "",
633
- [(arm_cmpfp SPR:$Sd, SPR:$Sm)]> {
650
+ [(set FPSCR_NZCV, ( arm_cmpfp SPR:$Sd, SPR:$Sm) )]> {
634
651
// Some single precision VFP instructions may be executed on both NEON and
635
652
// VFP pipelines on A8.
636
653
let D = VFPNeonA8Domain;
@@ -639,7 +656,7 @@ def VCMPS : ASuI<0b11101, 0b11, 0b0100, 0b01, 0,
639
656
def VCMPH : AHuI<0b11101, 0b11, 0b0100, 0b01, 0,
640
657
(outs), (ins HPR:$Sd, HPR:$Sm),
641
658
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) ))]>;
643
660
} // Defs = [FPSCR_NZCV]
644
661
645
662
//===----------------------------------------------------------------------===//
@@ -669,15 +686,15 @@ let Defs = [FPSCR_NZCV] in {
669
686
def VCMPEZD : ADuI<0b11101, 0b11, 0b0101, 0b11, 0,
670
687
(outs), (ins DPR:$Dd),
671
688
IIC_fpCMP64, "vcmpe", ".f64\t$Dd, #0", "",
672
- [(arm_cmpfpe0 (f64 DPR:$Dd))]> {
689
+ [(set FPSCR_NZCV, ( arm_cmpfpe0 (f64 DPR:$Dd) ))]> {
673
690
let Inst{3-0} = 0b0000;
674
691
let Inst{5} = 0;
675
692
}
676
693
677
694
def VCMPEZS : ASuI<0b11101, 0b11, 0b0101, 0b11, 0,
678
695
(outs), (ins SPR:$Sd),
679
696
IIC_fpCMP32, "vcmpe", ".f32\t$Sd, #0", "",
680
- [(arm_cmpfpe0 SPR:$Sd)]> {
697
+ [(set FPSCR_NZCV, ( arm_cmpfpe0 SPR:$Sd) )]> {
681
698
let Inst{3-0} = 0b0000;
682
699
let Inst{5} = 0;
683
700
@@ -689,23 +706,23 @@ def VCMPEZS : ASuI<0b11101, 0b11, 0b0101, 0b11, 0,
689
706
def VCMPEZH : AHuI<0b11101, 0b11, 0b0101, 0b11, 0,
690
707
(outs), (ins HPR:$Sd),
691
708
IIC_fpCMP16, "vcmpe", ".f16\t$Sd, #0",
692
- [(arm_cmpfpe0 (f16 HPR:$Sd))]> {
709
+ [(set FPSCR_NZCV, ( arm_cmpfpe0 (f16 HPR:$Sd) ))]> {
693
710
let Inst{3-0} = 0b0000;
694
711
let Inst{5} = 0;
695
712
}
696
713
697
714
def VCMPZD : ADuI<0b11101, 0b11, 0b0101, 0b01, 0,
698
715
(outs), (ins DPR:$Dd),
699
716
IIC_fpCMP64, "vcmp", ".f64\t$Dd, #0", "",
700
- [(arm_cmpfp0 (f64 DPR:$Dd))]> {
717
+ [(set FPSCR_NZCV, ( arm_cmpfp0 (f64 DPR:$Dd) ))]> {
701
718
let Inst{3-0} = 0b0000;
702
719
let Inst{5} = 0;
703
720
}
704
721
705
722
def VCMPZS : ASuI<0b11101, 0b11, 0b0101, 0b01, 0,
706
723
(outs), (ins SPR:$Sd),
707
724
IIC_fpCMP32, "vcmp", ".f32\t$Sd, #0", "",
708
- [(arm_cmpfp0 SPR:$Sd)]> {
725
+ [(set FPSCR_NZCV, ( arm_cmpfp0 SPR:$Sd) )]> {
709
726
let Inst{3-0} = 0b0000;
710
727
let Inst{5} = 0;
711
728
@@ -717,7 +734,7 @@ def VCMPZS : ASuI<0b11101, 0b11, 0b0101, 0b01, 0,
717
734
def VCMPZH : AHuI<0b11101, 0b11, 0b0101, 0b01, 0,
718
735
(outs), (ins HPR:$Sd),
719
736
IIC_fpCMP16, "vcmp", ".f16\t$Sd, #0",
720
- [(arm_cmpfp0 (f16 HPR:$Sd))]> {
737
+ [(set FPSCR_NZCV, ( arm_cmpfp0 (f16 HPR:$Sd) ))]> {
721
738
let Inst{3-0} = 0b0000;
722
739
let Inst{5} = 0;
723
740
}
@@ -2492,7 +2509,8 @@ let DecoderMethod = "DecodeForVMRSandVMSR" in {
2492
2509
let Defs = [CPSR], Uses = [FPSCR_NZCV], Predicates = [HasFPRegs],
2493
2510
Rt = 0b1111 /* apsr_nzcv */ in
2494
2511
def FMSTAT : MovFromVFP<0b0001 /* fpscr */, (outs), (ins),
2495
- "vmrs", "\tAPSR_nzcv, fpscr", [(arm_fmstat)]>;
2512
+ "vmrs", "\tAPSR_nzcv, fpscr",
2513
+ [(arm_fmstat FPSCR_NZCV)]>;
2496
2514
2497
2515
// Application level FPSCR -> GPR
2498
2516
let hasSideEffects = 1, Uses = [FPSCR], Predicates = [HasFPRegs] in
0 commit comments