@@ -4411,3 +4411,135 @@ define ptr @udiv1280_gep(ptr %p, i16 zeroext %i) {
44114411 %add.ptr = getelementptr i64 , ptr %p , i64 %idx.ext
44124412 ret ptr %add.ptr
44134413}
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