@@ -1128,6 +1128,147 @@ void MacroAssembler::wrap_label(Register r1, Register r2, Label &L,
11281128
11291129#undef INSN
11301130
1131+ // cmov
1132+ void MacroAssembler::cmov_eq (Register cmp1, Register cmp2, Register dst, Register src) {
1133+ if (UseZicond) {
1134+ xorr (t0, cmp1, cmp2);
1135+ czero_eqz (dst, dst, t0);
1136+ czero_nez (t0 , src, t0);
1137+ orr (dst, dst, t0);
1138+ return ;
1139+ }
1140+ Label no_set;
1141+ bne (cmp1, cmp2, no_set);
1142+ mv (dst, src);
1143+ bind (no_set);
1144+ }
1145+
1146+ void MacroAssembler::cmov_ne (Register cmp1, Register cmp2, Register dst, Register src) {
1147+ if (UseZicond) {
1148+ xorr (t0, cmp1, cmp2);
1149+ czero_nez (dst, dst, t0);
1150+ czero_eqz (t0 , src, t0);
1151+ orr (dst, dst, t0);
1152+ return ;
1153+ }
1154+ Label no_set;
1155+ beq (cmp1, cmp2, no_set);
1156+ mv (dst, src);
1157+ bind (no_set);
1158+ }
1159+
1160+ void MacroAssembler::cmov_le (Register cmp1, Register cmp2, Register dst, Register src) {
1161+ if (UseZicond) {
1162+ slt (t0, cmp2, cmp1);
1163+ czero_eqz (dst, dst, t0);
1164+ czero_nez (t0, src, t0);
1165+ orr (dst, dst, t0);
1166+ return ;
1167+ }
1168+ Label no_set;
1169+ bgt (cmp1, cmp2, no_set);
1170+ mv (dst, src);
1171+ bind (no_set);
1172+ }
1173+
1174+ void MacroAssembler::cmov_leu (Register cmp1, Register cmp2, Register dst, Register src) {
1175+ if (UseZicond) {
1176+ sltu (t0, cmp2, cmp1);
1177+ czero_eqz (dst, dst, t0);
1178+ czero_nez (t0, src, t0);
1179+ orr (dst, dst, t0);
1180+ return ;
1181+ }
1182+ Label no_set;
1183+ bgtu (cmp1, cmp2, no_set);
1184+ mv (dst, src);
1185+ bind (no_set);
1186+ }
1187+
1188+ void MacroAssembler::cmov_ge (Register cmp1, Register cmp2, Register dst, Register src) {
1189+ if (UseZicond) {
1190+ slt (t0, cmp1, cmp2);
1191+ czero_eqz (dst, dst, t0);
1192+ czero_nez (t0, src, t0);
1193+ orr (dst, dst, t0);
1194+ return ;
1195+ }
1196+ Label no_set;
1197+ blt (cmp1, cmp2, no_set);
1198+ mv (dst, src);
1199+ bind (no_set);
1200+ }
1201+
1202+ void MacroAssembler::cmov_geu (Register cmp1, Register cmp2, Register dst, Register src) {
1203+ if (UseZicond) {
1204+ sltu (t0, cmp1, cmp2);
1205+ czero_eqz (dst, dst, t0);
1206+ czero_nez (t0, src, t0);
1207+ orr (dst, dst, t0);
1208+ return ;
1209+ }
1210+ Label no_set;
1211+ bltu (cmp1, cmp2, no_set);
1212+ mv (dst, src);
1213+ bind (no_set);
1214+ }
1215+
1216+ void MacroAssembler::cmov_lt (Register cmp1, Register cmp2, Register dst, Register src) {
1217+ if (UseZicond) {
1218+ slt (t0, cmp1, cmp2);
1219+ czero_nez (dst, dst, t0);
1220+ czero_eqz (t0, src, t0);
1221+ orr (dst, dst, t0);
1222+ return ;
1223+ }
1224+ Label no_set;
1225+ bge (cmp1, cmp2, no_set);
1226+ mv (dst, src);
1227+ bind (no_set);
1228+ }
1229+
1230+ void MacroAssembler::cmov_ltu (Register cmp1, Register cmp2, Register dst, Register src) {
1231+ if (UseZicond) {
1232+ sltu (t0, cmp1, cmp2);
1233+ czero_nez (dst, dst, t0);
1234+ czero_eqz (t0, src, t0);
1235+ orr (dst, dst, t0);
1236+ return ;
1237+ }
1238+ Label no_set;
1239+ bgeu (cmp1, cmp2, no_set);
1240+ mv (dst, src);
1241+ bind (no_set);
1242+ }
1243+
1244+ void MacroAssembler::cmov_gt (Register cmp1, Register cmp2, Register dst, Register src) {
1245+ if (UseZicond) {
1246+ slt (t0, cmp2, cmp1);
1247+ czero_nez (dst, dst, t0);
1248+ czero_eqz (t0, src, t0);
1249+ orr (dst, dst, t0);
1250+ return ;
1251+ }
1252+ Label no_set;
1253+ ble (cmp1, cmp2, no_set);
1254+ mv (dst, src);
1255+ bind (no_set);
1256+ }
1257+
1258+ void MacroAssembler::cmov_gtu (Register cmp1, Register cmp2, Register dst, Register src) {
1259+ if (UseZicond) {
1260+ sltu (t0, cmp2, cmp1);
1261+ czero_nez (dst, dst, t0);
1262+ czero_eqz (t0, src, t0);
1263+ orr (dst, dst, t0);
1264+ return ;
1265+ }
1266+ Label no_set;
1267+ bleu (cmp1, cmp2, no_set);
1268+ mv (dst, src);
1269+ bind (no_set);
1270+ }
1271+
11311272// Float compare branch instructions
11321273
11331274#define INSN (NAME, FLOATCMP, BRANCH ) \
0 commit comments