Files
clang-p2996/llvm/test/CodeGen/PowerPC/rldimi.ll
Qiu Chaofan 65ae09eeb6 [PowerPC] Fix behavior of rldimi/rlwimi/rlwnm builtins (#85040)
rldimi is 64-bit instruction, so the corresponding builtin should not
be available in 32-bit mode. Rotate amount should be in range and
cases when mask is zero needs special handling.

This change also swaps the first and second operands of rldimi/rlwimi
to match previous behavior. For masks not ending at bit 63-SH,
rotation will be inserted before rldimi.
2024-03-18 14:17:16 +08:00

143 lines
3.8 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
}
declare i64 @llvm.ppc.rldimi(i64, i64, i32 immarg, i64 immarg)