@@ -1231,3 +1231,79 @@ define i128 @muli128_m63(i128 %a) nounwind {
1231
1231
%1 = mul i128 %a , -63
1232
1232
ret i128 %1
1233
1233
}
1234
+
1235
+ define i64 @mulhsu_i64 (i64 %a , i64 %b ) nounwind {
1236
+ ; RV32I-LABEL: mulhsu_i64:
1237
+ ; RV32I: # %bb.0:
1238
+ ; RV32I-NEXT: addi sp, sp, -64
1239
+ ; RV32I-NEXT: sw ra, 60(sp) # 4-byte Folded Spill
1240
+ ; RV32I-NEXT: srai a4, a3, 31
1241
+ ; RV32I-NEXT: sw a3, 12(sp)
1242
+ ; RV32I-NEXT: sw a2, 8(sp)
1243
+ ; RV32I-NEXT: sw zero, 36(sp)
1244
+ ; RV32I-NEXT: sw zero, 32(sp)
1245
+ ; RV32I-NEXT: sw a1, 28(sp)
1246
+ ; RV32I-NEXT: sw a0, 24(sp)
1247
+ ; RV32I-NEXT: sw a4, 20(sp)
1248
+ ; RV32I-NEXT: addi a0, sp, 40
1249
+ ; RV32I-NEXT: addi a1, sp, 24
1250
+ ; RV32I-NEXT: addi a2, sp, 8
1251
+ ; RV32I-NEXT: sw a4, 16(sp)
1252
+ ; RV32I-NEXT: call __multi3@plt
1253
+ ; RV32I-NEXT: lw a0, 48(sp)
1254
+ ; RV32I-NEXT: lw a1, 52(sp)
1255
+ ; RV32I-NEXT: lw ra, 60(sp) # 4-byte Folded Reload
1256
+ ; RV32I-NEXT: addi sp, sp, 64
1257
+ ; RV32I-NEXT: ret
1258
+ ;
1259
+ ; RV32IM-LABEL: mulhsu_i64:
1260
+ ; RV32IM: # %bb.0:
1261
+ ; RV32IM-NEXT: addi sp, sp, -64
1262
+ ; RV32IM-NEXT: sw ra, 60(sp) # 4-byte Folded Spill
1263
+ ; RV32IM-NEXT: srai a4, a3, 31
1264
+ ; RV32IM-NEXT: sw a3, 12(sp)
1265
+ ; RV32IM-NEXT: sw a2, 8(sp)
1266
+ ; RV32IM-NEXT: sw zero, 36(sp)
1267
+ ; RV32IM-NEXT: sw zero, 32(sp)
1268
+ ; RV32IM-NEXT: sw a1, 28(sp)
1269
+ ; RV32IM-NEXT: sw a0, 24(sp)
1270
+ ; RV32IM-NEXT: sw a4, 20(sp)
1271
+ ; RV32IM-NEXT: addi a0, sp, 40
1272
+ ; RV32IM-NEXT: addi a1, sp, 24
1273
+ ; RV32IM-NEXT: addi a2, sp, 8
1274
+ ; RV32IM-NEXT: sw a4, 16(sp)
1275
+ ; RV32IM-NEXT: call __multi3@plt
1276
+ ; RV32IM-NEXT: lw a0, 48(sp)
1277
+ ; RV32IM-NEXT: lw a1, 52(sp)
1278
+ ; RV32IM-NEXT: lw ra, 60(sp) # 4-byte Folded Reload
1279
+ ; RV32IM-NEXT: addi sp, sp, 64
1280
+ ; RV32IM-NEXT: ret
1281
+ ;
1282
+ ; RV64I-LABEL: mulhsu_i64:
1283
+ ; RV64I: # %bb.0:
1284
+ ; RV64I-NEXT: addi sp, sp, -16
1285
+ ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1286
+ ; RV64I-NEXT: mv a2, a1
1287
+ ; RV64I-NEXT: srai a3, a1, 63
1288
+ ; RV64I-NEXT: mv a1, zero
1289
+ ; RV64I-NEXT: call __multi3@plt
1290
+ ; RV64I-NEXT: mv a0, a1
1291
+ ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1292
+ ; RV64I-NEXT: addi sp, sp, 16
1293
+ ; RV64I-NEXT: ret
1294
+ ;
1295
+ ; RV64IM-LABEL: mulhsu_i64:
1296
+ ; RV64IM: # %bb.0:
1297
+ ; RV64IM-NEXT: srai a2, a1, 63
1298
+ ; RV64IM-NEXT: mulhu a1, a0, a1
1299
+ ; RV64IM-NEXT: mul a0, a0, a2
1300
+ ; RV64IM-NEXT: add a0, a1, a0
1301
+ ; RV64IM-NEXT: ret
1302
+ %1 = zext i64 %a to i128
1303
+ %2 = sext i64 %b to i128
1304
+ %3 = mul i128 %1 , %2
1305
+ %4 = lshr i128 %3 , 64
1306
+ %5 = trunc i128 %4 to i64
1307
+ ret i64 %5
1308
+ }
1309
+
0 commit comments