xref: /aosp_15_r20/external/llvm/test/CodeGen/NVPTX/rotate.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck --check-prefix=SM20 %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=nvptx -mcpu=sm_35 | FileCheck --check-prefix=SM35 %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.nvvm.rotate.b32(i32, i32)
6*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.nvvm.rotate.b64(i64, i32)
7*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.nvvm.rotate.right.b64(i64, i32)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; SM20: rotate32
10*9880d681SAndroid Build Coastguard Worker; SM35: rotate32
11*9880d681SAndroid Build Coastguard Workerdefine i32 @rotate32(i32 %a, i32 %b) {
12*9880d681SAndroid Build Coastguard Worker; SM20: shl.b32
13*9880d681SAndroid Build Coastguard Worker; SM20: sub.s32
14*9880d681SAndroid Build Coastguard Worker; SM20: shr.b32
15*9880d681SAndroid Build Coastguard Worker; SM20: add.u32
16*9880d681SAndroid Build Coastguard Worker; SM35: shf.l.wrap.b32
17*9880d681SAndroid Build Coastguard Worker  %val = tail call i32 @llvm.nvvm.rotate.b32(i32 %a, i32 %b)
18*9880d681SAndroid Build Coastguard Worker  ret i32 %val
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker; SM20: rotate64
22*9880d681SAndroid Build Coastguard Worker; SM35: rotate64
23*9880d681SAndroid Build Coastguard Workerdefine i64 @rotate64(i64 %a, i32 %b) {
24*9880d681SAndroid Build Coastguard Worker; SM20: shl.b64
25*9880d681SAndroid Build Coastguard Worker; SM20: sub.u32
26*9880d681SAndroid Build Coastguard Worker; SM20: shr.b64
27*9880d681SAndroid Build Coastguard Worker; SM20: add.u64
28*9880d681SAndroid Build Coastguard Worker; SM35: shf.l.wrap.b32
29*9880d681SAndroid Build Coastguard Worker; SM35: shf.l.wrap.b32
30*9880d681SAndroid Build Coastguard Worker  %val = tail call i64 @llvm.nvvm.rotate.b64(i64 %a, i32 %b)
31*9880d681SAndroid Build Coastguard Worker  ret i64 %val
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker; SM20: rotateright64
35*9880d681SAndroid Build Coastguard Worker; SM35: rotateright64
36*9880d681SAndroid Build Coastguard Workerdefine i64 @rotateright64(i64 %a, i32 %b) {
37*9880d681SAndroid Build Coastguard Worker; SM20: shr.b64
38*9880d681SAndroid Build Coastguard Worker; SM20: sub.u32
39*9880d681SAndroid Build Coastguard Worker; SM20: shl.b64
40*9880d681SAndroid Build Coastguard Worker; SM20: add.u64
41*9880d681SAndroid Build Coastguard Worker; SM35: shf.r.wrap.b32
42*9880d681SAndroid Build Coastguard Worker; SM35: shf.r.wrap.b32
43*9880d681SAndroid Build Coastguard Worker  %val = tail call i64 @llvm.nvvm.rotate.right.b64(i64 %a, i32 %b)
44*9880d681SAndroid Build Coastguard Worker  ret i64 %val
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; SM20: rotl0
48*9880d681SAndroid Build Coastguard Worker; SM35: rotl0
49*9880d681SAndroid Build Coastguard Workerdefine i32 @rotl0(i32 %x) {
50*9880d681SAndroid Build Coastguard Worker; SM20: shl.b32
51*9880d681SAndroid Build Coastguard Worker; SM20: shr.b32
52*9880d681SAndroid Build Coastguard Worker; SM20: add.u32
53*9880d681SAndroid Build Coastguard Worker; SM35: shf.l.wrap.b32
54*9880d681SAndroid Build Coastguard Worker  %t0 = shl i32 %x, 8
55*9880d681SAndroid Build Coastguard Worker  %t1 = lshr i32 %x, 24
56*9880d681SAndroid Build Coastguard Worker  %t2 = or i32 %t0, %t1
57*9880d681SAndroid Build Coastguard Worker  ret i32 %t2
58*9880d681SAndroid Build Coastguard Worker}
59