# Changeset View

Changeset View

# Standalone View

Standalone View

# test/CodeGen/RISCV/atomic-cmpxchg.ll

- This file was added.

1 | ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | ||||
---|---|---|---|---|---|

2 | ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ | ||||

3 | ; RUN: | FileCheck -check-prefix=RV32I %s | ||||

4 | | ||||

5 | define void @cmpxchg_i8_monotonic_monotonic(i8* %ptr, i8 %cmp, i8 %val) { | ||||

6 | ; RV32I-LABEL: cmpxchg_i8_monotonic_monotonic: | ||||

7 | ; RV32I: # %bb.0: | ||||

8 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

9 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

10 | ; RV32I-NEXT: sb a1, 11(sp) | ||||

11 | ; RV32I-NEXT: addi a1, sp, 11 | ||||

12 | ; RV32I-NEXT: mv a3, zero | ||||

13 | ; RV32I-NEXT: mv a4, zero | ||||

14 | ; RV32I-NEXT: call __atomic_compare_exchange_1 | ||||

15 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

16 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

17 | ; RV32I-NEXT: ret | ||||

18 | %res = cmpxchg i8* %ptr, i8 %cmp, i8 %val monotonic monotonic | ||||

19 | ret void | ||||

20 | } | ||||

21 | | ||||

22 | define void @cmpxchg_i8_acquire_monotonic(i8* %ptr, i8 %cmp, i8 %val) { | ||||

23 | ; RV32I-LABEL: cmpxchg_i8_acquire_monotonic: | ||||

24 | ; RV32I: # %bb.0: | ||||

25 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

26 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

27 | ; RV32I-NEXT: sb a1, 11(sp) | ||||

28 | ; RV32I-NEXT: addi a1, sp, 11 | ||||

29 | ; RV32I-NEXT: addi a3, zero, 2 | ||||

30 | ; RV32I-NEXT: mv a4, zero | ||||

31 | ; RV32I-NEXT: call __atomic_compare_exchange_1 | ||||

32 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

33 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

34 | ; RV32I-NEXT: ret | ||||

35 | %res = cmpxchg i8* %ptr, i8 %cmp, i8 %val acquire monotonic | ||||

36 | ret void | ||||

37 | } | ||||

38 | | ||||

39 | define void @cmpxchg_i8_acquire_acquire(i8* %ptr, i8 %cmp, i8 %val) { | ||||

40 | ; RV32I-LABEL: cmpxchg_i8_acquire_acquire: | ||||

41 | ; RV32I: # %bb.0: | ||||

42 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

43 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

44 | ; RV32I-NEXT: sb a1, 11(sp) | ||||

45 | ; RV32I-NEXT: addi a1, sp, 11 | ||||

46 | ; RV32I-NEXT: addi a3, zero, 2 | ||||

47 | ; RV32I-NEXT: mv a4, a3 | ||||

48 | ; RV32I-NEXT: call __atomic_compare_exchange_1 | ||||

49 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

50 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

51 | ; RV32I-NEXT: ret | ||||

52 | %res = cmpxchg i8* %ptr, i8 %cmp, i8 %val acquire acquire | ||||

53 | ret void | ||||

54 | } | ||||

55 | | ||||

56 | define void @cmpxchg_i8_release_monotonic(i8* %ptr, i8 %cmp, i8 %val) { | ||||

57 | ; RV32I-LABEL: cmpxchg_i8_release_monotonic: | ||||

58 | ; RV32I: # %bb.0: | ||||

59 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

60 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

61 | ; RV32I-NEXT: sb a1, 11(sp) | ||||

62 | ; RV32I-NEXT: addi a1, sp, 11 | ||||

63 | ; RV32I-NEXT: addi a3, zero, 3 | ||||

64 | ; RV32I-NEXT: mv a4, zero | ||||

65 | ; RV32I-NEXT: call __atomic_compare_exchange_1 | ||||

66 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

67 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

68 | ; RV32I-NEXT: ret | ||||

69 | %res = cmpxchg i8* %ptr, i8 %cmp, i8 %val release monotonic | ||||

70 | ret void | ||||

71 | } | ||||

72 | | ||||

73 | define void @cmpxchg_i8_release_acquire(i8* %ptr, i8 %cmp, i8 %val) { | ||||

74 | ; RV32I-LABEL: cmpxchg_i8_release_acquire: | ||||

75 | ; RV32I: # %bb.0: | ||||

76 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

77 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

78 | ; RV32I-NEXT: sb a1, 11(sp) | ||||

79 | ; RV32I-NEXT: addi a1, sp, 11 | ||||

80 | ; RV32I-NEXT: addi a3, zero, 3 | ||||

81 | ; RV32I-NEXT: addi a4, zero, 2 | ||||

82 | ; RV32I-NEXT: call __atomic_compare_exchange_1 | ||||

83 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

84 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

85 | ; RV32I-NEXT: ret | ||||

86 | %res = cmpxchg i8* %ptr, i8 %cmp, i8 %val release acquire | ||||

87 | ret void | ||||

88 | } | ||||

89 | | ||||

