@@ -1128,6 +1128,147 @@ void MacroAssembler::wrap_label(Register r1, Register r2, Label &L,
1128
1128
1129
1129
#undef INSN
1130
1130
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
+
1131
1272
// Float compare branch instructions
1132
1273
1133
1274
#define INSN (NAME, FLOATCMP, BRANCH ) \
0 commit comments