@@ -958,54 +958,41 @@ void RISCVInstrInfo::movImm(MachineBasicBlock &MBB,
958
958
}
959
959
}
960
960
961
- static RISCVCC::CondCode getCondFromBranchOpc (unsigned Opc) {
961
+ RISCVCC::CondCode RISCVInstrInfo:: getCondFromBranchOpc (unsigned Opc) {
962
962
switch (Opc) {
963
963
default :
964
964
return RISCVCC::COND_INVALID;
965
965
case RISCV::BEQ:
966
- return RISCVCC::COND_EQ;
967
- case RISCV::BNE:
968
- return RISCVCC::COND_NE;
969
- case RISCV::BLT:
970
- return RISCVCC::COND_LT;
971
- case RISCV::BGE:
972
- return RISCVCC::COND_GE;
973
- case RISCV::BLTU:
974
- return RISCVCC::COND_LTU;
975
- case RISCV::BGEU:
976
- return RISCVCC::COND_GEU;
977
966
case RISCV::CV_BEQIMM:
978
- return RISCVCC::COND_CV_BEQIMM;
979
- case RISCV::CV_BNEIMM:
980
- return RISCVCC::COND_CV_BNEIMM;
981
967
case RISCV::QC_BEQI:
982
- return RISCVCC::COND_QC_BEQI;
983
968
case RISCV::QC_E_BEQI:
984
- return RISCVCC::COND_QC_E_BEQI;
969
+ return RISCVCC::COND_EQ;
970
+ case RISCV::BNE:
985
971
case RISCV::QC_BNEI:
986
- return RISCVCC::COND_QC_BNEI;
987
972
case RISCV::QC_E_BNEI:
988
- return RISCVCC::COND_QC_E_BNEI;
973
+ case RISCV::CV_BNEIMM:
974
+ return RISCVCC::COND_NE;
975
+ case RISCV::BLT:
989
976
case RISCV::QC_BLTI:
990
- return RISCVCC::COND_QC_BLTI;
991
977
case RISCV::QC_E_BLTI:
992
- return RISCVCC::COND_QC_E_BLTI;
978
+ return RISCVCC::COND_LT;
979
+ case RISCV::BGE:
993
980
case RISCV::QC_BGEI:
994
- return RISCVCC::COND_QC_BGEI;
995
981
case RISCV::QC_E_BGEI:
996
- return RISCVCC::COND_QC_E_BGEI;
982
+ return RISCVCC::COND_GE;
983
+ case RISCV::BLTU:
997
984
case RISCV::QC_BLTUI:
998
- return RISCVCC::COND_QC_BLTUI;
999
985
case RISCV::QC_E_BLTUI:
1000
- return RISCVCC::COND_QC_E_BLTUI;
986
+ return RISCVCC::COND_LTU;
987
+ case RISCV::BGEU:
1001
988
case RISCV::QC_BGEUI:
1002
- return RISCVCC::COND_QC_BGEUI;
1003
989
case RISCV::QC_E_BGEUI:
1004
- return RISCVCC::COND_QC_E_BGEUI ;
990
+ return RISCVCC::COND_GEU ;
1005
991
}
1006
992
}
1007
993
1008
- bool RISCVInstrInfo::evaluateCondBranch (unsigned CC, int64_t C0, int64_t C1) {
994
+ bool RISCVInstrInfo::evaluateCondBranch (RISCVCC::CondCode CC, int64_t C0,
995
+ int64_t C1) {
1009
996
switch (CC) {
1010
997
default :
1011
998
llvm_unreachable (" Unexpected CC" );
@@ -1033,63 +1020,92 @@ static void parseCondBranch(MachineInstr &LastInst, MachineBasicBlock *&Target,
1033
1020
assert (LastInst.getDesc ().isConditionalBranch () &&
1034
1021
" Unknown conditional branch" );
1035
1022
Target = LastInst.getOperand (2 ).getMBB ();
1036
- unsigned CC = getCondFromBranchOpc (LastInst.getOpcode ());
1037
- Cond.push_back (MachineOperand::CreateImm (CC));
1023
+ Cond.push_back (MachineOperand::CreateImm (LastInst.getOpcode ()));
1038
1024
Cond.push_back (LastInst.getOperand (0 ));
1039
1025
Cond.push_back (LastInst.getOperand (1 ));
1040
1026
}
1041
1027
1042
- unsigned RISCVCC::getBrCond (RISCVCC::CondCode CC) {
1043
- switch (CC ) {
1028
+ unsigned RISCVCC::getBrCond (RISCVCC::CondCode CC, unsigned SelectOpc ) {
1029
+ switch (SelectOpc ) {
1044
1030
default :
1045
- llvm_unreachable (" Unknown condition code!" );
1046
- case RISCVCC::COND_EQ:
1047
- return RISCV::BEQ;
1048
- case RISCVCC::COND_NE:
1049
- return RISCV::BNE;
1050
- case RISCVCC::COND_LT:
1051
- return RISCV::BLT;
1052
- case RISCVCC::COND_GE:
1053
- return RISCV::BGE;
1054
- case RISCVCC::COND_LTU:
1055
- return RISCV::BLTU;
1056
- case RISCVCC::COND_GEU:
1057
- return RISCV::BGEU;
1058
- case RISCVCC::COND_CV_BEQIMM:
1059
- return RISCV::CV_BEQIMM;
1060
- case RISCVCC::COND_CV_BNEIMM:
1061
- return RISCV::CV_BNEIMM;
1062
- case RISCVCC::COND_QC_BEQI:
1063
- return RISCV::QC_BEQI;
1064
- case RISCVCC::COND_QC_E_BEQI:
1065
- return RISCV::QC_E_BEQI;
1066
- case RISCVCC::COND_QC_BNEI:
1067
- return RISCV::QC_BNEI;
1068
- case RISCVCC::COND_QC_E_BNEI:
1069
- return RISCV::QC_E_BNEI;
1070
- case RISCVCC::COND_QC_BLTI:
1071
- return RISCV::QC_BLTI;
1072
- case RISCVCC::COND_QC_E_BLTI:
1073
- return RISCV::QC_E_BLTI;
1074
- case RISCVCC::COND_QC_BGEI:
1075
- return RISCV::QC_BGEI;
1076
- case RISCVCC::COND_QC_E_BGEI:
1077
- return RISCV::QC_E_BGEI;
1078
- case RISCVCC::COND_QC_BLTUI:
1079
- return RISCV::QC_BLTUI;
1080
- case RISCVCC::COND_QC_E_BLTUI:
1081
- return RISCV::QC_E_BLTUI;
1082
- case RISCVCC::COND_QC_BGEUI:
1083
- return RISCV::QC_BGEUI;
1084
- case RISCVCC::COND_QC_E_BGEUI:
1085
- return RISCV::QC_E_BGEUI;
1031
+ switch (CC) {
1032
+ default :
1033
+ llvm_unreachable (" Unexpected condition code!" );
1034
+ case RISCVCC::COND_EQ:
1035
+ return RISCV::BEQ;
1036
+ case RISCVCC::COND_NE:
1037
+ return RISCV::BNE;
1038
+ case RISCVCC::COND_LT:
1039
+ return RISCV::BLT;
1040
+ case RISCVCC::COND_GE:
1041
+ return RISCV::BGE;
1042
+ case RISCVCC::COND_LTU:
1043
+ return RISCV::BLTU;
1044
+ case RISCVCC::COND_GEU:
1045
+ return RISCV::BGEU;
1046
+ }
1047
+ break ;
1048
+ case RISCV::Select_GPR_Using_CC_SImm5_CV:
1049
+ switch (CC) {
1050
+ default :
1051
+ llvm_unreachable (" Unexpected condition code!" );
1052
+ case RISCVCC::COND_EQ:
1053
+ return RISCV::CV_BEQIMM;
1054
+ case RISCVCC::COND_NE:
1055
+ return RISCV::CV_BNEIMM;
1056
+ }
1057
+ break ;
1058
+ case RISCV::Select_GPRNoX0_Using_CC_SImm5NonZero_QC:
1059
+ switch (CC) {
1060
+ default :
1061
+ llvm_unreachable (" Unexpected condition code!" );
1062
+ case RISCVCC::COND_EQ:
1063
+ return RISCV::QC_BEQI;
1064
+ case RISCVCC::COND_NE:
1065
+ return RISCV::QC_BNEI;
1066
+ case RISCVCC::COND_LT:
1067
+ return RISCV::QC_BLTI;
1068
+ case RISCVCC::COND_GE:
1069
+ return RISCV::QC_BGEI;
1070
+ }
1071
+ break ;
1072
+ case RISCV::Select_GPRNoX0_Using_CC_UImm5NonZero_QC:
1073
+ switch (CC) {
1074
+ default :
1075
+ llvm_unreachable (" Unexpected condition code!" );
1076
+ case RISCVCC::COND_LTU:
1077
+ return RISCV::QC_BLTUI;
1078
+ case RISCVCC::COND_GEU:
1079
+ return RISCV::QC_BGEUI;
1080
+ }
1081
+ break ;
1082
+ case RISCV::Select_GPRNoX0_Using_CC_SImm16NonZero_QC:
1083
+ switch (CC) {
1084
+ default :
1085
+ llvm_unreachable (" Unexpected condition code!" );
1086
+ case RISCVCC::COND_EQ:
1087
+ return RISCV::QC_E_BEQI;
1088
+ case RISCVCC::COND_NE:
1089
+ return RISCV::QC_E_BNEI;
1090
+ case RISCVCC::COND_LT:
1091
+ return RISCV::QC_E_BLTI;
1092
+ case RISCVCC::COND_GE:
1093
+ return RISCV::QC_E_BGEI;
1094
+ }
1095
+ break ;
1096
+ case RISCV::Select_GPRNoX0_Using_CC_UImm16NonZero_QC:
1097
+ switch (CC) {
1098
+ default :
1099
+ llvm_unreachable (" Unexpected condition code!" );
1100
+ case RISCVCC::COND_LTU:
1101
+ return RISCV::QC_E_BLTUI;
1102
+ case RISCVCC::COND_GEU:
1103
+ return RISCV::QC_E_BGEUI;
1104
+ }
1105
+ break ;
1086
1106
}
1087
1107
}
1088
1108
1089
- const MCInstrDesc &RISCVInstrInfo::getBrCond (RISCVCC::CondCode CC) const {
1090
- return get (RISCVCC::getBrCond (CC));
1091
- }
1092
-
1093
1109
RISCVCC::CondCode RISCVCC::getOppositeBranchCondition (RISCVCC::CondCode CC) {
1094
1110
switch (CC) {
1095
1111
default :
@@ -1106,34 +1122,6 @@ RISCVCC::CondCode RISCVCC::getOppositeBranchCondition(RISCVCC::CondCode CC) {
1106
1122
return RISCVCC::COND_GEU;
1107
1123
case RISCVCC::COND_GEU:
1108
1124
return RISCVCC::COND_LTU;
1109
- case RISCVCC::COND_CV_BEQIMM:
1110
- return RISCVCC::COND_CV_BNEIMM;
1111
- case RISCVCC::COND_CV_BNEIMM:
1112
- return RISCVCC::COND_CV_BEQIMM;
1113
- case RISCVCC::COND_QC_BEQI:
1114
- return RISCVCC::COND_QC_BNEI;
1115
- case RISCVCC::COND_QC_E_BEQI:
1116
- return RISCVCC::COND_QC_E_BNEI;
1117
- case RISCVCC::COND_QC_BNEI:
1118
- return RISCVCC::COND_QC_BEQI;
1119
- case RISCVCC::COND_QC_E_BNEI:
1120
- return RISCVCC::COND_QC_E_BEQI;
1121
- case RISCVCC::COND_QC_BLTI:
1122
- return RISCVCC::COND_QC_BGEI;
1123
- case RISCVCC::COND_QC_E_BLTI:
1124
- return RISCVCC::COND_QC_E_BGEI;
1125
- case RISCVCC::COND_QC_BGEI:
1126
- return RISCVCC::COND_QC_BLTI;
1127
- case RISCVCC::COND_QC_E_BGEI:
1128
- return RISCVCC::COND_QC_E_BLTI;
1129
- case RISCVCC::COND_QC_BLTUI:
1130
- return RISCVCC::COND_QC_BGEUI;
1131
- case RISCVCC::COND_QC_E_BLTUI:
1132
- return RISCVCC::COND_QC_E_BGEUI;
1133
- case RISCVCC::COND_QC_BGEUI:
1134
- return RISCVCC::COND_QC_BLTUI;
1135
- case RISCVCC::COND_QC_E_BGEUI:
1136
- return RISCVCC::COND_QC_E_BLTUI;
1137
1125
}
1138
1126
}
1139
1127
@@ -1263,9 +1251,10 @@ unsigned RISCVInstrInfo::insertBranch(
1263
1251
}
1264
1252
1265
1253
// Either a one or two-way conditional branch.
1266
- auto CC = static_cast <RISCVCC::CondCode>(Cond[0 ].getImm ());
1267
- MachineInstr &CondMI =
1268
- *BuildMI (&MBB, DL, getBrCond (CC)).add (Cond[1 ]).add (Cond[2 ]).addMBB (TBB);
1254
+ MachineInstr &CondMI = *BuildMI (&MBB, DL, get (Cond[0 ].getImm ()))
1255
+ .add (Cond[1 ])
1256
+ .add (Cond[2 ])
1257
+ .addMBB (TBB);
1269
1258
if (BytesAdded)
1270
1259
*BytesAdded += getInstSizeInBytes (CondMI);
1271
1260
@@ -1348,8 +1337,71 @@ void RISCVInstrInfo::insertIndirectBranch(MachineBasicBlock &MBB,
1348
1337
bool RISCVInstrInfo::reverseBranchCondition (
1349
1338
SmallVectorImpl<MachineOperand> &Cond) const {
1350
1339
assert ((Cond.size () == 3 ) && " Invalid branch condition!" );
1351
- auto CC = static_cast <RISCVCC::CondCode>(Cond[0 ].getImm ());
1352
- Cond[0 ].setImm (getOppositeBranchCondition (CC));
1340
+ switch (Cond[0 ].getImm ()) {
1341
+ default :
1342
+ llvm_unreachable (" Unknown conditional branch!" );
1343
+ case RISCV::BEQ:
1344
+ Cond[0 ].setImm (RISCV::BNE);
1345
+ break ;
1346
+ case RISCV::BNE:
1347
+ Cond[0 ].setImm (RISCV::BEQ);
1348
+ break ;
1349
+ case RISCV::BLT:
1350
+ Cond[0 ].setImm (RISCV::BGE);
1351
+ break ;
1352
+ case RISCV::BGE:
1353
+ Cond[0 ].setImm (RISCV::BLT);
1354
+ break ;
1355
+ case RISCV::BLTU:
1356
+ Cond[0 ].setImm (RISCV::BGEU);
1357
+ break ;
1358
+ case RISCV::BGEU:
1359
+ Cond[0 ].setImm (RISCV::BLTU);
1360
+ break ;
1361
+ case RISCV::CV_BEQIMM:
1362
+ Cond[0 ].setImm (RISCV::CV_BNEIMM);
1363
+ break ;
1364
+ case RISCV::CV_BNEIMM:
1365
+ Cond[0 ].setImm (RISCV::CV_BEQIMM);
1366
+ break ;
1367
+ case RISCV::QC_BEQI:
1368
+ Cond[0 ].setImm (RISCV::QC_BNEI);
1369
+ break ;
1370
+ case RISCV::QC_BNEI:
1371
+ Cond[0 ].setImm (RISCV::QC_BEQI);
1372
+ break ;
1373
+ case RISCV::QC_BGEI:
1374
+ Cond[0 ].setImm (RISCV::QC_BLTI);
1375
+ break ;
1376
+ case RISCV::QC_BLTI:
1377
+ Cond[0 ].setImm (RISCV::QC_BGEI);
1378
+ break ;
1379
+ case RISCV::QC_BGEUI:
1380
+ Cond[0 ].setImm (RISCV::QC_BLTUI);
1381
+ break ;
1382
+ case RISCV::QC_BLTUI:
1383
+ Cond[0 ].setImm (RISCV::QC_BGEUI);
1384
+ break ;
1385
+ case RISCV::QC_E_BEQI:
1386
+ Cond[0 ].setImm (RISCV::QC_E_BNEI);
1387
+ break ;
1388
+ case RISCV::QC_E_BNEI:
1389
+ Cond[0 ].setImm (RISCV::QC_E_BEQI);
1390
+ break ;
1391
+ case RISCV::QC_E_BGEI:
1392
+ Cond[0 ].setImm (RISCV::QC_E_BLTI);
1393
+ break ;
1394
+ case RISCV::QC_E_BLTI:
1395
+ Cond[0 ].setImm (RISCV::QC_E_BGEI);
1396
+ break ;
1397
+ case RISCV::QC_E_BGEUI:
1398
+ Cond[0 ].setImm (RISCV::QC_E_BLTUI);
1399
+ break ;
1400
+ case RISCV::QC_E_BLTUI:
1401
+ Cond[0 ].setImm (RISCV::QC_E_BGEUI);
1402
+ break ;
1403
+ }
1404
+
1353
1405
return false ;
1354
1406
}
1355
1407
0 commit comments