90 | define void @cmpxchg_i8_acq_rel_monotonic(i8* %ptr, i8 %cmp, i8 %val) { | ||||

91 | ; RV32I-LABEL: cmpxchg_i8_acq_rel_monotonic: | ||||

92 | ; RV32I: # %bb.0: | ||||

93 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

94 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

95 | ; RV32I-NEXT: sb a1, 11(sp) | ||||

96 | ; RV32I-NEXT: addi a1, sp, 11 | ||||

97 | ; RV32I-NEXT: addi a3, zero, 4 | ||||

98 | ; RV32I-NEXT: mv a4, zero | ||||

99 | ; RV32I-NEXT: call __atomic_compare_exchange_1 | ||||

100 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

101 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

102 | ; RV32I-NEXT: ret | ||||

103 | %res = cmpxchg i8* %ptr, i8 %cmp, i8 %val acq_rel monotonic | ||||

104 | ret void | ||||

105 | } | ||||

106 | | ||||

107 | define void @cmpxchg_i8_acq_rel_acquire(i8* %ptr, i8 %cmp, i8 %val) { | ||||

108 | ; RV32I-LABEL: cmpxchg_i8_acq_rel_acquire: | ||||

109 | ; RV32I: # %bb.0: | ||||

110 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

111 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

112 | ; RV32I-NEXT: sb a1, 11(sp) | ||||

113 | ; RV32I-NEXT: addi a1, sp, 11 | ||||

114 | ; RV32I-NEXT: addi a3, zero, 4 | ||||

115 | ; RV32I-NEXT: addi a4, zero, 2 | ||||

116 | ; RV32I-NEXT: call __atomic_compare_exchange_1 | ||||

117 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

118 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

119 | ; RV32I-NEXT: ret | ||||

120 | %res = cmpxchg i8* %ptr, i8 %cmp, i8 %val acq_rel acquire | ||||

121 | ret void | ||||

122 | } | ||||

123 | | ||||

124 | define void @cmpxchg_i8_seq_cst_monotonic(i8* %ptr, i8 %cmp, i8 %val) { | ||||

125 | ; RV32I-LABEL: cmpxchg_i8_seq_cst_monotonic: | ||||

126 | ; RV32I: # %bb.0: | ||||

127 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

128 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

129 | ; RV32I-NEXT: sb a1, 11(sp) | ||||

130 | ; RV32I-NEXT: addi a1, sp, 11 | ||||

131 | ; RV32I-NEXT: addi a3, zero, 5 | ||||

132 | ; RV32I-NEXT: mv a4, zero | ||||

133 | ; RV32I-NEXT: call __atomic_compare_exchange_1 | ||||

134 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

135 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

136 | ; RV32I-NEXT: ret | ||||

137 | %res = cmpxchg i8* %ptr, i8 %cmp, i8 %val seq_cst monotonic | ||||

138 | ret void | ||||

139 | } | ||||

140 | | ||||

141 | define void @cmpxchg_i8_seq_cst_acquire(i8* %ptr, i8 %cmp, i8 %val) { | ||||

142 | ; RV32I-LABEL: cmpxchg_i8_seq_cst_acquire: | ||||

143 | ; RV32I: # %bb.0: | ||||

144 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

145 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

146 | ; RV32I-NEXT: sb a1, 11(sp) | ||||

147 | ; RV32I-NEXT: addi a1, sp, 11 | ||||

148 | ; RV32I-NEXT: addi a3, zero, 5 | ||||

149 | ; RV32I-NEXT: addi a4, zero, 2 | ||||

150 | ; RV32I-NEXT: call __atomic_compare_exchange_1 | ||||

151 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

152 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

153 | ; RV32I-NEXT: ret | ||||

154 | %res = cmpxchg i8* %ptr, i8 %cmp, i8 %val seq_cst acquire | ||||

155 | ret void | ||||

156 | } | ||||

157 | | ||||

158 | define void @cmpxchg_i8_seq_cst_seq_cst(i8* %ptr, i8 %cmp, i8 %val) { | ||||

159 | ; RV32I-LABEL: cmpxchg_i8_seq_cst_seq_cst: | ||||

160 | ; RV32I: # %bb.0: | ||||

161 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

162 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

163 | ; RV32I-NEXT: sb a1, 11(sp) | ||||

164 | ; RV32I-NEXT: addi a1, sp, 11 | ||||

165 | ; RV32I-NEXT: addi a3, zero, 5 | ||||

166 | ; RV32I-NEXT: mv a4, a3 | ||||

167 | ; RV32I-NEXT: call __atomic_compare_exchange_1 | ||||

168 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

169 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

170 | ; RV32I-NEXT: ret | ||||

171 | %res = cmpxchg i8* %ptr, i8 %cmp, i8 %val seq_cst seq_cst | ||||

172 | ret void | ||||

173 | } | ||||

174 | | ||||

