1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-22 04:22:57 +02:00
llvm-mirror/test/CodeGen/Hexagon/rotate.ll
Krzysztof Parzyszek cca7086924 [SelectionDAG] Provide default expansion for rotates
Implement default legalization of rotates: either in terms of the rotation
in the opposite direction (if legal), or in terms of shifts and ors.

Implement generating of rotate instructions for Hexagon. Hexagon only
supports rotates by an immediate value, so implement custom lowering of
ROTL/ROTR on Hexagon. If a rotate is not legal, use the default expansion.

Differential Revision: https://reviews.llvm.org/D47725

llvm-svn: 334497
2018-06-12 12:49:36 +00:00

206 lines
4.5 KiB
LLVM

; RUN: llc -march=hexagon < %s | FileCheck %s
target triple = "hexagon"
; CHECK-LABEL: f0
; CHECK: r0 = rol(r0,#7)
define i32 @f0(i32 %a0) #0 {
b0:
%v0 = shl i32 %a0, 7
%v1 = lshr i32 %a0, 25
%v2 = or i32 %v0, %v1
ret i32 %v2
}
; CHECK-LABEL: f1
; No variable-shift rotates. Check for the default expansion code.
; This is a rotate left by %a1(r1).
; CHECK: r[[R10:[0-9]+]] = sub(#32,r1)
; CHECK: r[[R11:[0-9]+]] = and(r1,#31)
; CHECK: r[[R12:[0-9]+]] = and(r[[R10]],#31)
; CHECK: r[[R13:[0-9]+]] = asl(r0,r[[R11]])
; CHECK: r[[R13]] |= lsr(r0,r[[R12]])
define i32 @f1(i32 %a0, i32 %a1) #0 {
b0:
%v0 = shl i32 %a0, %a1
%v1 = sub i32 32, %a1
%v2 = lshr i32 %a0, %v1
%v3 = or i32 %v2, %v0
ret i32 %v3
}
; CHECK-LABEL: f2
; CHECK: r0 = rol(r0,#25)
define i32 @f2(i32 %a0) #0 {
b0:
%v0 = lshr i32 %a0, 7
%v1 = shl i32 %a0, 25
%v2 = or i32 %v0, %v1
ret i32 %v2
}
; CHECK-LABEL: f3
; No variable-shift rotates. Check for the default expansion code.
; This is a rotate right by %a1(r1) that became a rotate left by 32-%a1.
; CHECK: r[[R30:[0-9]+]] = sub(#32,r1)
; CHECK: r[[R31:[0-9]+]] = and(r1,#31)
; CHECK: r[[R32:[0-9]+]] = and(r[[R30]],#31)
; CHECK: r[[R33:[0-9]+]] = asl(r0,r[[R32]])
; CHECK: r[[R33]] |= lsr(r0,r[[R31]])
define i32 @f3(i32 %a0, i32 %a1) #0 {
b0:
%v0 = lshr i32 %a0, %a1
%v1 = sub i32 32, %a1
%v2 = shl i32 %a0, %v1
%v3 = or i32 %v2, %v0
ret i32 %v3
}
; CHECK-LABEL: f4
; CHECK: r1:0 = rol(r1:0,#7)
define i64 @f4(i64 %a0) #0 {
b0:
%v0 = shl i64 %a0, 7
%v1 = lshr i64 %a0, 57
%v2 = or i64 %v0, %v1
ret i64 %v2
}
; CHECK-LABEL: f5
; No variable-shift rotates. Check for the default expansion code.
; This is a rotate left by %a1(r2).
; CHECK: r[[R50:[0-9]+]] = sub(#64,r2)
; CHECK: r[[R51:[0-9]+]] = and(r2,#63)
; CHECK: r[[R52:[0-9]+]] = and(r[[R50]],#63)
; CHECK: r[[R53:[0-9]+]]:[[R54:[0-9]+]] = asl(r1:0,r[[R51]])
; CHECK: r[[R53]]:[[R54]] |= lsr(r1:0,r[[R52]])
define i64 @f5(i64 %a0, i32 %a1) #0 {
b0:
%v0 = zext i32 %a1 to i64
%v1 = shl i64 %a0, %v0
%v2 = sub i32 64, %a1
%v3 = zext i32 %v2 to i64
%v4 = lshr i64 %a0, %v3
%v5 = or i64 %v4, %v1
ret i64 %v5
}
; CHECK-LABEL: f6
; CHECK: r1:0 = rol(r1:0,#57)
define i64 @f6(i64 %a0) #0 {
b0:
%v0 = lshr i64 %a0, 7
%v1 = shl i64 %a0, 57
%v2 = or i64 %v0, %v1
ret i64 %v2
}
; CHECK-LABEL: f7
; No variable-shift rotates. Check for the default expansion code.
; This is a rotate right by %a1(r2) that became a rotate left by 64-%a1.
; CHECK: r[[R70:[0-9]+]] = sub(#64,r2)
; CHECK: r[[R71:[0-9]+]] = and(r2,#63)
; CHECK: r[[R72:[0-9]+]] = and(r[[R70]],#63)
; CHECK: r[[R73:[0-9]+]]:[[R75:[0-9]+]] = asl(r1:0,r[[R72]])
; CHECK: r[[R73]]:[[R75]] |= lsr(r1:0,r[[R71]])
define i64 @f7(i64 %a0, i32 %a1) #0 {
b0:
%v0 = zext i32 %a1 to i64
%v1 = lshr i64 %a0, %v0
%v2 = sub i32 64, %a1
%v3 = zext i32 %v2 to i64
%v4 = shl i64 %a0, %v3
%v5 = or i64 %v4, %v1
ret i64 %v5
}
; CHECK-LABEL: f8
; CHECK: r0 += rol(r1,#7)
define i32 @f8(i32 %a0, i32 %a1) #0 {
b0:
%v0 = shl i32 %a1, 7
%v1 = lshr i32 %a1, 25
%v2 = or i32 %v0, %v1
%v3 = add i32 %v2, %a0
ret i32 %v3
}
; CHECK-LABEL: f9
; CHECK: r0 -= rol(r1,#7)
define i32 @f9(i32 %a0, i32 %a1) #0 {
b0:
%v0 = shl i32 %a1, 7
%v1 = lshr i32 %a1, 25
%v2 = or i32 %v0, %v1
%v3 = sub i32 %a0, %v2
ret i32 %v3
}
; CHECK-LABEL: f10
; CHECK: r0 &= rol(r1,#7)
define i32 @f10(i32 %a0, i32 %a1) #0 {
b0:
%v0 = shl i32 %a1, 7
%v1 = lshr i32 %a1, 25
%v2 = or i32 %v0, %v1
%v3 = and i32 %v2, %a0
ret i32 %v3
}
; CHECK-LABEL: f12
; CHECK: r0 ^= rol(r1,#7)
define i32 @f12(i32 %a0, i32 %a1) #0 {
b0:
%v0 = shl i32 %a1, 7
%v1 = lshr i32 %a1, 25
%v2 = or i32 %v0, %v1
%v3 = xor i32 %v2, %a0
ret i32 %v3
}
; CHECK-LABEL: f13
; CHECK: r1:0 += rol(r3:2,#7)
define i64 @f13(i64 %a0, i64 %a1) #0 {
b0:
%v0 = shl i64 %a1, 7
%v1 = lshr i64 %a1, 57
%v2 = or i64 %v0, %v1
%v3 = add i64 %v2, %a0
ret i64 %v3
}
; CHECK-LABEL: f14
; CHECK: r1:0 -= rol(r3:2,#7)
define i64 @f14(i64 %a0, i64 %a1) #0 {
b0:
%v0 = shl i64 %a1, 7
%v1 = lshr i64 %a1, 57
%v2 = or i64 %v0, %v1
%v3 = sub i64 %a0, %v2
ret i64 %v3
}
; CHECK-LABEL: f15
; CHECK: r1:0 &= rol(r3:2,#7)
define i64 @f15(i64 %a0, i64 %a1) #0 {
b0:
%v0 = shl i64 %a1, 7
%v1 = lshr i64 %a1, 57
%v2 = or i64 %v0, %v1
%v3 = and i64 %v2, %a0
ret i64 %v3
}
; CHECK-LABEL: f17
; CHECK: r1:0 ^= rol(r3:2,#7)
define i64 @f17(i64 %a0, i64 %a1) #0 {
b0:
%v0 = shl i64 %a1, 7
%v1 = lshr i64 %a1, 57
%v2 = or i64 %v0, %v1
%v3 = xor i64 %v2, %a0
ret i64 %v3
}
attributes #0 = { norecurse nounwind readnone "target-cpu"="hexagonv60" "target-features"="-packets" }