{ X86::UCOM_Fpr32 , X86::UCOM_Fr },
{ X86::UCOM_Fpr64 , X86::UCOM_Fr },
{ X86::UCOM_Fpr80 , X86::UCOM_Fr },
+ { X86::XAM_Fp32 , X86::XAM_F },
+ { X86::XAM_Fp64 , X86::XAM_F },
+ { X86::XAM_Fp80 , X86::XAM_F },
};
static unsigned getConcreteOpcode(unsigned Opcode) {
} // SchedRW
} // Uses = [FPCW], mayRaiseFPException = 1
+let SchedRW = [WriteFTest] in {
+def XAM_Fp32 : FpIf32<(outs), (ins RFP32:$src), OneArgFP, []>;
+def XAM_Fp64 : FpIf64<(outs), (ins RFP64:$src), OneArgFP, []>;
+def XAM_Fp80 : FpI_<(outs), (ins RFP80:$src), OneArgFP, []>;
+def XAM_F : FPI<0xD9, MRM_E5, (outs), (ins), "fxam">;
+} // SchedRW
+
// Versions of FP instructions that take a single memory operand. Added for the
// disassembler; remove as they are included with patterns elsewhere.
let SchedRW = [WriteFComLd], Uses = [FPCW], mayRaiseFPException = 1,
let SchedRW = [WriteMicrocoded] in {
let Defs = [FPSW] in {
def WAIT : I<0x9B, RawFrm, (outs), (ins), "wait", []>;
-def FXAM : I<0xD9, MRM_E5, (outs), (ins), "fxam", []>;
def FDECSTP : I<0xD9, MRM_F6, (outs), (ins), "fdecstp", []>;
def FINCSTP : I<0xD9, MRM_F7, (outs), (ins), "fincstp", []>;
let Uses = [FPCW], mayRaiseFPException = 1 in {
def : InstRW<[HWWriteP1], (instregex "TST_F")>;
// FXAM.
-def : InstRW<[HWWrite2P1], (instrs FXAM)>;
+def : InstRW<[HWWrite2P1], (instrs XAM_F)>;
// FPREM.
def HWWriteFPREM : SchedWriteRes<[]> {
let Latency = 1;
let ResourceCycles = [1];
}
-def : InstRW<[AtomWrite0_1], (instrs FXAM, LD_Frr,
+def : InstRW<[AtomWrite0_1], (instrs XAM_F, LD_Frr,
MOVSX64rr32)>;
def : SchedAlias<WriteALURMW, AtomWrite0_1>;
def : SchedAlias<WriteADCRMW, AtomWrite0_1>;
def : InstRW<[ZnWriteFPU0Lat1], (instregex "TST_F")>;
// FXAM.
-def : InstRW<[ZnWriteFPU3Lat1], (instrs FXAM)>;
+def : InstRW<[ZnWriteFPU3Lat1], (instrs XAM_F)>;
// FPREM.
def : InstRW<[WriteMicrocoded], (instrs FPREM)>;
def : InstRW<[Zn2WriteFPU0Lat1], (instregex "TST_F")>;
// FXAM.
-def : InstRW<[Zn2WriteFPU3Lat1], (instrs FXAM)>;
+def : InstRW<[Zn2WriteFPU3Lat1], (instrs XAM_F)>;
// FPREM.
def : InstRW<[WriteMicrocoded], (instrs FPREM)>;
# CHECK-NEXT: 3 3 1.00 U fucomi %st(3), %st
# CHECK-NEXT: 3 3 1.00 U fucompi %st(3), %st
# CHECK-NEXT: 1 100 0.33 U wait
-# CHECK-NEXT: 1 100 0.33 U fxam
+# CHECK-NEXT: 1 1 1.00 U fxam
# CHECK-NEXT: 1 1 0.33 U fxch %st(1)
# CHECK-NEXT: 1 1 0.33 U fxch %st(3)
# CHECK-NEXT: 5 5 2.00 * * U fxrstor (%eax)
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6.0] [6.1]
-# CHECK-NEXT: - 136.00 52.67 90.67 17.00 54.67 34.00 34.00
+# CHECK-NEXT: - 136.00 53.33 90.33 17.00 54.33 34.00 34.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6.0] [6.1] Instructions:
# CHECK-NEXT: - - 1.00 1.00 - 1.00 - - fucomi %st(3), %st
# CHECK-NEXT: - - 1.00 1.00 - 1.00 - - fucompi %st(3), %st
# CHECK-NEXT: - - 0.33 0.33 - 0.33 - - wait
-# CHECK-NEXT: - - 0.33 0.33 - 0.33 - - fxam
+# CHECK-NEXT: - - 1.00 - - - - - fxam
# CHECK-NEXT: - - 0.33 0.33 - 0.33 - - fxch %st(1)
# CHECK-NEXT: - - 0.33 0.33 - 0.33 - - fxch %st(3)
# CHECK-NEXT: - - 0.50 0.50 1.00 2.00 0.50 0.50 fxrstor (%eax)
# CHECK-NEXT: 2 1 1.00 U fucomi %st(3), %st
# CHECK-NEXT: 2 1 1.00 U fucompi %st(3), %st
# CHECK-NEXT: 1 100 0.50 U wait
-# CHECK-NEXT: 1 100 0.50 U fxam
+# CHECK-NEXT: 2 1 1.00 U fxam
# CHECK-NEXT: 1 1 1.00 U fxch %st(1)
# CHECK-NEXT: 1 1 1.00 U fxch %st(3)
# CHECK-NEXT: 1 100 0.50 * * U fxrstor (%eax)
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0.0] [0.1] [1] [2] [3] [4] [5] [6] [7.0] [7.1] [8.0] [8.1] [9] [10] [11] [12] [13] [14] [15] [16.0] [16.1] [17] [18]
-# CHECK-NEXT: 55.50 55.50 - - - 39.50 23.50 - 224.00 224.00 - - - 7.00 56.00 32.00 - - - 49.00 49.00 - 13.00
+# CHECK-NEXT: 55.50 55.50 - - - 40.00 23.00 - 224.50 224.50 - - - 7.00 57.00 32.00 - - - 49.00 49.00 - 13.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0.0] [0.1] [1] [2] [3] [4] [5] [6] [7.0] [7.1] [8.0] [8.1] [9] [10] [11] [12] [13] [14] [15] [16.0] [16.1] [17] [18] Instructions:
# CHECK-NEXT: - - - - - 1.00 - - 0.50 0.50 - - - - 1.00 - - - - - - - - fucomi %st(3), %st
# CHECK-NEXT: - - - - - 1.00 - - 0.50 0.50 - - - - 1.00 - - - - - - - - fucompi %st(3), %st
# CHECK-NEXT: - - - - - 0.50 0.50 - - - - - - - - - - - - - - - - wait
-# CHECK-NEXT: - - - - - 0.50 0.50 - - - - - - - - - - - - - - - - fxam
+# CHECK-NEXT: - - - - - 1.00 - - 0.50 0.50 - - - - 1.00 - - - - - - - - fxam
# CHECK-NEXT: - - - - - 1.00 1.00 - - - - - - - - - - - - - - - - fxch %st(1)
# CHECK-NEXT: - - - - - 1.00 1.00 - - - - - - - - - - - - - - - - fxch %st(3)
# CHECK-NEXT: - - - - - 0.50 0.50 - - - - - - - - - - - - - - - - fxrstor (%eax)
# CHECK-NEXT: 1 3 1.00 U fucomi %st(3), %st
# CHECK-NEXT: 1 3 1.00 U fucompi %st(3), %st
# CHECK-NEXT: 2 2 0.50 U wait
-# CHECK-NEXT: 1 100 0.25 U fxam
+# CHECK-NEXT: 1 1 1.00 U fxam
# CHECK-NEXT: 12 14 4.00 U fxch %st(1)
# CHECK-NEXT: 12 14 4.00 U fxch %st(3)
# CHECK-NEXT: 90 63 16.50 * * U fxrstor (%eax)
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
-# CHECK-NEXT: - 9.00 116.92 145.92 49.00 49.00 27.00 59.42 69.75 9.00
+# CHECK-NEXT: - 9.00 117.67 145.67 49.00 49.00 27.00 59.17 69.50 9.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] Instructions:
# CHECK-NEXT: - - - 1.00 - - - - - - fucomi %st(3), %st
# CHECK-NEXT: - - - 1.00 - - - - - - fucompi %st(3), %st
# CHECK-NEXT: - - 0.50 0.50 - - - 0.50 0.50 - wait
-# CHECK-NEXT: - - 0.25 0.25 - - - 0.25 0.25 - fxam
+# CHECK-NEXT: - - 1.00 - - - - - - - fxam
# CHECK-NEXT: - - 3.25 2.25 - - - 1.25 5.25 - fxch %st(1)
# CHECK-NEXT: - - 3.25 2.25 - - - 1.25 5.25 - fxch %st(3)
# CHECK-NEXT: - - 17.25 12.25 16.50 16.50 - 12.75 14.75 - fxrstor (%eax)
# CHECK-NEXT: 1 3 1.00 U fucomi %st(3), %st
# CHECK-NEXT: 1 3 1.00 U fucompi %st(3), %st
# CHECK-NEXT: 1 100 0.50 U wait
-# CHECK-NEXT: 1 100 0.50 U fxam
+# CHECK-NEXT: 1 3 1.00 U fxam
# CHECK-NEXT: 1 1 0.50 U fxch %st(1)
# CHECK-NEXT: 1 1 0.50 U fxch %st(3)
# CHECK-NEXT: 1 100 0.50 * * U fxrstor (%eax)
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]
-# CHECK-NEXT: 42.00 20.00 - 54.00 349.00 54.00 34.00 39.00 - 13.00 7.00 - - -
+# CHECK-NEXT: 42.50 19.50 - 55.00 349.00 55.00 34.00 39.00 - 13.00 7.00 - - -
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] Instructions:
# CHECK-NEXT: 1.00 - - 1.00 - 1.00 - - - - - - - - fucomi %st(3), %st
# CHECK-NEXT: 1.00 - - 1.00 - 1.00 - - - - - - - - fucompi %st(3), %st
# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - wait
-# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - fxam
+# CHECK-NEXT: 1.00 - - 1.00 - 1.00 - - - - - - - - fxam
# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - fxch %st(1)
# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - fxch %st(3)
# CHECK-NEXT: 0.50 0.50 - - - - - - - - - - - - fxrstor (%eax)
# CHECK-NEXT: 3 3 1.00 U fucomi %st(3), %st
# CHECK-NEXT: 3 3 1.00 U fucompi %st(3), %st
# CHECK-NEXT: 1 100 0.33 U wait
-# CHECK-NEXT: 1 100 0.33 U fxam
+# CHECK-NEXT: 1 1 1.00 U fxam
# CHECK-NEXT: 1 1 0.33 U fxch %st(1)
# CHECK-NEXT: 1 1 0.33 U fxch %st(3)
# CHECK-NEXT: 5 5 2.00 * * U fxrstor (%eax)
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6.0] [6.1]
-# CHECK-NEXT: - 136.00 52.67 90.67 17.00 54.67 34.00 34.00
+# CHECK-NEXT: - 136.00 53.33 90.33 17.00 54.33 34.00 34.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6.0] [6.1] Instructions:
# CHECK-NEXT: - - 1.00 1.00 - 1.00 - - fucomi %st(3), %st
# CHECK-NEXT: - - 1.00 1.00 - 1.00 - - fucompi %st(3), %st
# CHECK-NEXT: - - 0.33 0.33 - 0.33 - - wait
-# CHECK-NEXT: - - 0.33 0.33 - 0.33 - - fxam
+# CHECK-NEXT: - - 1.00 - - - - - fxam
# CHECK-NEXT: - - 0.33 0.33 - 0.33 - - fxch %st(1)
# CHECK-NEXT: - - 0.33 0.33 - 0.33 - - fxch %st(3)
# CHECK-NEXT: - - 0.50 0.50 1.00 2.00 0.50 0.50 fxrstor (%eax)
# CHECK-NEXT: 1 3 1.00 U fucomi %st(3), %st
# CHECK-NEXT: 1 3 1.00 U fucompi %st(3), %st
# CHECK-NEXT: 1 100 1.00 U wait
-# CHECK-NEXT: 1 100 1.00 U fxam
+# CHECK-NEXT: 1 1 0.50 U fxam
# CHECK-NEXT: 1 1 0.50 U fxch %st(1)
# CHECK-NEXT: 1 1 0.50 U fxch %st(3)
# CHECK-NEXT: 1 100 1.00 * * U fxrstor (%eax)
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7]
-# CHECK-NEXT: - 312.00 16.00 65.00 61.00 9.50 9.50 52.00
+# CHECK-NEXT: - 312.00 16.00 64.50 61.50 9.50 9.50 52.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] Instructions:
# CHECK-NEXT: - - - - 1.00 - - - fucomi %st(3), %st
# CHECK-NEXT: - - - - 1.00 - - - fucompi %st(3), %st
# CHECK-NEXT: - - - 1.00 - - - - wait
-# CHECK-NEXT: - - - 1.00 - - - - fxam
+# CHECK-NEXT: - - - 0.50 0.50 - - - fxam
# CHECK-NEXT: - - - - - 0.50 0.50 - fxch %st(1)
# CHECK-NEXT: - - - - - 0.50 0.50 - fxch %st(3)
# CHECK-NEXT: - - - 1.00 - - - - fxrstor (%eax)
# CHECK-NEXT: 3 3 1.00 U fucomi %st(3), %st
# CHECK-NEXT: 3 3 1.00 U fucompi %st(3), %st
# CHECK-NEXT: 1 100 0.33 U wait
-# CHECK-NEXT: 1 100 0.33 U fxam
+# CHECK-NEXT: 1 1 1.00 U fxam
# CHECK-NEXT: 1 1 0.33 U fxch %st(1)
# CHECK-NEXT: 1 1 0.33 U fxch %st(3)
# CHECK-NEXT: 5 5 2.00 * * U fxrstor (%eax)
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6.0] [6.1]
-# CHECK-NEXT: - 136.00 52.67 90.67 17.00 54.67 34.00 34.00
+# CHECK-NEXT: - 136.00 53.33 90.33 17.00 54.33 34.00 34.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6.0] [6.1] Instructions:
# CHECK-NEXT: - - 1.00 1.00 - 1.00 - - fucomi %st(3), %st
# CHECK-NEXT: - - 1.00 1.00 - 1.00 - - fucompi %st(3), %st
# CHECK-NEXT: - - 0.33 0.33 - 0.33 - - wait
-# CHECK-NEXT: - - 0.33 0.33 - 0.33 - - fxam
+# CHECK-NEXT: - - 1.00 - - - - - fxam
# CHECK-NEXT: - - 0.33 0.33 - 0.33 - - fxch %st(1)
# CHECK-NEXT: - - 0.33 0.33 - 0.33 - - fxch %st(3)
# CHECK-NEXT: - - 0.50 0.50 1.00 2.00 0.50 0.50 fxrstor (%eax)
# CHECK-NEXT: 1 2 1.00 U fucomi %st(3), %st
# CHECK-NEXT: 1 2 1.00 U fucompi %st(3), %st
# CHECK-NEXT: 2 2 0.50 U wait
-# CHECK-NEXT: 1 100 0.25 U fxam
+# CHECK-NEXT: 1 2 1.00 U fxam
# CHECK-NEXT: 15 17 4.00 U fxch %st(1)
# CHECK-NEXT: 15 17 4.00 U fxch %st(3)
# CHECK-NEXT: 90 63 16.50 * * U fxrstor (%eax)
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
-# CHECK-NEXT: - 7.00 126.75 52.25 49.00 49.00 27.00 149.75 69.25 9.00
+# CHECK-NEXT: - 7.00 127.50 52.00 49.00 49.00 27.00 149.50 69.00 9.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] Instructions:
# CHECK-NEXT: - - 1.00 - - - - - - - fucomi %st(3), %st
# CHECK-NEXT: - - 1.00 - - - - - - - fucompi %st(3), %st
# CHECK-NEXT: - - 0.50 0.50 - - - 0.50 0.50 - wait
-# CHECK-NEXT: - - 0.25 0.25 - - - 0.25 0.25 - fxam
+# CHECK-NEXT: - - 1.00 - - - - - - - fxam
# CHECK-NEXT: - - 4.00 2.00 - - - 4.00 5.00 - fxch %st(1)
# CHECK-NEXT: - - 4.00 2.00 - - - 4.00 5.00 - fxch %st(3)
# CHECK-NEXT: - - 17.25 12.25 16.50 16.50 - 12.75 14.75 - fxrstor (%eax)
# CHECK-NEXT: 1 2 1.00 U fucomi %st(3), %st
# CHECK-NEXT: 1 2 1.00 U fucompi %st(3), %st
# CHECK-NEXT: 2 2 0.50 U wait
-# CHECK-NEXT: 1 100 0.25 U fxam
+# CHECK-NEXT: 1 2 1.00 U fxam
# CHECK-NEXT: 15 17 4.00 U fxch %st(1)
# CHECK-NEXT: 15 17 4.00 U fxch %st(3)
# CHECK-NEXT: 90 63 16.50 * * U fxrstor (%eax)
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
-# CHECK-NEXT: - 7.00 126.75 52.25 49.00 49.00 27.00 149.75 69.25 9.00
+# CHECK-NEXT: - 7.00 127.50 52.00 49.00 49.00 27.00 149.50 69.00 9.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] Instructions:
# CHECK-NEXT: - - 1.00 - - - - - - - fucomi %st(3), %st
# CHECK-NEXT: - - 1.00 - - - - - - - fucompi %st(3), %st
# CHECK-NEXT: - - 0.50 0.50 - - - 0.50 0.50 - wait
-# CHECK-NEXT: - - 0.25 0.25 - - - 0.25 0.25 - fxam
+# CHECK-NEXT: - - 1.00 - - - - - - - fxam
# CHECK-NEXT: - - 4.00 2.00 - - - 4.00 5.00 - fxch %st(1)
# CHECK-NEXT: - - 4.00 2.00 - - - 4.00 5.00 - fxch %st(3)
# CHECK-NEXT: - - 17.25 12.25 16.50 16.50 - 12.75 14.75 - fxrstor (%eax)
# CHECK-NEXT: 1 3 1.00 U fucomi %st(3), %st
# CHECK-NEXT: 1 3 1.00 U fucompi %st(3), %st
# CHECK-NEXT: 100 100 25.00 U wait
-# CHECK-NEXT: 100 100 25.00 U fxam
+# CHECK-NEXT: 2 1 1.00 U fxam
# CHECK-NEXT: 1 1 1.00 U fxch %st(1)
# CHECK-NEXT: 1 1 1.00 U fxch %st(3)
# CHECK-NEXT: 100 100 25.00 * * U fxrstor (%eax)
# CHECK: Resource pressure per iteration:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12.0] [12.1] [13] [14.0] [14.1] [14.2] [15.0] [15.1] [15.2] [16.0] [16.1]
-# CHECK-NEXT: 10.67 10.67 10.67 886.50 886.50 886.50 886.50 - 137.00 203.00 119.00 119.00 13.50 13.50 - 24.00 24.00 24.00 15.33 15.33 15.33 13.00 13.00
+# CHECK-NEXT: 10.67 10.67 10.67 861.50 861.50 861.50 861.50 - 137.00 204.00 120.00 119.00 13.50 13.50 - 24.00 24.00 24.00 15.33 15.33 15.33 13.00 13.00
# CHECK: Resource pressure by instruction:
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12.0] [12.1] [13] [14.0] [14.1] [14.2] [15.0] [15.1] [15.2] [16.0] [16.1] Instructions:
# CHECK-NEXT: - - - - - - - - 1.00 1.00 - - - - - - - - - - - - - fucomi %st(3), %st
# CHECK-NEXT: - - - - - - - - 1.00 1.00 - - - - - - - - - - - - - fucompi %st(3), %st
# CHECK-NEXT: - - - 25.00 25.00 25.00 25.00 - - - - - - - - - - - - - - - - wait
-# CHECK-NEXT: - - - 25.00 25.00 25.00 25.00 - - - - - - - - - - - - - - - - fxam
+# CHECK-NEXT: - - - - - - - - - 1.00 1.00 - - - - - - - - - - - - fxam
# CHECK-NEXT: - - - 1.00 1.00 1.00 1.00 - - - - - - - - - - - - - - - - fxch %st(1)
# CHECK-NEXT: - - - 1.00 1.00 1.00 1.00 - - - - - - - - - - - - - - - - fxch %st(3)
# CHECK-NEXT: - - - 25.00 25.00 25.00 25.00 - - - - - - - - - - - - - - - - fxrstor (%eax)