175 | define void @cmpxchg_i16_monotonic_monotonic(i16* %ptr, i16 %cmp, i16 %val) { | ||||

176 | ; RV32I-LABEL: cmpxchg_i16_monotonic_monotonic: | ||||

177 | ; RV32I: # %bb.0: | ||||

178 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

179 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

180 | ; RV32I-NEXT: sh a1, 10(sp) | ||||

181 | ; RV32I-NEXT: addi a1, sp, 10 | ||||

182 | ; RV32I-NEXT: mv a3, zero | ||||

183 | ; RV32I-NEXT: mv a4, zero | ||||

184 | ; RV32I-NEXT: call __atomic_compare_exchange_2 | ||||

185 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

186 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

187 | ; RV32I-NEXT: ret | ||||

188 | %res = cmpxchg i16* %ptr, i16 %cmp, i16 %val monotonic monotonic | ||||

189 | ret void | ||||

190 | } | ||||

191 | | ||||

192 | define void @cmpxchg_i16_acquire_monotonic(i16* %ptr, i16 %cmp, i16 %val) { | ||||

193 | ; RV32I-LABEL: cmpxchg_i16_acquire_monotonic: | ||||

194 | ; RV32I: # %bb.0: | ||||

195 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

196 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

197 | ; RV32I-NEXT: sh a1, 10(sp) | ||||

198 | ; RV32I-NEXT: addi a1, sp, 10 | ||||

199 | ; RV32I-NEXT: addi a3, zero, 2 | ||||

200 | ; RV32I-NEXT: mv a4, zero | ||||

201 | ; RV32I-NEXT: call __atomic_compare_exchange_2 | ||||

202 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

203 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

204 | ; RV32I-NEXT: ret | ||||

205 | %res = cmpxchg i16* %ptr, i16 %cmp, i16 %val acquire monotonic | ||||

206 | ret void | ||||

207 | } | ||||

208 | | ||||

209 | define void @cmpxchg_i16_acquire_acquire(i16* %ptr, i16 %cmp, i16 %val) { | ||||

210 | ; RV32I-LABEL: cmpxchg_i16_acquire_acquire: | ||||

211 | ; RV32I: # %bb.0: | ||||

212 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

213 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

214 | ; RV32I-NEXT: sh a1, 10(sp) | ||||

215 | ; RV32I-NEXT: addi a1, sp, 10 | ||||

216 | ; RV32I-NEXT: addi a3, zero, 2 | ||||

217 | ; RV32I-NEXT: mv a4, a3 | ||||

218 | ; RV32I-NEXT: call __atomic_compare_exchange_2 | ||||

219 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

220 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

221 | ; RV32I-NEXT: ret | ||||

222 | %res = cmpxchg i16* %ptr, i16 %cmp, i16 %val acquire acquire | ||||

223 | ret void | ||||

224 | } | ||||

225 | | ||||

226 | define void @cmpxchg_i16_release_monotonic(i16* %ptr, i16 %cmp, i16 %val) { | ||||

227 | ; RV32I-LABEL: cmpxchg_i16_release_monotonic: | ||||

228 | ; RV32I: # %bb.0: | ||||

229 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

230 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

231 | ; RV32I-NEXT: sh a1, 10(sp) | ||||

232 | ; RV32I-NEXT: addi a1, sp, 10 | ||||

233 | ; RV32I-NEXT: addi a3, zero, 3 | ||||

234 | ; RV32I-NEXT: mv a4, zero | ||||

235 | ; RV32I-NEXT: call __atomic_compare_exchange_2 | ||||

236 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

237 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

238 | ; RV32I-NEXT: ret | ||||

239 | %res = cmpxchg i16* %ptr, i16 %cmp, i16 %val release monotonic | ||||

240 | ret void | ||||

241 | } | ||||

242 | | ||||

243 | define void @cmpxchg_i16_release_acquire(i16* %ptr, i16 %cmp, i16 %val) { | ||||

244 | ; RV32I-LABEL: cmpxchg_i16_release_acquire: | ||||

245 | ; RV32I: # %bb.0: | ||||

246 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

247 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

248 | ; RV32I-NEXT: sh a1, 10(sp) | ||||

249 | ; RV32I-NEXT: addi a1, sp, 10 | ||||

250 | ; RV32I-NEXT: addi a3, zero, 3 | ||||

251 | ; RV32I-NEXT: addi a4, zero, 2 | ||||

252 | ; RV32I-NEXT: call __atomic_compare_exchange_2 | ||||

253 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

254 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

255 | ; RV32I-NEXT: ret | ||||

256 | %res = cmpxchg i16* %ptr, i16 %cmp, i16 %val release acquire | ||||

257 | ret void | ||||

258 | } | ||||

259 | | ||||

260 | define void @cmpxchg_i16_acq_rel_monotonic(i16* %ptr, i16 %cmp, i16 %val) { | ||||

261 | ; RV32I-LABEL: cmpxchg_i16_acq_rel_monotonic: | ||||

262 | ; RV32I: # %bb.0: | ||||

263 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

264 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

265 | ; RV32I-NEXT: sh a1, 10(sp) | ||||

266 | ; RV32I-NEXT: addi a1, sp, 10 | ||||

267 | ; RV32I-NEXT: addi a3, zero, 4 | ||||

268 | ; RV32I-NEXT: mv a4, zero | ||||

269 | ; RV32I-NEXT: call __atomic_compare_exchange_2 | ||||

270 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

271 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

272 | ; RV32I-NEXT: ret | ||||

273 | %res = cmpxchg i16* %ptr, i16 %cmp, i16 %val acq_rel monotonic | ||||

274 | ret void | ||||

275 | } | ||||

