@@ -205,3 +205,321 @@ define void @sw_ri(i32* %a, i32 %b, i32 %c) {
205205 store i32 %b , i32* %1
206206 ret void
207207}
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