atomics.ll 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. ; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
  2. ; CHECK-LABEL: atom0
  3. define i32 @atom0(i32* %addr, i32 %val) {
  4. ; CHECK: atom.add.u32
  5. %ret = atomicrmw add i32* %addr, i32 %val seq_cst
  6. ret i32 %ret
  7. }
  8. ; CHECK-LABEL: atom1
  9. define i64 @atom1(i64* %addr, i64 %val) {
  10. ; CHECK: atom.add.u64
  11. %ret = atomicrmw add i64* %addr, i64 %val seq_cst
  12. ret i64 %ret
  13. }
  14. ; CHECK-LABEL: atom2
  15. define i32 @atom2(i32* %subr, i32 %val) {
  16. ; CHECK: neg.s32
  17. ; CHECK: atom.add.u32
  18. %ret = atomicrmw sub i32* %subr, i32 %val seq_cst
  19. ret i32 %ret
  20. }
  21. ; CHECK-LABEL: atom3
  22. define i64 @atom3(i64* %subr, i64 %val) {
  23. ; CHECK: neg.s64
  24. ; CHECK: atom.add.u64
  25. %ret = atomicrmw sub i64* %subr, i64 %val seq_cst
  26. ret i64 %ret
  27. }
  28. ; CHECK-LABEL: atom4
  29. define i32 @atom4(i32* %subr, i32 %val) {
  30. ; CHECK: atom.and.b32
  31. %ret = atomicrmw and i32* %subr, i32 %val seq_cst
  32. ret i32 %ret
  33. }
  34. ; CHECK-LABEL: atom5
  35. define i64 @atom5(i64* %subr, i64 %val) {
  36. ; CHECK: atom.and.b64
  37. %ret = atomicrmw and i64* %subr, i64 %val seq_cst
  38. ret i64 %ret
  39. }
  40. ;; NAND not yet supported
  41. ;define i32 @atom6(i32* %subr, i32 %val) {
  42. ; %ret = atomicrmw nand i32* %subr, i32 %val seq_cst
  43. ; ret i32 %ret
  44. ;}
  45. ;define i64 @atom7(i64* %subr, i64 %val) {
  46. ; %ret = atomicrmw nand i64* %subr, i64 %val seq_cst
  47. ; ret i64 %ret
  48. ;}
  49. ; CHECK-LABEL: atom8
  50. define i32 @atom8(i32* %subr, i32 %val) {
  51. ; CHECK: atom.or.b32
  52. %ret = atomicrmw or i32* %subr, i32 %val seq_cst
  53. ret i32 %ret
  54. }
  55. ; CHECK-LABEL: atom9
  56. define i64 @atom9(i64* %subr, i64 %val) {
  57. ; CHECK: atom.or.b64
  58. %ret = atomicrmw or i64* %subr, i64 %val seq_cst
  59. ret i64 %ret
  60. }
  61. ; CHECK-LABEL: atom10
  62. define i32 @atom10(i32* %subr, i32 %val) {
  63. ; CHECK: atom.xor.b32
  64. %ret = atomicrmw xor i32* %subr, i32 %val seq_cst
  65. ret i32 %ret
  66. }
  67. ; CHECK-LABEL: atom11
  68. define i64 @atom11(i64* %subr, i64 %val) {
  69. ; CHECK: atom.xor.b64
  70. %ret = atomicrmw xor i64* %subr, i64 %val seq_cst
  71. ret i64 %ret
  72. }
  73. ; CHECK-LABEL: atom12
  74. define i32 @atom12(i32* %subr, i32 %val) {
  75. ; CHECK: atom.max.s32
  76. %ret = atomicrmw max i32* %subr, i32 %val seq_cst
  77. ret i32 %ret
  78. }
  79. ; CHECK-LABEL: atom13
  80. define i64 @atom13(i64* %subr, i64 %val) {
  81. ; CHECK: atom.max.s64
  82. %ret = atomicrmw max i64* %subr, i64 %val seq_cst
  83. ret i64 %ret
  84. }
  85. ; CHECK-LABEL: atom14
  86. define i32 @atom14(i32* %subr, i32 %val) {
  87. ; CHECK: atom.min.s32
  88. %ret = atomicrmw min i32* %subr, i32 %val seq_cst
  89. ret i32 %ret
  90. }
  91. ; CHECK-LABEL: atom15
  92. define i64 @atom15(i64* %subr, i64 %val) {
  93. ; CHECK: atom.min.s64
  94. %ret = atomicrmw min i64* %subr, i64 %val seq_cst
  95. ret i64 %ret
  96. }
  97. ; CHECK-LABEL: atom16
  98. define i32 @atom16(i32* %subr, i32 %val) {
  99. ; CHECK: atom.max.u32
  100. %ret = atomicrmw umax i32* %subr, i32 %val seq_cst
  101. ret i32 %ret
  102. }
  103. ; CHECK-LABEL: atom17
  104. define i64 @atom17(i64* %subr, i64 %val) {
  105. ; CHECK: atom.max.u64
  106. %ret = atomicrmw umax i64* %subr, i64 %val seq_cst
  107. ret i64 %ret
  108. }
  109. ; CHECK-LABEL: atom18
  110. define i32 @atom18(i32* %subr, i32 %val) {
  111. ; CHECK: atom.min.u32
  112. %ret = atomicrmw umin i32* %subr, i32 %val seq_cst
  113. ret i32 %ret
  114. }
  115. ; CHECK-LABEL: atom19
  116. define i64 @atom19(i64* %subr, i64 %val) {
  117. ; CHECK: atom.min.u64
  118. %ret = atomicrmw umin i64* %subr, i64 %val seq_cst
  119. ret i64 %ret
  120. }
  121. declare float @llvm.nvvm.atomic.load.add.f32.p0f32(float* %addr, float %val)
  122. ; CHECK-LABEL: atomic_add_f32_generic
  123. define float @atomic_add_f32_generic(float* %addr, float %val) {
  124. ; CHECK: atom.add.f32
  125. %ret = call float @llvm.nvvm.atomic.load.add.f32.p0f32(float* %addr, float %val)
  126. ret float %ret
  127. }
  128. declare float @llvm.nvvm.atomic.load.add.f32.p1f32(float addrspace(1)* %addr, float %val)
  129. ; CHECK-LABEL: atomic_add_f32_addrspace1
  130. define float @atomic_add_f32_addrspace1(float addrspace(1)* %addr, float %val) {
  131. ; CHECK: atom.global.add.f32
  132. %ret = call float @llvm.nvvm.atomic.load.add.f32.p1f32(float addrspace(1)* %addr, float %val)
  133. ret float %ret
  134. }
  135. declare float @llvm.nvvm.atomic.load.add.f32.p3f32(float addrspace(3)* %addr, float %val)
  136. ; CHECK-LABEL: atomic_add_f32_addrspace3
  137. define float @atomic_add_f32_addrspace3(float addrspace(3)* %addr, float %val) {
  138. ; CHECK: atom.shared.add.f32
  139. %ret = call float @llvm.nvvm.atomic.load.add.f32.p3f32(float addrspace(3)* %addr, float %val)
  140. ret float %ret
  141. }
  142. ; CHECK-LABEL: atomic_cmpxchg_i32
  143. define i32 @atomic_cmpxchg_i32(i32* %addr, i32 %cmp, i32 %new) {
  144. ; CHECK: atom.cas.b32
  145. %pairold = cmpxchg i32* %addr, i32 %cmp, i32 %new seq_cst seq_cst
  146. ret i32 %new
  147. }
  148. ; CHECK-LABEL: atomic_cmpxchg_i64
  149. define i64 @atomic_cmpxchg_i64(i64* %addr, i64 %cmp, i64 %new) {
  150. ; CHECK: atom.cas.b64
  151. %pairold = cmpxchg i64* %addr, i64 %cmp, i64 %new seq_cst seq_cst
  152. ret i64 %new
  153. }