276 | | ||||

277 | define void @cmpxchg_i16_acq_rel_acquire(i16* %ptr, i16 %cmp, i16 %val) { | ||||

278 | ; RV32I-LABEL: cmpxchg_i16_acq_rel_acquire: | ||||

279 | ; RV32I: # %bb.0: | ||||

280 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

281 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

282 | ; RV32I-NEXT: sh a1, 10(sp) | ||||

283 | ; RV32I-NEXT: addi a1, sp, 10 | ||||

284 | ; RV32I-NEXT: addi a3, zero, 4 | ||||

285 | ; RV32I-NEXT: addi a4, zero, 2 | ||||

286 | ; RV32I-NEXT: call __atomic_compare_exchange_2 | ||||

287 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

288 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

289 | ; RV32I-NEXT: ret | ||||

290 | %res = cmpxchg i16* %ptr, i16 %cmp, i16 %val acq_rel acquire | ||||

291 | ret void | ||||

292 | } | ||||

293 | | ||||

294 | define void @cmpxchg_i16_seq_cst_monotonic(i16* %ptr, i16 %cmp, i16 %val) { | ||||

295 | ; RV32I-LABEL: cmpxchg_i16_seq_cst_monotonic: | ||||

296 | ; RV32I: # %bb.0: | ||||

297 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

298 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

299 | ; RV32I-NEXT: sh a1, 10(sp) | ||||

300 | ; RV32I-NEXT: addi a1, sp, 10 | ||||

301 | ; RV32I-NEXT: addi a3, zero, 5 | ||||

302 | ; RV32I-NEXT: mv a4, zero | ||||

303 | ; RV32I-NEXT: call __atomic_compare_exchange_2 | ||||

304 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

305 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

306 | ; RV32I-NEXT: ret | ||||

307 | %res = cmpxchg i16* %ptr, i16 %cmp, i16 %val seq_cst monotonic | ||||

308 | ret void | ||||

309 | } | ||||

310 | | ||||

311 | define void @cmpxchg_i16_seq_cst_acquire(i16* %ptr, i16 %cmp, i16 %val) { | ||||

312 | ; RV32I-LABEL: cmpxchg_i16_seq_cst_acquire: | ||||

313 | ; RV32I: # %bb.0: | ||||

314 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

315 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

316 | ; RV32I-NEXT: sh a1, 10(sp) | ||||

317 | ; RV32I-NEXT: addi a1, sp, 10 | ||||

318 | ; RV32I-NEXT: addi a3, zero, 5 | ||||

319 | ; RV32I-NEXT: addi a4, zero, 2 | ||||

320 | ; RV32I-NEXT: call __atomic_compare_exchange_2 | ||||

321 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

322 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

323 | ; RV32I-NEXT: ret | ||||

324 | %res = cmpxchg i16* %ptr, i16 %cmp, i16 %val seq_cst acquire | ||||

325 | ret void | ||||

326 | } | ||||

327 | | ||||

328 | define void @cmpxchg_i16_seq_cst_seq_cst(i16* %ptr, i16 %cmp, i16 %val) { | ||||

329 | ; RV32I-LABEL: cmpxchg_i16_seq_cst_seq_cst: | ||||

330 | ; RV32I: # %bb.0: | ||||

331 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

332 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

333 | ; RV32I-NEXT: sh a1, 10(sp) | ||||

334 | ; RV32I-NEXT: addi a1, sp, 10 | ||||

335 | ; RV32I-NEXT: addi a3, zero, 5 | ||||

336 | ; RV32I-NEXT: mv a4, a3 | ||||

337 | ; RV32I-NEXT: call __atomic_compare_exchange_2 | ||||

338 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

339 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

340 | ; RV32I-NEXT: ret | ||||

341 | %res = cmpxchg i16* %ptr, i16 %cmp, i16 %val seq_cst seq_cst | ||||

342 | ret void | ||||

343 | } | ||||

344 | | ||||

345 | define void @cmpxchg_i32_monotonic_monotonic(i32* %ptr, i32 %cmp, i32 %val) { | ||||

346 | ; RV32I-LABEL: cmpxchg_i32_monotonic_monotonic: | ||||

347 | ; RV32I: # %bb.0: | ||||

348 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

349 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

350 | ; RV32I-NEXT: sw a1, 8(sp) | ||||

351 | ; RV32I-NEXT: addi a1, sp, 8 | ||||

352 | ; RV32I-NEXT: mv a3, zero | ||||

353 | ; RV32I-NEXT: mv a4, zero | ||||

354 | ; RV32I-NEXT: call __atomic_compare_exchange_4 | ||||

355 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

356 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

357 | ; RV32I-NEXT: ret | ||||

358 | %res = cmpxchg i32* %ptr, i32 %cmp, i32 %val monotonic monotonic | ||||

359 | ret void | ||||

360 | } | ||||

361 | | ||||

