| ; 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) |