@@ -4274,3 +4274,92 @@ entry:
4274
4274
%and = and i64 %add , 4294967295
4275
4275
ret i64 %and
4276
4276
}
4277
+
4278
+ define ptr @shl_and_gep (ptr %p , i64 %i ) {
4279
+ ; CHECK-LABEL: shl_and_gep:
4280
+ ; CHECK: # %bb.0:
4281
+ ; CHECK-NEXT: srliw a1, a1, 2
4282
+ ; CHECK-NEXT: slli a1, a1, 3
4283
+ ; CHECK-NEXT: add a0, a0, a1
4284
+ ; CHECK-NEXT: ret
4285
+ %shl = shl i64 %i , 1
4286
+ %and = and i64 %shl , 8589934584
4287
+ %gep = getelementptr i8 , ptr %p , i64 %and
4288
+ ret ptr %gep
4289
+ }
4290
+
4291
+ define ptr @shr_and_gep (ptr %p , i64 %i ) {
4292
+ ; CHECK-LABEL: shr_and_gep:
4293
+ ; CHECK: # %bb.0:
4294
+ ; CHECK-NEXT: srliw a1, a1, 6
4295
+ ; CHECK-NEXT: slli a1, a1, 1
4296
+ ; CHECK-NEXT: add a0, a0, a1
4297
+ ; CHECK-NEXT: ret
4298
+ %lshr = lshr i64 %i , 6
4299
+ %and = and i64 %lshr , 67108863
4300
+ %gep = getelementptr i16 , ptr %p , i64 %and
4301
+ ret ptr %gep
4302
+ }
4303
+
4304
+ define ptr @slt_select_gep (ptr %p , i32 %y ) {
4305
+ ; CHECK-LABEL: slt_select_gep:
4306
+ ; CHECK: # %bb.0:
4307
+ ; CHECK-NEXT: srli a1, a1, 28
4308
+ ; CHECK-NEXT: andi a1, a1, 8
4309
+ ; CHECK-NEXT: add a0, a0, a1
4310
+ ; CHECK-NEXT: addi a0, a0, 16
4311
+ ; CHECK-NEXT: ret
4312
+ %cmp = icmp slt i32 %y , 0
4313
+ %select = select i1 %cmp , i64 24 , i64 16
4314
+ %gep = getelementptr i8 , ptr %p , i64 %select
4315
+ ret ptr %gep
4316
+ }
4317
+
4318
+ define i32 @shr_and_add (i32 %x , i32 %y ) {
4319
+ ; CHECK-LABEL: shr_and_add:
4320
+ ; CHECK: # %bb.0:
4321
+ ; CHECK-NEXT: srliw a1, a1, 9
4322
+ ; CHECK-NEXT: slli a1, a1, 2
4323
+ ; CHECK-NEXT: addw a0, a0, a1
4324
+ ; CHECK-NEXT: ret
4325
+ %lshr = lshr i32 %y , 7
4326
+ %and = and i32 %lshr , 33554428
4327
+ %add = add i32 %x , %and
4328
+ ret i32 %add
4329
+ }
4330
+
4331
+ define ptr @udiv1280_gep (ptr %p , i16 zeroext %i ) {
4332
+ ; RV64I-LABEL: udiv1280_gep:
4333
+ ; RV64I: # %bb.0:
4334
+ ; RV64I-NEXT: lui a2, 13
4335
+ ; RV64I-NEXT: addi a2, a2, -819
4336
+ ; RV64I-NEXT: mul a1, a1, a2
4337
+ ; RV64I-NEXT: srliw a1, a1, 26
4338
+ ; RV64I-NEXT: slli a1, a1, 3
4339
+ ; RV64I-NEXT: add a0, a0, a1
4340
+ ; RV64I-NEXT: ret
4341
+ ;
4342
+ ; RV64ZBA-LABEL: udiv1280_gep:
4343
+ ; RV64ZBA: # %bb.0:
4344
+ ; RV64ZBA-NEXT: lui a2, 13
4345
+ ; RV64ZBA-NEXT: addi a2, a2, -819
4346
+ ; RV64ZBA-NEXT: mul a1, a1, a2
4347
+ ; RV64ZBA-NEXT: srli a1, a1, 23
4348
+ ; RV64ZBA-NEXT: srliw a1, a1, 3
4349
+ ; RV64ZBA-NEXT: sh3add.uw a0, a1, a0
4350
+ ; RV64ZBA-NEXT: ret
4351
+ ;
4352
+ ; RV64XANDESPERF-LABEL: udiv1280_gep:
4353
+ ; RV64XANDESPERF: # %bb.0:
4354
+ ; RV64XANDESPERF-NEXT: lui a2, 13
4355
+ ; RV64XANDESPERF-NEXT: addi a2, a2, -819
4356
+ ; RV64XANDESPERF-NEXT: mul a1, a1, a2
4357
+ ; RV64XANDESPERF-NEXT: srli a1, a1, 23
4358
+ ; RV64XANDESPERF-NEXT: srliw a1, a1, 3
4359
+ ; RV64XANDESPERF-NEXT: nds.lea.d.ze a0, a0, a1
4360
+ ; RV64XANDESPERF-NEXT: ret
4361
+ %udiv = udiv i16 %i , 1280
4362
+ %idx.ext = zext nneg i16 %udiv to i64
4363
+ %add.ptr = getelementptr i64 , ptr %p , i64 %idx.ext
4364
+ ret ptr %add.ptr
4365
+ }
0 commit comments