362 | define void @cmpxchg_i32_acquire_monotonic(i32* %ptr, i32 %cmp, i32 %val) { | ||||

363 | ; RV32I-LABEL: cmpxchg_i32_acquire_monotonic: | ||||

364 | ; RV32I: # %bb.0: | ||||

365 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

366 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

367 | ; RV32I-NEXT: sw a1, 8(sp) | ||||

368 | ; RV32I-NEXT: addi a1, sp, 8 | ||||

369 | ; RV32I-NEXT: addi a3, zero, 2 | ||||

370 | ; RV32I-NEXT: mv a4, zero | ||||

371 | ; RV32I-NEXT: call __atomic_compare_exchange_4 | ||||

372 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

373 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

374 | ; RV32I-NEXT: ret | ||||

375 | %res = cmpxchg i32* %ptr, i32 %cmp, i32 %val acquire monotonic | ||||

376 | ret void | ||||

377 | } | ||||

378 | | ||||

379 | define void @cmpxchg_i32_acquire_acquire(i32* %ptr, i32 %cmp, i32 %val) { | ||||

380 | ; RV32I-LABEL: cmpxchg_i32_acquire_acquire: | ||||

381 | ; RV32I: # %bb.0: | ||||

382 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

383 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

384 | ; RV32I-NEXT: sw a1, 8(sp) | ||||

385 | ; RV32I-NEXT: addi a1, sp, 8 | ||||

386 | ; RV32I-NEXT: addi a3, zero, 2 | ||||

387 | ; RV32I-NEXT: mv a4, a3 | ||||

388 | ; RV32I-NEXT: call __atomic_compare_exchange_4 | ||||

389 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

390 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

391 | ; RV32I-NEXT: ret | ||||

392 | %res = cmpxchg i32* %ptr, i32 %cmp, i32 %val acquire acquire | ||||

393 | ret void | ||||

394 | } | ||||

395 | | ||||

396 | define void @cmpxchg_i32_release_monotonic(i32* %ptr, i32 %cmp, i32 %val) { | ||||

397 | ; RV32I-LABEL: cmpxchg_i32_release_monotonic: | ||||

398 | ; RV32I: # %bb.0: | ||||

399 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

400 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

401 | ; RV32I-NEXT: sw a1, 8(sp) | ||||

402 | ; RV32I-NEXT: addi a1, sp, 8 | ||||

403 | ; RV32I-NEXT: addi a3, zero, 3 | ||||

404 | ; RV32I-NEXT: mv a4, zero | ||||

405 | ; RV32I-NEXT: call __atomic_compare_exchange_4 | ||||

406 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

407 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

408 | ; RV32I-NEXT: ret | ||||

409 | %res = cmpxchg i32* %ptr, i32 %cmp, i32 %val release monotonic | ||||

410 | ret void | ||||

411 | } | ||||

412 | | ||||

413 | define void @cmpxchg_i32_release_acquire(i32* %ptr, i32 %cmp, i32 %val) { | ||||

414 | ; RV32I-LABEL: cmpxchg_i32_release_acquire: | ||||

415 | ; RV32I: # %bb.0: | ||||

416 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

417 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

418 | ; RV32I-NEXT: sw a1, 8(sp) | ||||

419 | ; RV32I-NEXT: addi a1, sp, 8 | ||||

420 | ; RV32I-NEXT: addi a3, zero, 3 | ||||

421 | ; RV32I-NEXT: addi a4, zero, 2 | ||||

422 | ; RV32I-NEXT: call __atomic_compare_exchange_4 | ||||

423 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

424 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

425 | ; RV32I-NEXT: ret | ||||

426 | %res = cmpxchg i32* %ptr, i32 %cmp, i32 %val release acquire | ||||

427 | ret void | ||||

428 | } | ||||

429 | | ||||

430 | define void @cmpxchg_i32_acq_rel_monotonic(i32* %ptr, i32 %cmp, i32 %val) { | ||||

431 | ; RV32I-LABEL: cmpxchg_i32_acq_rel_monotonic: | ||||

432 | ; RV32I: # %bb.0: | ||||

433 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

434 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

435 | ; RV32I-NEXT: sw a1, 8(sp) | ||||

436 | ; RV32I-NEXT: addi a1, sp, 8 | ||||

437 | ; RV32I-NEXT: addi a3, zero, 4 | ||||

438 | ; RV32I-NEXT: mv a4, zero | ||||

439 | ; RV32I-NEXT: call __atomic_compare_exchange_4 | ||||

440 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

441 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

442 | ; RV32I-NEXT: ret | ||||

443 | %res = cmpxchg i32* %ptr, i32 %cmp, i32 %val acq_rel monotonic | ||||

444 | ret void | ||||

445 | } | ||||

446 | | ||||

447 | define void @cmpxchg_i32_acq_rel_acquire(i32* %ptr, i32 %cmp, i32 %val) { | ||||

448 | ; RV32I-LABEL: cmpxchg_i32_acq_rel_acquire: | ||||

449 | ; RV32I: # %bb.0: | ||||

450 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

451 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

452 | ; RV32I-NEXT: sw a1, 8(sp) | ||||

453 | ; RV32I-NEXT: addi a1, sp, 8 | ||||

454 | ; RV32I-NEXT: addi a3, zero, 4 | ||||

455 | ; RV32I-NEXT: addi a4, zero, 2 | ||||

456 | ; RV32I-NEXT: call __atomic_compare_exchange_4 | ||||

457 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

458 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

459 | ; RV32I-NEXT: ret | ||||

460 | %res = cmpxchg i32* %ptr, i32 %cmp, i32 %val acq_rel acquire | ||||

461 | ret void | ||||

462 | } | ||||

