rotate.ll 1.3 KB

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