@@ -4411,3 +4411,135 @@ define ptr @udiv1280_gep(ptr %p, i16 zeroext %i) {
4411
4411
%add.ptr = getelementptr i64 , ptr %p , i64 %idx.ext
4412
4412
ret ptr %add.ptr
4413
4413
}
4414
+
4415
+ define i64 @adduw_m1 (i64 %x ) {
4416
+ ; CHECK-LABEL: adduw_m1:
4417
+ ; CHECK: # %bb.0:
4418
+ ; CHECK-NEXT: li a1, -1
4419
+ ; CHECK-NEXT: srli a1, a1, 32
4420
+ ; CHECK-NEXT: add a0, a0, a1
4421
+ ; CHECK-NEXT: ret
4422
+ %a = add i64 %x , 4294967295
4423
+ ret i64 %a
4424
+ }
4425
+
4426
+ define i64 @adduw_m3 (i64 %x ) {
4427
+ ; RV64I-LABEL: adduw_m3:
4428
+ ; RV64I: # %bb.0:
4429
+ ; RV64I-NEXT: li a1, 1
4430
+ ; RV64I-NEXT: slli a1, a1, 32
4431
+ ; RV64I-NEXT: addi a1, a1, -3
4432
+ ; RV64I-NEXT: add a0, a0, a1
4433
+ ; RV64I-NEXT: ret
4434
+ ;
4435
+ ; RV64ZBA-LABEL: adduw_m3:
4436
+ ; RV64ZBA: # %bb.0:
4437
+ ; RV64ZBA-NEXT: li a1, -3
4438
+ ; RV64ZBA-NEXT: zext.w a1, a1
4439
+ ; RV64ZBA-NEXT: add a0, a0, a1
4440
+ ; RV64ZBA-NEXT: ret
4441
+ ;
4442
+ ; RV64XANDESPERF-LABEL: adduw_m3:
4443
+ ; RV64XANDESPERF: # %bb.0:
4444
+ ; RV64XANDESPERF-NEXT: li a1, 1
4445
+ ; RV64XANDESPERF-NEXT: slli a1, a1, 32
4446
+ ; RV64XANDESPERF-NEXT: addi a1, a1, -3
4447
+ ; RV64XANDESPERF-NEXT: add a0, a0, a1
4448
+ ; RV64XANDESPERF-NEXT: ret
4449
+ %a = add i64 %x , 4294967293
4450
+ ret i64 %a
4451
+ }
4452
+
4453
+ define i64 @adduw_3shl30 (i64 %x ) {
4454
+ ; CHECK-LABEL: adduw_3shl30:
4455
+ ; CHECK: # %bb.0:
4456
+ ; CHECK-NEXT: li a1, 3
4457
+ ; CHECK-NEXT: slli a1, a1, 30
4458
+ ; CHECK-NEXT: add a0, a0, a1
4459
+ ; CHECK-NEXT: ret
4460
+ %a = add i64 %x , 3221225472
4461
+ ret i64 %a
4462
+ }
4463
+
4464
+ define i64 @adduw_m3_multiuse (i64 %x , i64 %y ) {
4465
+ ; RV64I-LABEL: adduw_m3_multiuse:
4466
+ ; RV64I: # %bb.0:
4467
+ ; RV64I-NEXT: li a2, 1
4468
+ ; RV64I-NEXT: slli a2, a2, 32
4469
+ ; RV64I-NEXT: addi a2, a2, -3
4470
+ ; RV64I-NEXT: add a0, a0, a2
4471
+ ; RV64I-NEXT: add a1, a1, a2
4472
+ ; RV64I-NEXT: or a0, a0, a1
4473
+ ; RV64I-NEXT: ret
4474
+ ;
4475
+ ; RV64ZBA-LABEL: adduw_m3_multiuse:
4476
+ ; RV64ZBA: # %bb.0:
4477
+ ; RV64ZBA-NEXT: li a2, -3
4478
+ ; RV64ZBA-NEXT: zext.w a2, a2
4479
+ ; RV64ZBA-NEXT: add a0, a0, a2
4480
+ ; RV64ZBA-NEXT: add a1, a1, a2
4481
+ ; RV64ZBA-NEXT: or a0, a0, a1
4482
+ ; RV64ZBA-NEXT: ret
4483
+ ;
4484
+ ; RV64XANDESPERF-LABEL: adduw_m3_multiuse:
4485
+ ; RV64XANDESPERF: # %bb.0:
4486
+ ; RV64XANDESPERF-NEXT: li a2, 1
4487
+ ; RV64XANDESPERF-NEXT: slli a2, a2, 32
4488
+ ; RV64XANDESPERF-NEXT: addi a2, a2, -3
4489
+ ; RV64XANDESPERF-NEXT: add a0, a0, a2
4490
+ ; RV64XANDESPERF-NEXT: add a1, a1, a2
4491
+ ; RV64XANDESPERF-NEXT: or a0, a0, a1
4492
+ ; RV64XANDESPERF-NEXT: ret
4493
+ %a = add i64 %x , 4294967293
4494
+ %b = add i64 %y , 4294967293
4495
+ %c = or i64 %a , %b
4496
+ ret i64 %c
4497
+ }
4498
+
4499
+ define i64 @add_or_m3 (i64 %x ) {
4500
+ ; RV64I-LABEL: add_or_m3:
4501
+ ; RV64I: # %bb.0:
4502
+ ; RV64I-NEXT: li a1, 1
4503
+ ; RV64I-NEXT: slli a1, a1, 32
4504
+ ; RV64I-NEXT: addi a1, a1, -3
4505
+ ; RV64I-NEXT: or a2, a0, a1
4506
+ ; RV64I-NEXT: add a0, a0, a1
4507
+ ; RV64I-NEXT: add a0, a0, a2
4508
+ ; RV64I-NEXT: ret
4509
+ ;
4510
+ ; RV64ZBA-LABEL: add_or_m3:
4511
+ ; RV64ZBA: # %bb.0:
4512
+ ; RV64ZBA-NEXT: li a1, -3
4513
+ ; RV64ZBA-NEXT: zext.w a1, a1
4514
+ ; RV64ZBA-NEXT: or a2, a0, a1
4515
+ ; RV64ZBA-NEXT: add a0, a0, a1
4516
+ ; RV64ZBA-NEXT: add a0, a0, a2
4517
+ ; RV64ZBA-NEXT: ret
4518
+ ;
4519
+ ; RV64XANDESPERF-LABEL: add_or_m3:
4520
+ ; RV64XANDESPERF: # %bb.0:
4521
+ ; RV64XANDESPERF-NEXT: li a1, 1
4522
+ ; RV64XANDESPERF-NEXT: slli a1, a1, 32
4523
+ ; RV64XANDESPERF-NEXT: addi a1, a1, -3
4524
+ ; RV64XANDESPERF-NEXT: or a2, a0, a1
4525
+ ; RV64XANDESPERF-NEXT: add a0, a0, a1
4526
+ ; RV64XANDESPERF-NEXT: add a0, a0, a2
4527
+ ; RV64XANDESPERF-NEXT: ret
4528
+ %a = add i64 %x , 4294967293
4529
+ %o = or i64 %x , 4294967293
4530
+ %c = add i64 %a , %o
4531
+ ret i64 %c
4532
+ }
4533
+
4534
+ define i64 @append_32ones (i64 %x ) {
4535
+ ; CHECK-LABEL: append_32ones:
4536
+ ; CHECK: # %bb.0:
4537
+ ; CHECK-NEXT: slli a0, a0, 32
4538
+ ; CHECK-NEXT: li a1, -1
4539
+ ; CHECK-NEXT: srli a1, a1, 32
4540
+ ; CHECK-NEXT: or a0, a0, a1
4541
+ ; CHECK-NEXT: ret
4542
+ %s = shl i64 %x , 32
4543
+ %o = or i64 %s , 4294967295
4544
+ ret i64 %o
4545
+ }
0 commit comments