463 | | ||||

464 | define void @cmpxchg_i32_seq_cst_monotonic(i32* %ptr, i32 %cmp, i32 %val) { | ||||

465 | ; RV32I-LABEL: cmpxchg_i32_seq_cst_monotonic: | ||||

466 | ; RV32I: # %bb.0: | ||||

467 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

468 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

469 | ; RV32I-NEXT: sw a1, 8(sp) | ||||

470 | ; RV32I-NEXT: addi a1, sp, 8 | ||||

471 | ; RV32I-NEXT: addi a3, zero, 5 | ||||

472 | ; RV32I-NEXT: mv a4, zero | ||||

473 | ; RV32I-NEXT: call __atomic_compare_exchange_4 | ||||

474 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

475 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

476 | ; RV32I-NEXT: ret | ||||

477 | %res = cmpxchg i32* %ptr, i32 %cmp, i32 %val seq_cst monotonic | ||||

478 | ret void | ||||

479 | } | ||||

480 | | ||||

481 | define void @cmpxchg_i32_seq_cst_acquire(i32* %ptr, i32 %cmp, i32 %val) { | ||||

482 | ; RV32I-LABEL: cmpxchg_i32_seq_cst_acquire: | ||||

483 | ; RV32I: # %bb.0: | ||||

484 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

485 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

486 | ; RV32I-NEXT: sw a1, 8(sp) | ||||

487 | ; RV32I-NEXT: addi a1, sp, 8 | ||||

488 | ; RV32I-NEXT: addi a3, zero, 5 | ||||

489 | ; RV32I-NEXT: addi a4, zero, 2 | ||||

490 | ; RV32I-NEXT: call __atomic_compare_exchange_4 | ||||

491 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

492 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

493 | ; RV32I-NEXT: ret | ||||

494 | %res = cmpxchg i32* %ptr, i32 %cmp, i32 %val seq_cst acquire | ||||

495 | ret void | ||||

496 | } | ||||

497 | | ||||

498 | define void @cmpxchg_i32_seq_cst_seq_cst(i32* %ptr, i32 %cmp, i32 %val) { | ||||

499 | ; RV32I-LABEL: cmpxchg_i32_seq_cst_seq_cst: | ||||

500 | ; RV32I: # %bb.0: | ||||

501 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

502 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

503 | ; RV32I-NEXT: sw a1, 8(sp) | ||||

504 | ; RV32I-NEXT: addi a1, sp, 8 | ||||

505 | ; RV32I-NEXT: addi a3, zero, 5 | ||||

506 | ; RV32I-NEXT: mv a4, a3 | ||||

507 | ; RV32I-NEXT: call __atomic_compare_exchange_4 | ||||

508 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

509 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

510 | ; RV32I-NEXT: ret | ||||

511 | %res = cmpxchg i32* %ptr, i32 %cmp, i32 %val seq_cst seq_cst | ||||

512 | ret void | ||||

513 | } | ||||

514 | | ||||

515 | define void @cmpxchg_i64_monotonic_monotonic(i64* %ptr, i64 %cmp, i64 %val) { | ||||

516 | ; RV32I-LABEL: cmpxchg_i64_monotonic_monotonic: | ||||

517 | ; RV32I: # %bb.0: | ||||

518 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

519 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

520 | ; RV32I-NEXT: sw a2, 4(sp) | ||||

521 | ; RV32I-NEXT: sw a1, 0(sp) | ||||

522 | ; RV32I-NEXT: mv a1, sp | ||||

523 | ; RV32I-NEXT: mv a2, a3 | ||||

524 | ; RV32I-NEXT: mv a3, a4 | ||||

525 | ; RV32I-NEXT: mv a4, zero | ||||

526 | ; RV32I-NEXT: mv a5, zero | ||||

527 | ; RV32I-NEXT: call __atomic_compare_exchange_8 | ||||

528 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

529 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

530 | ; RV32I-NEXT: ret | ||||

531 | %res = cmpxchg i64* %ptr, i64 %cmp, i64 %val monotonic monotonic | ||||

532 | ret void | ||||

533 | } | ||||

534 | | ||||

535 | define void @cmpxchg_i64_acquire_monotonic(i64* %ptr, i64 %cmp, i64 %val) { | ||||

536 | ; RV32I-LABEL: cmpxchg_i64_acquire_monotonic: | ||||

537 | ; RV32I: # %bb.0: | ||||

538 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

539 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

540 | ; RV32I-NEXT: sw a2, 4(sp) | ||||

541 | ; RV32I-NEXT: sw a1, 0(sp) | ||||

542 | ; RV32I-NEXT: mv a1, sp | ||||

543 | ; RV32I-NEXT: addi a5, zero, 2 | ||||

544 | ; RV32I-NEXT: mv a2, a3 | ||||

545 | ; RV32I-NEXT: mv a3, a4 | ||||

546 | ; RV32I-NEXT: mv a4, a5 | ||||

547 | ; RV32I-NEXT: mv a5, zero | ||||

548 | ; RV32I-NEXT: call __atomic_compare_exchange_8 | ||||

549 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

550 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

551 | ; RV32I-NEXT: ret | ||||

552 | %res = cmpxchg i64* %ptr, i64 %cmp, i64 %val acquire monotonic | ||||

553 | ret void | ||||

554 | } | ||||

