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