Skip to content

Commit 25cd4c0

Browse files
committed
[LoongArch] Add test cases for atomic cmpxchg monotonic
1 parent b4343ab commit 25cd4c0

File tree

1 file changed

+346
-0
lines changed

1 file changed

+346
-0
lines changed

llvm/test/CodeGen/LoongArch/ir-instruction/atomic-cmpxchg.ll

Lines changed: 346 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,3 +346,349 @@ define i1 @cmpxchg_i64_acquire_acquire_reti1(ptr %ptr, i64 %cmp, i64 %val) nounw
346346
%res = extractvalue { i64, i1 } %tmp, 1
347347
ret i1 %res
348348
}
349+
350+
define void @cmpxchg_i8_monotonic_monotonic(ptr %ptr, i8 %cmp, i8 %val) nounwind {
351+
; LA64-LABEL: cmpxchg_i8_monotonic_monotonic:
352+
; LA64: # %bb.0:
353+
; LA64-NEXT: andi $a1, $a1, 255
354+
; LA64-NEXT: slli.d $a3, $a0, 3
355+
; LA64-NEXT: sll.w $a1, $a1, $a3
356+
; LA64-NEXT: andi $a2, $a2, 255
357+
; LA64-NEXT: sll.w $a2, $a2, $a3
358+
; LA64-NEXT: ori $a4, $zero, 255
359+
; LA64-NEXT: sll.w $a3, $a4, $a3
360+
; LA64-NEXT: addi.w $a3, $a3, 0
361+
; LA64-NEXT: addi.w $a2, $a2, 0
362+
; LA64-NEXT: addi.w $a1, $a1, 0
363+
; LA64-NEXT: bstrins.d $a0, $zero, 1, 0
364+
; LA64-NEXT: .LBB12_1: # =>This Inner Loop Header: Depth=1
365+
; LA64-NEXT: ll.w $a4, $a0, 0
366+
; LA64-NEXT: and $a5, $a4, $a3
367+
; LA64-NEXT: bne $a5, $a1, .LBB12_3
368+
; LA64-NEXT: # %bb.2: # in Loop: Header=BB12_1 Depth=1
369+
; LA64-NEXT: dbar 0
370+
; LA64-NEXT: andn $a5, $a4, $a3
371+
; LA64-NEXT: or $a5, $a5, $a2
372+
; LA64-NEXT: sc.w $a5, $a0, 0
373+
; LA64-NEXT: beqz $a5, .LBB12_1
374+
; LA64-NEXT: b .LBB12_4
375+
; LA64-NEXT: .LBB12_3:
376+
; LA64-NEXT: dbar 1792
377+
; LA64-NEXT: .LBB12_4:
378+
; LA64-NEXT: ret
379+
%res = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic
380+
ret void
381+
}
382+
383+
define void @cmpxchg_i16_monotonic_monotonic(ptr %ptr, i16 %cmp, i16 %val) nounwind {
384+
; LA64-LABEL: cmpxchg_i16_monotonic_monotonic:
385+
; LA64: # %bb.0:
386+
; LA64-NEXT: bstrpick.d $a1, $a1, 15, 0
387+
; LA64-NEXT: slli.d $a3, $a0, 3
388+
; LA64-NEXT: sll.w $a1, $a1, $a3
389+
; LA64-NEXT: bstrpick.d $a2, $a2, 15, 0
390+
; LA64-NEXT: sll.w $a2, $a2, $a3
391+
; LA64-NEXT: lu12i.w $a4, 15
392+
; LA64-NEXT: ori $a4, $a4, 4095
393+
; LA64-NEXT: sll.w $a3, $a4, $a3
394+
; LA64-NEXT: addi.w $a3, $a3, 0
395+
; LA64-NEXT: addi.w $a2, $a2, 0
396+
; LA64-NEXT: addi.w $a1, $a1, 0
397+
; LA64-NEXT: bstrins.d $a0, $zero, 1, 0
398+
; LA64-NEXT: .LBB13_1: # =>This Inner Loop Header: Depth=1
399+
; LA64-NEXT: ll.w $a4, $a0, 0
400+
; LA64-NEXT: and $a5, $a4, $a3
401+
; LA64-NEXT: bne $a5, $a1, .LBB13_3
402+
; LA64-NEXT: # %bb.2: # in Loop: Header=BB13_1 Depth=1
403+
; LA64-NEXT: dbar 0
404+
; LA64-NEXT: andn $a5, $a4, $a3
405+
; LA64-NEXT: or $a5, $a5, $a2
406+
; LA64-NEXT: sc.w $a5, $a0, 0
407+
; LA64-NEXT: beqz $a5, .LBB13_1
408+
; LA64-NEXT: b .LBB13_4
409+
; LA64-NEXT: .LBB13_3:
410+
; LA64-NEXT: dbar 1792
411+
; LA64-NEXT: .LBB13_4:
412+
; LA64-NEXT: ret
413+
%res = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic
414+
ret void
415+
}
416+
417+
define void @cmpxchg_i32_monotonic_monotonic(ptr %ptr, i32 %cmp, i32 %val) nounwind {
418+
; LA64-LABEL: cmpxchg_i32_monotonic_monotonic:
419+
; LA64: # %bb.0:
420+
; LA64-NEXT: .LBB14_1: # =>This Inner Loop Header: Depth=1
421+
; LA64-NEXT: ll.w $a3, $a0, 0
422+
; LA64-NEXT: bne $a3, $a1, .LBB14_3
423+
; LA64-NEXT: # %bb.2: # in Loop: Header=BB14_1 Depth=1
424+
; LA64-NEXT: dbar 0
425+
; LA64-NEXT: move $a4, $a2
426+
; LA64-NEXT: sc.w $a4, $a0, 0
427+
; LA64-NEXT: beqz $a4, .LBB14_1
428+
; LA64-NEXT: b .LBB14_4
429+
; LA64-NEXT: .LBB14_3:
430+
; LA64-NEXT: dbar 1792
431+
; LA64-NEXT: .LBB14_4:
432+
; LA64-NEXT: ret
433+
%res = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
434+
ret void
435+
}
436+
437+
define void @cmpxchg_i64_monotonic_monotonic(ptr %ptr, i64 %cmp, i64 %val) nounwind {
438+
; LA64-LABEL: cmpxchg_i64_monotonic_monotonic:
439+
; LA64: # %bb.0:
440+
; LA64-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1
441+
; LA64-NEXT: ll.d $a3, $a0, 0
442+
; LA64-NEXT: bne $a3, $a1, .LBB15_3
443+
; LA64-NEXT: # %bb.2: # in Loop: Header=BB15_1 Depth=1
444+
; LA64-NEXT: dbar 0
445+
; LA64-NEXT: move $a4, $a2
446+
; LA64-NEXT: sc.d $a4, $a0, 0
447+
; LA64-NEXT: beqz $a4, .LBB15_1
448+
; LA64-NEXT: b .LBB15_4
449+
; LA64-NEXT: .LBB15_3:
450+
; LA64-NEXT: dbar 1792
451+
; LA64-NEXT: .LBB15_4:
452+
; LA64-NEXT: ret
453+
%res = cmpxchg ptr %ptr, i64 %cmp, i64 %val monotonic monotonic
454+
ret void
455+
}
456+
457+
define i8 @cmpxchg_i8_monotonic_monotonic_reti8(ptr %ptr, i8 %cmp, i8 %val) nounwind {
458+
; LA64-LABEL: cmpxchg_i8_monotonic_monotonic_reti8:
459+
; LA64: # %bb.0:
460+
; LA64-NEXT: slli.d $a3, $a0, 3
461+
; LA64-NEXT: ori $a4, $zero, 255
462+
; LA64-NEXT: sll.w $a4, $a4, $a3
463+
; LA64-NEXT: andi $a2, $a2, 255
464+
; LA64-NEXT: addi.w $a4, $a4, 0
465+
; LA64-NEXT: sll.w $a2, $a2, $a3
466+
; LA64-NEXT: addi.w $a2, $a2, 0
467+
; LA64-NEXT: andi $a1, $a1, 255
468+
; LA64-NEXT: sll.w $a1, $a1, $a3
469+
; LA64-NEXT: addi.w $a1, $a1, 0
470+
; LA64-NEXT: bstrins.d $a0, $zero, 1, 0
471+
; LA64-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1
472+
; LA64-NEXT: ll.w $a5, $a0, 0
473+
; LA64-NEXT: and $a6, $a5, $a4
474+
; LA64-NEXT: bne $a6, $a1, .LBB16_3
475+
; LA64-NEXT: # %bb.2: # in Loop: Header=BB16_1 Depth=1
476+
; LA64-NEXT: dbar 0
477+
; LA64-NEXT: andn $a6, $a5, $a4
478+
; LA64-NEXT: or $a6, $a6, $a2
479+
; LA64-NEXT: sc.w $a6, $a0, 0
480+
; LA64-NEXT: beqz $a6, .LBB16_1
481+
; LA64-NEXT: b .LBB16_4
482+
; LA64-NEXT: .LBB16_3:
483+
; LA64-NEXT: dbar 1792
484+
; LA64-NEXT: .LBB16_4:
485+
; LA64-NEXT: srl.w $a0, $a5, $a3
486+
; LA64-NEXT: ret
487+
%tmp = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic
488+
%res = extractvalue { i8, i1 } %tmp, 0
489+
ret i8 %res
490+
}
491+
492+
define i16 @cmpxchg_i16_monotonic_monotonic_reti16(ptr %ptr, i16 %cmp, i16 %val) nounwind {
493+
; LA64-LABEL: cmpxchg_i16_monotonic_monotonic_reti16:
494+
; LA64: # %bb.0:
495+
; LA64-NEXT: lu12i.w $a3, 15
496+
; LA64-NEXT: ori $a3, $a3, 4095
497+
; LA64-NEXT: slli.d $a4, $a0, 3
498+
; LA64-NEXT: sll.w $a3, $a3, $a4
499+
; LA64-NEXT: bstrpick.d $a2, $a2, 15, 0
500+
; LA64-NEXT: addi.w $a3, $a3, 0
501+
; LA64-NEXT: sll.w $a2, $a2, $a4
502+
; LA64-NEXT: addi.w $a2, $a2, 0
503+
; LA64-NEXT: bstrpick.d $a1, $a1, 15, 0
504+
; LA64-NEXT: sll.w $a1, $a1, $a4
505+
; LA64-NEXT: addi.w $a1, $a1, 0
506+
; LA64-NEXT: bstrins.d $a0, $zero, 1, 0
507+
; LA64-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1
508+
; LA64-NEXT: ll.w $a5, $a0, 0
509+
; LA64-NEXT: and $a6, $a5, $a3
510+
; LA64-NEXT: bne $a6, $a1, .LBB17_3
511+
; LA64-NEXT: # %bb.2: # in Loop: Header=BB17_1 Depth=1
512+
; LA64-NEXT: dbar 0
513+
; LA64-NEXT: andn $a6, $a5, $a3
514+
; LA64-NEXT: or $a6, $a6, $a2
515+
; LA64-NEXT: sc.w $a6, $a0, 0
516+
; LA64-NEXT: beqz $a6, .LBB17_1
517+
; LA64-NEXT: b .LBB17_4
518+
; LA64-NEXT: .LBB17_3:
519+
; LA64-NEXT: dbar 1792
520+
; LA64-NEXT: .LBB17_4:
521+
; LA64-NEXT: srl.w $a0, $a5, $a4
522+
; LA64-NEXT: ret
523+
%tmp = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic
524+
%res = extractvalue { i16, i1 } %tmp, 0
525+
ret i16 %res
526+
}
527+
528+
define i32 @cmpxchg_i32_monotonic_monotonic_reti32(ptr %ptr, i32 %cmp, i32 %val) nounwind {
529+
; LA64-LABEL: cmpxchg_i32_monotonic_monotonic_reti32:
530+
; LA64: # %bb.0:
531+
; LA64-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1
532+
; LA64-NEXT: ll.w $a3, $a0, 0
533+
; LA64-NEXT: bne $a3, $a1, .LBB18_3
534+
; LA64-NEXT: # %bb.2: # in Loop: Header=BB18_1 Depth=1
535+
; LA64-NEXT: dbar 0
536+
; LA64-NEXT: move $a4, $a2
537+
; LA64-NEXT: sc.w $a4, $a0, 0
538+
; LA64-NEXT: beqz $a4, .LBB18_1
539+
; LA64-NEXT: b .LBB18_4
540+
; LA64-NEXT: .LBB18_3:
541+
; LA64-NEXT: dbar 1792
542+
; LA64-NEXT: .LBB18_4:
543+
; LA64-NEXT: move $a0, $a3
544+
; LA64-NEXT: ret
545+
%tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
546+
%res = extractvalue { i32, i1 } %tmp, 0
547+
ret i32 %res
548+
}
549+
550+
define i64 @cmpxchg_i64_monotonic_monotonic_reti64(ptr %ptr, i64 %cmp, i64 %val) nounwind {
551+
; LA64-LABEL: cmpxchg_i64_monotonic_monotonic_reti64:
552+
; LA64: # %bb.0:
553+
; LA64-NEXT: .LBB19_1: # =>This Inner Loop Header: Depth=1
554+
; LA64-NEXT: ll.d $a3, $a0, 0
555+
; LA64-NEXT: bne $a3, $a1, .LBB19_3
556+
; LA64-NEXT: # %bb.2: # in Loop: Header=BB19_1 Depth=1
557+
; LA64-NEXT: dbar 0
558+
; LA64-NEXT: move $a4, $a2
559+
; LA64-NEXT: sc.d $a4, $a0, 0
560+
; LA64-NEXT: beqz $a4, .LBB19_1
561+
; LA64-NEXT: b .LBB19_4
562+
; LA64-NEXT: .LBB19_3:
563+
; LA64-NEXT: dbar 1792
564+
; LA64-NEXT: .LBB19_4:
565+
; LA64-NEXT: move $a0, $a3
566+
; LA64-NEXT: ret
567+
%tmp = cmpxchg ptr %ptr, i64 %cmp, i64 %val monotonic monotonic
568+
%res = extractvalue { i64, i1 } %tmp, 0
569+
ret i64 %res
570+
}
571+
572+
define i1 @cmpxchg_i8_monotonic_monotonic_reti1(ptr %ptr, i8 %cmp, i8 %val) nounwind {
573+
; LA64-LABEL: cmpxchg_i8_monotonic_monotonic_reti1:
574+
; LA64: # %bb.0:
575+
; LA64-NEXT: andi $a1, $a1, 255
576+
; LA64-NEXT: slli.d $a3, $a0, 3
577+
; LA64-NEXT: ori $a4, $zero, 255
578+
; LA64-NEXT: sll.w $a4, $a4, $a3
579+
; LA64-NEXT: sll.w $a1, $a1, $a3
580+
; LA64-NEXT: andi $a2, $a2, 255
581+
; LA64-NEXT: sll.w $a2, $a2, $a3
582+
; LA64-NEXT: addi.w $a2, $a2, 0
583+
; LA64-NEXT: addi.w $a1, $a1, 0
584+
; LA64-NEXT: bstrins.d $a0, $zero, 1, 0
585+
; LA64-NEXT: addi.w $a3, $a4, 0
586+
; LA64-NEXT: .LBB20_1: # =>This Inner Loop Header: Depth=1
587+
; LA64-NEXT: ll.w $a5, $a0, 0
588+
; LA64-NEXT: and $a6, $a5, $a3
589+
; LA64-NEXT: bne $a6, $a1, .LBB20_3
590+
; LA64-NEXT: # %bb.2: # in Loop: Header=BB20_1 Depth=1
591+
; LA64-NEXT: dbar 0
592+
; LA64-NEXT: andn $a6, $a5, $a3
593+
; LA64-NEXT: or $a6, $a6, $a2
594+
; LA64-NEXT: sc.w $a6, $a0, 0
595+
; LA64-NEXT: beqz $a6, .LBB20_1
596+
; LA64-NEXT: b .LBB20_4
597+
; LA64-NEXT: .LBB20_3:
598+
; LA64-NEXT: dbar 1792
599+
; LA64-NEXT: .LBB20_4:
600+
; LA64-NEXT: and $a0, $a5, $a4
601+
; LA64-NEXT: addi.w $a0, $a0, 0
602+
; LA64-NEXT: xor $a0, $a1, $a0
603+
; LA64-NEXT: sltui $a0, $a0, 1
604+
; LA64-NEXT: ret
605+
%tmp = cmpxchg ptr %ptr, i8 %cmp, i8 %val monotonic monotonic
606+
%res = extractvalue { i8, i1 } %tmp, 1
607+
ret i1 %res
608+
}
609+
610+
define i1 @cmpxchg_i16_monotonic_monotonic_reti1(ptr %ptr, i16 %cmp, i16 %val) nounwind {
611+
; LA64-LABEL: cmpxchg_i16_monotonic_monotonic_reti1:
612+
; LA64: # %bb.0:
613+
; LA64-NEXT: bstrpick.d $a1, $a1, 15, 0
614+
; LA64-NEXT: lu12i.w $a3, 15
615+
; LA64-NEXT: ori $a3, $a3, 4095
616+
; LA64-NEXT: slli.d $a4, $a0, 3
617+
; LA64-NEXT: sll.w $a3, $a3, $a4
618+
; LA64-NEXT: sll.w $a1, $a1, $a4
619+
; LA64-NEXT: bstrpick.d $a2, $a2, 15, 0
620+
; LA64-NEXT: sll.w $a2, $a2, $a4
621+
; LA64-NEXT: addi.w $a2, $a2, 0
622+
; LA64-NEXT: addi.w $a1, $a1, 0
623+
; LA64-NEXT: bstrins.d $a0, $zero, 1, 0
624+
; LA64-NEXT: addi.w $a4, $a3, 0
625+
; LA64-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1
626+
; LA64-NEXT: ll.w $a5, $a0, 0
627+
; LA64-NEXT: and $a6, $a5, $a4
628+
; LA64-NEXT: bne $a6, $a1, .LBB21_3
629+
; LA64-NEXT: # %bb.2: # in Loop: Header=BB21_1 Depth=1
630+
; LA64-NEXT: dbar 0
631+
; LA64-NEXT: andn $a6, $a5, $a4
632+
; LA64-NEXT: or $a6, $a6, $a2
633+
; LA64-NEXT: sc.w $a6, $a0, 0
634+
; LA64-NEXT: beqz $a6, .LBB21_1
635+
; LA64-NEXT: b .LBB21_4
636+
; LA64-NEXT: .LBB21_3:
637+
; LA64-NEXT: dbar 1792
638+
; LA64-NEXT: .LBB21_4:
639+
; LA64-NEXT: and $a0, $a5, $a3
640+
; LA64-NEXT: addi.w $a0, $a0, 0
641+
; LA64-NEXT: xor $a0, $a1, $a0
642+
; LA64-NEXT: sltui $a0, $a0, 1
643+
; LA64-NEXT: ret
644+
%tmp = cmpxchg ptr %ptr, i16 %cmp, i16 %val monotonic monotonic
645+
%res = extractvalue { i16, i1 } %tmp, 1
646+
ret i1 %res
647+
}
648+
649+
define i1 @cmpxchg_i32_monotonic_monotonic_reti1(ptr %ptr, i32 %cmp, i32 %val) nounwind {
650+
; LA64-LABEL: cmpxchg_i32_monotonic_monotonic_reti1:
651+
; LA64: # %bb.0:
652+
; LA64-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1
653+
; LA64-NEXT: ll.w $a3, $a0, 0
654+
; LA64-NEXT: bne $a3, $a1, .LBB22_3
655+
; LA64-NEXT: # %bb.2: # in Loop: Header=BB22_1 Depth=1
656+
; LA64-NEXT: dbar 0
657+
; LA64-NEXT: move $a4, $a2
658+
; LA64-NEXT: sc.w $a4, $a0, 0
659+
; LA64-NEXT: beqz $a4, .LBB22_1
660+
; LA64-NEXT: b .LBB22_4
661+
; LA64-NEXT: .LBB22_3:
662+
; LA64-NEXT: dbar 1792
663+
; LA64-NEXT: .LBB22_4:
664+
; LA64-NEXT: addi.w $a0, $a1, 0
665+
; LA64-NEXT: xor $a0, $a3, $a0
666+
; LA64-NEXT: sltui $a0, $a0, 1
667+
; LA64-NEXT: ret
668+
%tmp = cmpxchg ptr %ptr, i32 %cmp, i32 %val monotonic monotonic
669+
%res = extractvalue { i32, i1 } %tmp, 1
670+
ret i1 %res
671+
}
672+
673+
define i1 @cmpxchg_i64_monotonic_monotonic_reti1(ptr %ptr, i64 %cmp, i64 %val) nounwind {
674+
; LA64-LABEL: cmpxchg_i64_monotonic_monotonic_reti1:
675+
; LA64: # %bb.0:
676+
; LA64-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1
677+
; LA64-NEXT: ll.d $a3, $a0, 0
678+
; LA64-NEXT: bne $a3, $a1, .LBB23_3
679+
; LA64-NEXT: # %bb.2: # in Loop: Header=BB23_1 Depth=1
680+
; LA64-NEXT: dbar 0
681+
; LA64-NEXT: move $a4, $a2
682+
; LA64-NEXT: sc.d $a4, $a0, 0
683+
; LA64-NEXT: beqz $a4, .LBB23_1
684+
; LA64-NEXT: b .LBB23_4
685+
; LA64-NEXT: .LBB23_3:
686+
; LA64-NEXT: dbar 1792
687+
; LA64-NEXT: .LBB23_4:
688+
; LA64-NEXT: xor $a0, $a3, $a1
689+
; LA64-NEXT: sltui $a0, $a0, 1
690+
; LA64-NEXT: ret
691+
%tmp = cmpxchg ptr %ptr, i64 %cmp, i64 %val monotonic monotonic
692+
%res = extractvalue { i64, i1 } %tmp, 1
693+
ret i1 %res
694+
}

0 commit comments

Comments
 (0)