555 | | ||||

556 | define void @cmpxchg_i64_acquire_acquire(i64* %ptr, i64 %cmp, i64 %val) { | ||||

557 | ; RV32I-LABEL: cmpxchg_i64_acquire_acquire: | ||||

558 | ; RV32I: # %bb.0: | ||||

559 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

560 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

561 | ; RV32I-NEXT: sw a2, 4(sp) | ||||

562 | ; RV32I-NEXT: sw a1, 0(sp) | ||||

563 | ; RV32I-NEXT: mv a1, sp | ||||

564 | ; RV32I-NEXT: addi a5, zero, 2 | ||||

565 | ; RV32I-NEXT: mv a2, a3 | ||||

566 | ; RV32I-NEXT: mv a3, a4 | ||||

567 | ; RV32I-NEXT: mv a4, a5 | ||||

568 | ; RV32I-NEXT: call __atomic_compare_exchange_8 | ||||

569 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

570 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

571 | ; RV32I-NEXT: ret | ||||

572 | %res = cmpxchg i64* %ptr, i64 %cmp, i64 %val acquire acquire | ||||

573 | ret void | ||||

574 | } | ||||

575 | | ||||

576 | define void @cmpxchg_i64_release_monotonic(i64* %ptr, i64 %cmp, i64 %val) { | ||||

577 | ; RV32I-LABEL: cmpxchg_i64_release_monotonic: | ||||

578 | ; RV32I: # %bb.0: | ||||

579 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

580 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

581 | ; RV32I-NEXT: sw a2, 4(sp) | ||||

582 | ; RV32I-NEXT: sw a1, 0(sp) | ||||

583 | ; RV32I-NEXT: mv a1, sp | ||||

584 | ; RV32I-NEXT: addi a5, zero, 3 | ||||

585 | ; RV32I-NEXT: mv a2, a3 | ||||

586 | ; RV32I-NEXT: mv a3, a4 | ||||

587 | ; RV32I-NEXT: mv a4, a5 | ||||

588 | ; RV32I-NEXT: mv a5, zero | ||||

589 | ; RV32I-NEXT: call __atomic_compare_exchange_8 | ||||

590 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

591 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

592 | ; RV32I-NEXT: ret | ||||

593 | %res = cmpxchg i64* %ptr, i64 %cmp, i64 %val release monotonic | ||||

594 | ret void | ||||

595 | } | ||||

596 | | ||||

597 | define void @cmpxchg_i64_release_acquire(i64* %ptr, i64 %cmp, i64 %val) { | ||||

598 | ; RV32I-LABEL: cmpxchg_i64_release_acquire: | ||||

599 | ; RV32I: # %bb.0: | ||||

600 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

601 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

602 | ; RV32I-NEXT: sw a2, 4(sp) | ||||

603 | ; RV32I-NEXT: sw a1, 0(sp) | ||||

604 | ; RV32I-NEXT: mv a1, sp | ||||

605 | ; RV32I-NEXT: addi a6, zero, 3 | ||||

606 | ; RV32I-NEXT: addi a5, zero, 2 | ||||

607 | ; RV32I-NEXT: mv a2, a3 | ||||

608 | ; RV32I-NEXT: mv a3, a4 | ||||

609 | ; RV32I-NEXT: mv a4, a6 | ||||

610 | ; RV32I-NEXT: call __atomic_compare_exchange_8 | ||||

611 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

612 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

613 | ; RV32I-NEXT: ret | ||||

614 | %res = cmpxchg i64* %ptr, i64 %cmp, i64 %val release acquire | ||||

615 | ret void | ||||

616 | } | ||||

617 | | ||||

618 | define void @cmpxchg_i64_acq_rel_monotonic(i64* %ptr, i64 %cmp, i64 %val) { | ||||

619 | ; RV32I-LABEL: cmpxchg_i64_acq_rel_monotonic: | ||||

620 | ; RV32I: # %bb.0: | ||||

621 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

622 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

623 | ; RV32I-NEXT: sw a2, 4(sp) | ||||

624 | ; RV32I-NEXT: sw a1, 0(sp) | ||||

625 | ; RV32I-NEXT: mv a1, sp | ||||

626 | ; RV32I-NEXT: addi a5, zero, 4 | ||||

627 | ; RV32I-NEXT: mv a2, a3 | ||||

628 | ; RV32I-NEXT: mv a3, a4 | ||||

629 | ; RV32I-NEXT: mv a4, a5 | ||||

630 | ; RV32I-NEXT: mv a5, zero | ||||

631 | ; RV32I-NEXT: call __atomic_compare_exchange_8 | ||||

632 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

633 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

634 | ; RV32I-NEXT: ret | ||||

635 | %res = cmpxchg i64* %ptr, i64 %cmp, i64 %val acq_rel monotonic | ||||

636 | ret void | ||||

637 | } | ||||

