; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 ; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 | FileCheck %s ; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-ibm-aix -mcpu=pwr8 | FileCheck %s define i64 @rldimi1(i64 %a) { ; CHECK-LABEL: rldimi1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: rldimi 3, 3, 8, 0 ; CHECK-NEXT: blr entry: %x0 = shl i64 %a, 8 %x1 = and i64 %a, 255 %x2 = or i64 %x0, %x1 ret i64 %x2 } define i64 @rldimi2(i64 %a) { ; CHECK-LABEL: rldimi2: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: mr 4, 3 ; CHECK-NEXT: rlwimi 4, 3, 8, 16, 23 ; CHECK-NEXT: rlwimi 4, 3, 16, 8, 15 ; CHECK-NEXT: rldimi 4, 3, 24, 0 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr entry: %x0 = shl i64 %a, 8 %x1 = and i64 %a, 255 %x2 = or i64 %x0, %x1 %x3 = shl i64 %x2, 16 %x4 = and i64 %x2, 65535 %x5 = or i64 %x3, %x4 ret i64 %x5 } define i64 @rldimi3(i64 %a) { ; CHECK-LABEL: rldimi3: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: rotldi 4, 3, 32 ; CHECK-NEXT: rlwimi 4, 3, 0, 24, 31 ; CHECK-NEXT: rlwimi 4, 3, 8, 16, 23 ; CHECK-NEXT: rlwimi 4, 3, 16, 8, 15 ; CHECK-NEXT: rlwimi 4, 3, 24, 0, 7 ; CHECK-NEXT: rldimi 4, 3, 40, 16 ; CHECK-NEXT: rldimi 4, 3, 48, 8 ; CHECK-NEXT: rldimi 4, 3, 56, 0 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr entry: %0 = shl i64 %a, 8 %1 = and i64 %a, 255 %2 = or i64 %0, %1 %3 = shl i64 %2, 16 %4 = and i64 %2, 65535 %5 = or i64 %3, %4 %6 = shl i64 %5, 32 %7 = and i64 %5, 4294967295 %8 = or i64 %6, %7 ret i64 %8 } define i64 @rldimi4(i64 %a) { ; CHECK-LABEL: rldimi4: ; CHECK: # %bb.0: ; CHECK-NEXT: rldimi 3, 3, 8, 0 ; CHECK-NEXT: rldimi 3, 3, 16, 0 ; CHECK-NEXT: rldimi 3, 3, 32, 0 ; CHECK-NEXT: blr %r1 = call i64 @llvm.ppc.rldimi(i64 %a, i64 %a, i32 8, i64 -256) %r2 = call i64 @llvm.ppc.rldimi(i64 %r1, i64 %r1, i32 16, i64 -65536) %r3 = call i64 @llvm.ppc.rldimi(i64 %r2, i64 %r2, i32 32, i64 -4294967296) ret i64 %r3 } define i64 @rldimi5(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi5: ; CHECK: # %bb.0: ; CHECK-NEXT: rldimi 4, 3, 8, 40 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 8, i64 16776960) ; 0xffff << 8 ret i64 %r } define i64 @rldimi6(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi6: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 1 ; CHECK-NEXT: rldimi 4, 3, 7, 41 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 8, i64 8388480) ; 0xffff << 7 ret i64 %r } define i64 @rldimi7(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi7: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 63 ; CHECK-NEXT: rldimi 4, 3, 9, 39 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 8, i64 33553920) ; 0xffff << 9 ret i64 %r } define i64 @rldimi8(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi8: ; CHECK: # %bb.0: ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 0, i64 0) ret i64 %r } define i64 @rldimi9(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi9: ; CHECK: # %bb.0: ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 63, i64 0) ret i64 %r } define i64 @rldimi10(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi10: ; CHECK: # %bb.0: ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 0, i64 -1) ret i64 %r } define i64 @rldimi11(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi11: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 8 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 8, i64 -1) ret i64 %r } define i64 @rldimi12(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi12: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 20 ; CHECK-NEXT: rldimi 4, 3, 44, 31 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 0, i64 18446726490113441791) ret i64 %r } define i64 @rldimi13(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi13: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 62 ; CHECK-NEXT: rldimi 4, 3, 32, 2 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 30, i64 4611686014132420608) ret i64 %r } define i64 @rldimi14(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi14: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 23 ; CHECK-NEXT: rldimi 4, 3, 53, 0 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18437736874454810624) ; mb=0, me=10 ret i64 %r } define i64 @rldimi15(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi15: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 36 ; CHECK-NEXT: rldimi 4, 3, 40, 10 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18013298997854208) ; mb=10, me=23 ret i64 %r } define i64 @rldimi16(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi16: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 57 ; CHECK-NEXT: rldimi 4, 3, 19, 10 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18014398508957696) ; mb=10, me=44 ret i64 %r } define i64 @rldimi17(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi17: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 43 ; CHECK-NEXT: rldimi 4, 3, 33, 25 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 541165879296) ; mb=25, me=30 ret i64 %r } define i64 @rldimi18(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi18: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 57 ; CHECK-NEXT: rldimi 4, 3, 19, 25 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 549755289600) ; mb=25, me=44 ret i64 %r } define i64 @rldimi19(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi19: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 57 ; CHECK-NEXT: rldimi 4, 3, 19, 33 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 2146959360) ; mb=33, me=44 ret i64 %r } define i64 @rldimi20(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi20: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 23 ; CHECK-NEXT: rldimi 4, 3, 53, 15 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18438299824408231935) ; mb=15, me=10 ret i64 %r } define i64 @rldimi21(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi21: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 23 ; CHECK-NEXT: rldimi 4, 3, 53, 25 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18437737424210624511) ; mb=25, me=10 ret i64 %r } define i64 @rldimi22(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi22: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 34 ; CHECK-NEXT: rldimi 4, 3, 42, 25 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18446740225418854399) ; mb=25, me=21 ret i64 %r } define i64 @rldimi23(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi23: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 23 ; CHECK-NEXT: rldimi 4, 3, 53, 44 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18437736874455859199) ; mb=44, me=10 ret i64 %r } define i64 @rldimi24(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi24: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 38 ; CHECK-NEXT: rldimi 4, 3, 38, 44 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18446743798832693247) ; mb=44, me=25 ret i64 %r } define i64 @rldimi25(i64 %a, i64 %b) { ; CHECK-LABEL: rldimi25: ; CHECK: # %bb.0: ; CHECK-NEXT: rotldi 3, 3, 48 ; CHECK-NEXT: rldimi 4, 3, 28, 44 ; CHECK-NEXT: mr 3, 4 ; CHECK-NEXT: blr %r = call i64 @llvm.ppc.rldimi(i64 %a, i64 %b, i32 12, i64 18446744073442164735) ; mb=44, me=35 ret i64 %r } declare i64 @llvm.ppc.rldimi(i64, i64, i32 immarg, i64 immarg)