@@ -205,3 +205,321 @@ define void @sw_ri(i32* %a, i32 %b, i32 %c) {
205
205
store i32 %b , i32* %1
206
206
ret void
207
207
}
208
+
209
+ define i8 @lrb_anyext (ptr %a , i64 %b ) {
210
+ ; RV32I-LABEL: lrb_anyext:
211
+ ; RV32I: # %bb.0:
212
+ ; RV32I-NEXT: add a0, a0, a1
213
+ ; RV32I-NEXT: lbu a0, 0(a0)
214
+ ; RV32I-NEXT: ret
215
+ ;
216
+ ; RV32IZBA-LABEL: lrb_anyext:
217
+ ; RV32IZBA: # %bb.0:
218
+ ; RV32IZBA-NEXT: add a0, a0, a1
219
+ ; RV32IZBA-NEXT: lbu a0, 0(a0)
220
+ ; RV32IZBA-NEXT: ret
221
+ ;
222
+ ; RV32IZBAXQCISLS-LABEL: lrb_anyext:
223
+ ; RV32IZBAXQCISLS: # %bb.0:
224
+ ; RV32IZBAXQCISLS-NEXT: add a0, a0, a1
225
+ ; RV32IZBAXQCISLS-NEXT: lbu a0, 0(a0)
226
+ ; RV32IZBAXQCISLS-NEXT: ret
227
+ %1 = getelementptr i8 , ptr %a , i64 %b
228
+ %2 = load i8 , ptr %1 , align 1
229
+ ret i8 %2
230
+ }
231
+
232
+ define i64 @lrb (ptr %a , i64 %b ) {
233
+ ; RV32I-LABEL: lrb:
234
+ ; RV32I: # %bb.0:
235
+ ; RV32I-NEXT: add a0, a0, a1
236
+ ; RV32I-NEXT: lb a1, 0(a0)
237
+ ; RV32I-NEXT: srai a2, a1, 31
238
+ ; RV32I-NEXT: add a0, a1, a1
239
+ ; RV32I-NEXT: sltu a1, a0, a1
240
+ ; RV32I-NEXT: add a2, a2, a2
241
+ ; RV32I-NEXT: add a1, a2, a1
242
+ ; RV32I-NEXT: ret
243
+ ;
244
+ ; RV32IZBA-LABEL: lrb:
245
+ ; RV32IZBA: # %bb.0:
246
+ ; RV32IZBA-NEXT: add a0, a0, a1
247
+ ; RV32IZBA-NEXT: lb a1, 0(a0)
248
+ ; RV32IZBA-NEXT: srai a2, a1, 31
249
+ ; RV32IZBA-NEXT: add a0, a1, a1
250
+ ; RV32IZBA-NEXT: sltu a1, a0, a1
251
+ ; RV32IZBA-NEXT: add a2, a2, a2
252
+ ; RV32IZBA-NEXT: add a1, a2, a1
253
+ ; RV32IZBA-NEXT: ret
254
+ ;
255
+ ; RV32IZBAXQCISLS-LABEL: lrb:
256
+ ; RV32IZBAXQCISLS: # %bb.0:
257
+ ; RV32IZBAXQCISLS-NEXT: add a0, a0, a1
258
+ ; RV32IZBAXQCISLS-NEXT: lb a1, 0(a0)
259
+ ; RV32IZBAXQCISLS-NEXT: srai a2, a1, 31
260
+ ; RV32IZBAXQCISLS-NEXT: add a0, a1, a1
261
+ ; RV32IZBAXQCISLS-NEXT: sltu a1, a0, a1
262
+ ; RV32IZBAXQCISLS-NEXT: add a2, a2, a2
263
+ ; RV32IZBAXQCISLS-NEXT: add a1, a2, a1
264
+ ; RV32IZBAXQCISLS-NEXT: ret
265
+ %1 = getelementptr i8 , ptr %a , i64 %b
266
+ %2 = load i8 , ptr %1 , align 1
267
+ %3 = sext i8 %2 to i64
268
+ %4 = add i64 %3 , %3
269
+ ret i64 %4
270
+ }
271
+
272
+ define i8 @lurb_anyext (ptr %a , i32 %b ) {
273
+ ; RV32I-LABEL: lurb_anyext:
274
+ ; RV32I: # %bb.0:
275
+ ; RV32I-NEXT: add a0, a0, a1
276
+ ; RV32I-NEXT: lbu a0, 0(a0)
277
+ ; RV32I-NEXT: ret
278
+ ;
279
+ ; RV32IZBA-LABEL: lurb_anyext:
280
+ ; RV32IZBA: # %bb.0:
281
+ ; RV32IZBA-NEXT: add a0, a0, a1
282
+ ; RV32IZBA-NEXT: lbu a0, 0(a0)
283
+ ; RV32IZBA-NEXT: ret
284
+ ;
285
+ ; RV32IZBAXQCISLS-LABEL: lurb_anyext:
286
+ ; RV32IZBAXQCISLS: # %bb.0:
287
+ ; RV32IZBAXQCISLS-NEXT: add a0, a0, a1
288
+ ; RV32IZBAXQCISLS-NEXT: lbu a0, 0(a0)
289
+ ; RV32IZBAXQCISLS-NEXT: ret
290
+ %1 = zext i32 %b to i64
291
+ %2 = getelementptr i8 , ptr %a , i64 %1
292
+ %3 = load i8 , ptr %2 , align 1
293
+ ret i8 %3
294
+ }
295
+
296
+ define i64 @lurb (ptr %a , i32 %b ) {
297
+ ; RV32I-LABEL: lurb:
298
+ ; RV32I: # %bb.0:
299
+ ; RV32I-NEXT: add a0, a0, a1
300
+ ; RV32I-NEXT: lb a1, 0(a0)
301
+ ; RV32I-NEXT: srai a2, a1, 31
302
+ ; RV32I-NEXT: add a0, a1, a1
303
+ ; RV32I-NEXT: sltu a1, a0, a1
304
+ ; RV32I-NEXT: add a2, a2, a2
305
+ ; RV32I-NEXT: add a1, a2, a1
306
+ ; RV32I-NEXT: ret
307
+ ;
308
+ ; RV32IZBA-LABEL: lurb:
309
+ ; RV32IZBA: # %bb.0:
310
+ ; RV32IZBA-NEXT: add a0, a0, a1
311
+ ; RV32IZBA-NEXT: lb a1, 0(a0)
312
+ ; RV32IZBA-NEXT: srai a2, a1, 31
313
+ ; RV32IZBA-NEXT: add a0, a1, a1
314
+ ; RV32IZBA-NEXT: sltu a1, a0, a1
315
+ ; RV32IZBA-NEXT: add a2, a2, a2
316
+ ; RV32IZBA-NEXT: add a1, a2, a1
317
+ ; RV32IZBA-NEXT: ret
318
+ ;
319
+ ; RV32IZBAXQCISLS-LABEL: lurb:
320
+ ; RV32IZBAXQCISLS: # %bb.0:
321
+ ; RV32IZBAXQCISLS-NEXT: add a0, a0, a1
322
+ ; RV32IZBAXQCISLS-NEXT: lb a1, 0(a0)
323
+ ; RV32IZBAXQCISLS-NEXT: srai a2, a1, 31
324
+ ; RV32IZBAXQCISLS-NEXT: add a0, a1, a1
325
+ ; RV32IZBAXQCISLS-NEXT: sltu a1, a0, a1
326
+ ; RV32IZBAXQCISLS-NEXT: add a2, a2, a2
327
+ ; RV32IZBAXQCISLS-NEXT: add a1, a2, a1
328
+ ; RV32IZBAXQCISLS-NEXT: ret
329
+ %1 = zext i32 %b to i64
330
+ %2 = getelementptr i8 , ptr %a , i64 %1
331
+ %3 = load i8 , ptr %2 , align 1
332
+ %4 = sext i8 %3 to i64
333
+ %5 = add i64 %4 , %4
334
+ ret i64 %5
335
+ }
336
+
337
+ define i64 @lrbu (ptr %a , i64 %b ) {
338
+ ; RV32I-LABEL: lrbu:
339
+ ; RV32I: # %bb.0:
340
+ ; RV32I-NEXT: add a0, a0, a1
341
+ ; RV32I-NEXT: lbu a1, 0(a0)
342
+ ; RV32I-NEXT: add a0, a1, a1
343
+ ; RV32I-NEXT: sltu a1, a0, a1
344
+ ; RV32I-NEXT: ret
345
+ ;
346
+ ; RV32IZBA-LABEL: lrbu:
347
+ ; RV32IZBA: # %bb.0:
348
+ ; RV32IZBA-NEXT: add a0, a0, a1
349
+ ; RV32IZBA-NEXT: lbu a1, 0(a0)
350
+ ; RV32IZBA-NEXT: add a0, a1, a1
351
+ ; RV32IZBA-NEXT: sltu a1, a0, a1
352
+ ; RV32IZBA-NEXT: ret
353
+ ;
354
+ ; RV32IZBAXQCISLS-LABEL: lrbu:
355
+ ; RV32IZBAXQCISLS: # %bb.0:
356
+ ; RV32IZBAXQCISLS-NEXT: add a0, a0, a1
357
+ ; RV32IZBAXQCISLS-NEXT: lbu a1, 0(a0)
358
+ ; RV32IZBAXQCISLS-NEXT: add a0, a1, a1
359
+ ; RV32IZBAXQCISLS-NEXT: sltu a1, a0, a1
360
+ ; RV32IZBAXQCISLS-NEXT: ret
361
+ %1 = getelementptr i8 , ptr %a , i64 %b
362
+ %2 = load i8 , ptr %1 , align 1
363
+ %3 = zext i8 %2 to i64
364
+ %4 = add i64 %3 , %3
365
+ ret i64 %4
366
+ }
367
+
368
+ define i64 @lurbu (ptr %a , i32 %b ) {
369
+ ; RV32I-LABEL: lurbu:
370
+ ; RV32I: # %bb.0:
371
+ ; RV32I-NEXT: add a0, a0, a1
372
+ ; RV32I-NEXT: lbu a1, 0(a0)
373
+ ; RV32I-NEXT: add a0, a1, a1
374
+ ; RV32I-NEXT: sltu a1, a0, a1
375
+ ; RV32I-NEXT: ret
376
+ ;
377
+ ; RV32IZBA-LABEL: lurbu:
378
+ ; RV32IZBA: # %bb.0:
379
+ ; RV32IZBA-NEXT: add a0, a0, a1
380
+ ; RV32IZBA-NEXT: lbu a1, 0(a0)
381
+ ; RV32IZBA-NEXT: add a0, a1, a1
382
+ ; RV32IZBA-NEXT: sltu a1, a0, a1
383
+ ; RV32IZBA-NEXT: ret
384
+ ;
385
+ ; RV32IZBAXQCISLS-LABEL: lurbu:
386
+ ; RV32IZBAXQCISLS: # %bb.0:
387
+ ; RV32IZBAXQCISLS-NEXT: add a0, a0, a1
388
+ ; RV32IZBAXQCISLS-NEXT: lbu a1, 0(a0)
389
+ ; RV32IZBAXQCISLS-NEXT: add a0, a1, a1
390
+ ; RV32IZBAXQCISLS-NEXT: sltu a1, a0, a1
391
+ ; RV32IZBAXQCISLS-NEXT: ret
392
+ %1 = zext i32 %b to i64
393
+ %2 = getelementptr i8 , ptr %a , i64 %1
394
+ %3 = load i8 , ptr %2 , align 1
395
+ %4 = zext i8 %3 to i64
396
+ %5 = add i64 %4 , %4
397
+ ret i64 %5
398
+ }
399
+
400
+ define i64 @lrd_2 (ptr %a , i64 %b ) {
401
+ ; RV32I-LABEL: lrd_2:
402
+ ; RV32I: # %bb.0:
403
+ ; RV32I-NEXT: slli a1, a1, 3
404
+ ; RV32I-NEXT: add a0, a1, a0
405
+ ; RV32I-NEXT: lw a1, 96(a0)
406
+ ; RV32I-NEXT: lw a2, 100(a0)
407
+ ; RV32I-NEXT: add a0, a1, a1
408
+ ; RV32I-NEXT: sltu a1, a0, a1
409
+ ; RV32I-NEXT: add a2, a2, a2
410
+ ; RV32I-NEXT: add a1, a2, a1
411
+ ; RV32I-NEXT: ret
412
+ ;
413
+ ; RV32IZBA-LABEL: lrd_2:
414
+ ; RV32IZBA: # %bb.0:
415
+ ; RV32IZBA-NEXT: sh3add a0, a1, a0
416
+ ; RV32IZBA-NEXT: lw a1, 96(a0)
417
+ ; RV32IZBA-NEXT: lw a2, 100(a0)
418
+ ; RV32IZBA-NEXT: add a0, a1, a1
419
+ ; RV32IZBA-NEXT: sltu a1, a0, a1
420
+ ; RV32IZBA-NEXT: add a2, a2, a2
421
+ ; RV32IZBA-NEXT: add a1, a2, a1
422
+ ; RV32IZBA-NEXT: ret
423
+ ;
424
+ ; RV32IZBAXQCISLS-LABEL: lrd_2:
425
+ ; RV32IZBAXQCISLS: # %bb.0:
426
+ ; RV32IZBAXQCISLS-NEXT: sh3add a0, a1, a0
427
+ ; RV32IZBAXQCISLS-NEXT: lw a1, 96(a0)
428
+ ; RV32IZBAXQCISLS-NEXT: lw a2, 100(a0)
429
+ ; RV32IZBAXQCISLS-NEXT: add a0, a1, a1
430
+ ; RV32IZBAXQCISLS-NEXT: sltu a1, a0, a1
431
+ ; RV32IZBAXQCISLS-NEXT: add a2, a2, a2
432
+ ; RV32IZBAXQCISLS-NEXT: add a1, a2, a1
433
+ ; RV32IZBAXQCISLS-NEXT: ret
434
+ %1 = add i64 %b , 12
435
+ %2 = getelementptr i64 , ptr %a , i64 %1
436
+ %3 = load i64 , ptr %2 , align 8
437
+ %4 = add i64 %3 , %3
438
+ ret i64 %4
439
+ }
440
+
441
+ define void @srb (ptr %a , i64 %b , i8 %c ) {
442
+ ; RV32I-LABEL: srb:
443
+ ; RV32I: # %bb.0:
444
+ ; RV32I-NEXT: add a3, a3, a3
445
+ ; RV32I-NEXT: add a0, a0, a1
446
+ ; RV32I-NEXT: sb a3, 0(a0)
447
+ ; RV32I-NEXT: ret
448
+ ;
449
+ ; RV32IZBA-LABEL: srb:
450
+ ; RV32IZBA: # %bb.0:
451
+ ; RV32IZBA-NEXT: add a3, a3, a3
452
+ ; RV32IZBA-NEXT: add a0, a0, a1
453
+ ; RV32IZBA-NEXT: sb a3, 0(a0)
454
+ ; RV32IZBA-NEXT: ret
455
+ ;
456
+ ; RV32IZBAXQCISLS-LABEL: srb:
457
+ ; RV32IZBAXQCISLS: # %bb.0:
458
+ ; RV32IZBAXQCISLS-NEXT: add a3, a3, a3
459
+ ; RV32IZBAXQCISLS-NEXT: add a0, a0, a1
460
+ ; RV32IZBAXQCISLS-NEXT: sb a3, 0(a0)
461
+ ; RV32IZBAXQCISLS-NEXT: ret
462
+ %1 = add i8 %c , %c
463
+ %2 = getelementptr i8 , ptr %a , i64 %b
464
+ store i8 %1 , ptr %2 , align 1
465
+ ret void
466
+ }
467
+
468
+ define void @surb (ptr %a , i32 %b , i8 %c ) {
469
+ ; RV32I-LABEL: surb:
470
+ ; RV32I: # %bb.0:
471
+ ; RV32I-NEXT: add a2, a2, a2
472
+ ; RV32I-NEXT: add a0, a0, a1
473
+ ; RV32I-NEXT: sb a2, 0(a0)
474
+ ; RV32I-NEXT: ret
475
+ ;
476
+ ; RV32IZBA-LABEL: surb:
477
+ ; RV32IZBA: # %bb.0:
478
+ ; RV32IZBA-NEXT: add a2, a2, a2
479
+ ; RV32IZBA-NEXT: add a0, a0, a1
480
+ ; RV32IZBA-NEXT: sb a2, 0(a0)
481
+ ; RV32IZBA-NEXT: ret
482
+ ;
483
+ ; RV32IZBAXQCISLS-LABEL: surb:
484
+ ; RV32IZBAXQCISLS: # %bb.0:
485
+ ; RV32IZBAXQCISLS-NEXT: add a2, a2, a2
486
+ ; RV32IZBAXQCISLS-NEXT: add a0, a0, a1
487
+ ; RV32IZBAXQCISLS-NEXT: sb a2, 0(a0)
488
+ ; RV32IZBAXQCISLS-NEXT: ret
489
+ %1 = zext i32 %b to i64
490
+ %2 = add i8 %c , %c
491
+ %3 = getelementptr i8 , ptr %a , i64 %1
492
+ store i8 %2 , ptr %3 , align 1
493
+ ret void
494
+ }
495
+
496
+ define i64 @lrd_large_shift (ptr %a , i64 %b ) {
497
+ ; RV32I-LABEL: lrd_large_shift:
498
+ ; RV32I: # %bb.0:
499
+ ; RV32I-NEXT: slli a1, a1, 5
500
+ ; RV32I-NEXT: add a1, a1, a0
501
+ ; RV32I-NEXT: lw a0, 384(a1)
502
+ ; RV32I-NEXT: lw a1, 388(a1)
503
+ ; RV32I-NEXT: ret
504
+ ;
505
+ ; RV32IZBA-LABEL: lrd_large_shift:
506
+ ; RV32IZBA: # %bb.0:
507
+ ; RV32IZBA-NEXT: slli a1, a1, 5
508
+ ; RV32IZBA-NEXT: add a1, a1, a0
509
+ ; RV32IZBA-NEXT: lw a0, 384(a1)
510
+ ; RV32IZBA-NEXT: lw a1, 388(a1)
511
+ ; RV32IZBA-NEXT: ret
512
+ ;
513
+ ; RV32IZBAXQCISLS-LABEL: lrd_large_shift:
514
+ ; RV32IZBAXQCISLS: # %bb.0:
515
+ ; RV32IZBAXQCISLS-NEXT: slli a1, a1, 5
516
+ ; RV32IZBAXQCISLS-NEXT: add a1, a1, a0
517
+ ; RV32IZBAXQCISLS-NEXT: lw a0, 384(a1)
518
+ ; RV32IZBAXQCISLS-NEXT: lw a1, 388(a1)
519
+ ; RV32IZBAXQCISLS-NEXT: ret
520
+ %1 = add i64 %b , 12
521
+ %2 = shl i64 %1 , 2
522
+ %3 = getelementptr i64 , ptr %a , i64 %2
523
+ %4 = load i64 , ptr %3 , align 8
524
+ ret i64 %4
525
+ }
0 commit comments