638 | | ||||

639 | define void @cmpxchg_i64_acq_rel_acquire(i64* %ptr, i64 %cmp, i64 %val) { | ||||

640 | ; RV32I-LABEL: cmpxchg_i64_acq_rel_acquire: | ||||

641 | ; RV32I: # %bb.0: | ||||

642 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

643 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

644 | ; RV32I-NEXT: sw a2, 4(sp) | ||||

645 | ; RV32I-NEXT: sw a1, 0(sp) | ||||

646 | ; RV32I-NEXT: mv a1, sp | ||||

647 | ; RV32I-NEXT: addi a6, zero, 4 | ||||

648 | ; RV32I-NEXT: addi a5, zero, 2 | ||||

649 | ; RV32I-NEXT: mv a2, a3 | ||||

650 | ; RV32I-NEXT: mv a3, a4 | ||||

651 | ; RV32I-NEXT: mv a4, a6 | ||||

652 | ; RV32I-NEXT: call __atomic_compare_exchange_8 | ||||

653 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

654 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

655 | ; RV32I-NEXT: ret | ||||

656 | %res = cmpxchg i64* %ptr, i64 %cmp, i64 %val acq_rel acquire | ||||

657 | ret void | ||||

658 | } | ||||

659 | | ||||

660 | define void @cmpxchg_i64_seq_cst_monotonic(i64* %ptr, i64 %cmp, i64 %val) { | ||||

661 | ; RV32I-LABEL: cmpxchg_i64_seq_cst_monotonic: | ||||

662 | ; RV32I: # %bb.0: | ||||

663 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

664 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

665 | ; RV32I-NEXT: sw a2, 4(sp) | ||||

666 | ; RV32I-NEXT: sw a1, 0(sp) | ||||

667 | ; RV32I-NEXT: mv a1, sp | ||||

668 | ; RV32I-NEXT: addi a5, zero, 5 | ||||

669 | ; RV32I-NEXT: mv a2, a3 | ||||

670 | ; RV32I-NEXT: mv a3, a4 | ||||

671 | ; RV32I-NEXT: mv a4, a5 | ||||

672 | ; RV32I-NEXT: mv a5, zero | ||||

673 | ; RV32I-NEXT: call __atomic_compare_exchange_8 | ||||

674 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

675 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

676 | ; RV32I-NEXT: ret | ||||

677 | %res = cmpxchg i64* %ptr, i64 %cmp, i64 %val seq_cst monotonic | ||||

678 | ret void | ||||

679 | } | ||||

680 | | ||||

681 | define void @cmpxchg_i64_seq_cst_acquire(i64* %ptr, i64 %cmp, i64 %val) { | ||||

682 | ; RV32I-LABEL: cmpxchg_i64_seq_cst_acquire: | ||||

683 | ; RV32I: # %bb.0: | ||||

684 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

685 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

686 | ; RV32I-NEXT: sw a2, 4(sp) | ||||

687 | ; RV32I-NEXT: sw a1, 0(sp) | ||||

688 | ; RV32I-NEXT: mv a1, sp | ||||

689 | ; RV32I-NEXT: addi a6, zero, 5 | ||||

690 | ; RV32I-NEXT: addi a5, zero, 2 | ||||

691 | ; RV32I-NEXT: mv a2, a3 | ||||

692 | ; RV32I-NEXT: mv a3, a4 | ||||

693 | ; RV32I-NEXT: mv a4, a6 | ||||

694 | ; RV32I-NEXT: call __atomic_compare_exchange_8 | ||||

695 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

696 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

697 | ; RV32I-NEXT: ret | ||||

698 | %res = cmpxchg i64* %ptr, i64 %cmp, i64 %val seq_cst acquire | ||||

699 | ret void | ||||

700 | } | ||||

701 | | ||||

702 | define void @cmpxchg_i64_seq_cst_seq_cst(i64* %ptr, i64 %cmp, i64 %val) { | ||||

703 | ; RV32I-LABEL: cmpxchg_i64_seq_cst_seq_cst: | ||||

704 | ; RV32I: # %bb.0: | ||||

705 | ; RV32I-NEXT: addi sp, sp, -16 | ||||

706 | ; RV32I-NEXT: sw ra, 12(sp) | ||||

707 | ; RV32I-NEXT: sw a2, 4(sp) | ||||

708 | ; RV32I-NEXT: sw a1, 0(sp) | ||||

709 | ; RV32I-NEXT: mv a1, sp | ||||

710 | ; RV32I-NEXT: addi a5, zero, 5 | ||||

711 | ; RV32I-NEXT: mv a2, a3 | ||||

712 | ; RV32I-NEXT: mv a3, a4 | ||||

713 | ; RV32I-NEXT: mv a4, a5 | ||||

714 | ; RV32I-NEXT: call __atomic_compare_exchange_8 | ||||

715 | ; RV32I-NEXT: lw ra, 12(sp) | ||||

716 | ; RV32I-NEXT: addi sp, sp, 16 | ||||

717 | ; RV32I-NEXT: ret | ||||

718 | %res = cmpxchg i64* %ptr, i64 %cmp, i64 %val seq_cst seq_cst | ||||

719 | ret void | ||||

720 | } |