Skip to content

Commit 5b5e95c

Browse files
toppercsvs-quic
andcommitted
[RISCV] Add more test cases for Xqcisls scaled load store instructions. NFC
Co-authored-by: Sudharsan Veeravalli <[email protected]>
1 parent ae05dbb commit 5b5e95c

File tree

1 file changed

+318
-0
lines changed

1 file changed

+318
-0
lines changed

llvm/test/CodeGen/RISCV/xqcisls.ll

Lines changed: 318 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)