These builtins are already there in Clang, however current codegen may produce suboptimal results due to their complex behavior. Implement them as intrinsics to ensure expected instructions are emitted.
76 lines
2.1 KiB
LLVM
76 lines
2.1 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 @rldimi_intrinsic(i64 %a) {
|
|
; CHECK-LABEL: rldimi_intrinsic:
|
|
; 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
|
|
}
|
|
|
|
declare i64 @llvm.ppc.rldimi(i64, i64, i32 immarg, i64 immarg)
|