@@ -52,6 +52,7 @@ def V2UnitV3 : ProcResource<1>; // FP/ASIMD 3
52
52
def V2UnitL01 : ProcResource<2>; // Load/Store 0/1
53
53
def V2UnitL2 : ProcResource<1>; // Load 2
54
54
def V2UnitD : ProcResource<2>; // Store data 0/1
55
+ def V2UnitFlg : ProcResource<3>; // Flags
55
56
56
57
def V2UnitR : ProcResGroup<[V2UnitS0, V2UnitS1]>; // Integer single-cycle 0/1
57
58
def V2UnitS : ProcResGroup<[V2UnitS0, V2UnitS1, V2UnitS2, V2UnitS3]>; // Integer single-cycle 0/1/2/3
@@ -97,11 +98,13 @@ def V2Write_0c : SchedWriteRes<[]> { let Latency = 0; }
97
98
98
99
def V2Write_1c_1B : SchedWriteRes<[V2UnitB]> { let Latency = 1; }
99
100
def V2Write_1c_1F : SchedWriteRes<[V2UnitF]> { let Latency = 1; }
101
+ def V2Write_1c_1F_1Flg : SchedWriteRes<[V2UnitF, V2UnitFlg]> { let Latency = 1; }
100
102
def V2Write_1c_1I : SchedWriteRes<[V2UnitI]> { let Latency = 1; }
101
103
def V2Write_1c_1M : SchedWriteRes<[V2UnitM]> { let Latency = 1; }
102
104
def V2Write_1c_1M0 : SchedWriteRes<[V2UnitM0]> { let Latency = 1; }
103
105
def V2Write_1c_1L01 : SchedWriteRes<[V2UnitL01]> { let Latency = 1; }
104
106
def V2Write_2c_1M : SchedWriteRes<[V2UnitM]> { let Latency = 2; }
107
+ def V2Write_2c_1M_1Flg : SchedWriteRes<[V2UnitM, V2UnitFlg]> { let Latency = 2; }
105
108
def V2Write_3c_1M : SchedWriteRes<[V2UnitM]> { let Latency = 3; }
106
109
def V2Write_2c_1M0 : SchedWriteRes<[V2UnitM0]> { let Latency = 2; }
107
110
def V2Write_3c_1M0 : SchedWriteRes<[V2UnitM0]> { let Latency = 3; }
@@ -886,12 +889,12 @@ def V2Write_ArithI : SchedWriteVariant<[
886
889
SchedVar<NoSchedPred, [V2Write_2c_1M]>]>;
887
890
888
891
def V2Write_ArithF : SchedWriteVariant<[
889
- SchedVar<IsCheapLSL, [V2Write_1c_1F ]>,
890
- SchedVar<NoSchedPred, [V2Write_2c_1M ]>]>;
892
+ SchedVar<IsCheapLSL, [V2Write_1c_1F_1Flg ]>,
893
+ SchedVar<NoSchedPred, [V2Write_2c_1M_1Flg ]>]>;
891
894
892
895
def V2Write_Logical : SchedWriteVariant<[
893
- SchedVar<NeoverseNoLSL, [V2Write_1c_1F ]>,
894
- SchedVar<NoSchedPred, [V2Write_2c_1M ]>]>;
896
+ SchedVar<NeoverseNoLSL, [V2Write_1c_1F_1Flg ]>,
897
+ SchedVar<NoSchedPred, [V2Write_2c_1M_1Flg ]>]>;
895
898
896
899
def V2Write_Extr : SchedWriteVariant<[
897
900
SchedVar<IsRORImmIdiomPred, [V2Write_1c_1I]>,
@@ -1106,19 +1109,19 @@ def : InstRW<[V2Write_1c_1B_1R], (instrs BL, BLR)>;
1106
1109
// -----------------------------------------------------------------------------
1107
1110
1108
1111
// ALU, basic
1109
- // ALU, basic, flagset
1110
1112
def : SchedAlias<WriteI, V2Write_1c_1I>;
1111
- def : InstRW<[V2Write_1c_1F], (instregex "^(ADD|SUB)S[WX]r[ir]$",
1113
+
1114
+ // ALU, basic, flagset
1115
+ def : InstRW<[V2Write_1c_1F_1Flg],
1116
+ (instregex "^(ADD|SUB)S[WX]r[ir]$",
1112
1117
"^(ADC|SBC)S[WX]r$",
1113
- "^ANDS[WX]ri$")>;
1118
+ "^ANDS[WX]ri$",
1119
+ "^(AND|BIC)S[WX]rr$")>;
1114
1120
def : InstRW<[V2Write_0or1c_1I], (instregex "^MOVZ[WX]i$")>;
1115
1121
1116
1122
// ALU, extend and shift
1117
1123
def : SchedAlias<WriteIEReg, V2Write_2c_1M>;
1118
1124
1119
- // Conditional compare
1120
- def : InstRW<[V2Write_1c_1F], (instregex "^CCM[NP][WX][ir]")>;
1121
-
1122
1125
// Arithmetic, LSL shift, shift <= 4
1123
1126
// Arithmetic, flagset, LSL shift, shift <= 4
1124
1127
// Arithmetic, LSR/ASR/ROR shift or LSL shift > 4
@@ -1129,6 +1132,9 @@ def : InstRW<[V2Write_ArithF],
1129
1132
// Arithmetic, immediate to logical address tag
1130
1133
def : InstRW<[V2Write_2c_1M], (instrs ADDG, SUBG)>;
1131
1134
1135
+ // Conditional compare
1136
+ def : InstRW<[V2Write_1c_1F_1Flg], (instregex "^CCM[NP][WX][ir]")>;
1137
+
1132
1138
// Convert floating-point condition flags
1133
1139
// Flag manipulation instructions
1134
1140
def : WriteRes<WriteSys, []> { let Latency = 1; }
@@ -1138,8 +1144,10 @@ def : InstRW<[V2Write_2c_1M], (instrs IRG, IRGstack)>;
1138
1144
1139
1145
// Insert Tag Mask
1140
1146
// Subtract Pointer
1147
+ def : InstRW<[V2Write_1c_1I], (instrs GMI, SUBP)>;
1148
+
1141
1149
// Subtract Pointer, flagset
1142
- def : InstRW<[V2Write_1c_1I ], (instrs GMI, SUBP, SUBPS)>;
1150
+ def : InstRW<[V2Write_1c_1F_1Flg ], (instrs SUBPS)>;
1143
1151
1144
1152
// Logical, shift, no flagset
1145
1153
def : InstRW<[V2Write_1c_1I], (instregex "^(AND|BIC|EON|EOR|ORN)[WX]rs$")>;
0 commit comments