
rldimi is 64-bit instruction, due to backward compatibility, it needs to be expanded into series of rotate and masking in 32-bit environment. In the future, we may improve bit permutation selector and remove such direct codegen.
297 lines
8.0 KiB
LLVM
297 lines
8.0 KiB
LLVM
; 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)
|