1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips4 -relocation-model=pic -verify-machineinstrs < %s | \ 3 ; RUN: FileCheck %s -check-prefix=MIPS4 4 ; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | \ 5 ; RUN: FileCheck %s -check-prefix=MIPS64 6 ; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r2 -relocation-model=pic -verify-machineinstrs < %s | \ 7 ; RUN: FileCheck %s -check-prefix=MIPS64R2 8 ; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs < %s | \ 9 ; RUN: FileCheck %s -check-prefix=MIPS64R6 10 ; RUN: llc -mtriple=mips64-unknown-linux-gnu -O0 -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs -verify-machineinstrs < %s | \ 11 ; RUN: FileCheck %s -check-prefix=MIPS64R6O0 12 13 ; We want to verify the produced code is well formed all optimization levels, the rest of the test which ensure correctness. 14 ; RUN: llc -mtriple=mips64el-unknown-linux-gnu -O1 --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O1 15 ; RUN: llc -mtriple=mips64el-unknown-linux-gnu -O2 --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O2 16 ; RUN: llc -mtriple=mips64el-unknown-linux-gnu -O3 --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O3 17 18 ; Keep one big-endian check so that we don't reduce testing, but don't add more 19 ; since endianness doesn't affect the body of the atomic operations. 20 ; RUN: llc -mtriple=mips64-unknown-linux-gnu --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | \ 21 ; RUN: FileCheck %s -check-prefix=MIPS64EB 22 23 @x = common global i64 0, align 4 24 25 define i64 @AtomicLoadAdd(i64 signext %incr) nounwind { 26 ; MIPS4-LABEL: AtomicLoadAdd: 27 ; MIPS4: # %bb.0: # %entry 28 ; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 29 ; MIPS4-NEXT: daddu $1, $1, $25 30 ; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 31 ; MIPS4-NEXT: ld $1, %got_disp(x)($1) 32 ; MIPS4-NEXT: .LBB0_1: # %entry 33 ; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 34 ; MIPS4-NEXT: lld $2, 0($1) 35 ; MIPS4-NEXT: daddu $3, $2, $4 36 ; MIPS4-NEXT: scd $3, 0($1) 37 ; MIPS4-NEXT: beqz $3, .LBB0_1 38 ; MIPS4-NEXT: nop 39 ; MIPS4-NEXT: # %bb.2: # %entry 40 ; MIPS4-NEXT: jr $ra 41 ; MIPS4-NEXT: nop 42 ; 43 ; MIPS64-LABEL: AtomicLoadAdd: 44 ; MIPS64: # %bb.0: # %entry 45 ; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 46 ; MIPS64-NEXT: daddu $1, $1, $25 47 ; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 48 ; MIPS64-NEXT: ld $1, %got_disp(x)($1) 49 ; MIPS64-NEXT: .LBB0_1: # %entry 50 ; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 51 ; MIPS64-NEXT: lld $2, 0($1) 52 ; MIPS64-NEXT: daddu $3, $2, $4 53 ; MIPS64-NEXT: scd $3, 0($1) 54 ; MIPS64-NEXT: beqz $3, .LBB0_1 55 ; MIPS64-NEXT: nop 56 ; MIPS64-NEXT: # %bb.2: # %entry 57 ; MIPS64-NEXT: jr $ra 58 ; MIPS64-NEXT: nop 59 ; 60 ; MIPS64R2-LABEL: AtomicLoadAdd: 61 ; MIPS64R2: # %bb.0: # %entry 62 ; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 63 ; MIPS64R2-NEXT: daddu $1, $1, $25 64 ; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 65 ; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 66 ; MIPS64R2-NEXT: .LBB0_1: # %entry 67 ; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 68 ; MIPS64R2-NEXT: lld $2, 0($1) 69 ; MIPS64R2-NEXT: daddu $3, $2, $4 70 ; MIPS64R2-NEXT: scd $3, 0($1) 71 ; MIPS64R2-NEXT: beqz $3, .LBB0_1 72 ; MIPS64R2-NEXT: nop 73 ; MIPS64R2-NEXT: # %bb.2: # %entry 74 ; MIPS64R2-NEXT: jr $ra 75 ; MIPS64R2-NEXT: nop 76 ; 77 ; MIPS64R6-LABEL: AtomicLoadAdd: 78 ; MIPS64R6: # %bb.0: # %entry 79 ; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 80 ; MIPS64R6-NEXT: daddu $1, $1, $25 81 ; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 82 ; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 83 ; MIPS64R6-NEXT: .LBB0_1: # %entry 84 ; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 85 ; MIPS64R6-NEXT: lld $2, 0($1) 86 ; MIPS64R6-NEXT: daddu $3, $2, $4 87 ; MIPS64R6-NEXT: scd $3, 0($1) 88 ; MIPS64R6-NEXT: beqzc $3, .LBB0_1 89 ; MIPS64R6-NEXT: nop 90 ; MIPS64R6-NEXT: # %bb.2: # %entry 91 ; MIPS64R6-NEXT: jrc $ra 92 ; 93 ; MIPS64R6O0-LABEL: AtomicLoadAdd: 94 ; MIPS64R6O0: # %bb.0: # %entry 95 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 96 ; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 97 ; MIPS64R6O0-NEXT: daddu $1, $1, $25 98 ; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 99 ; MIPS64R6O0-NEXT: move $25, $4 100 ; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 101 ; MIPS64R6O0-NEXT: .LBB0_1: # %entry 102 ; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 103 ; MIPS64R6O0-NEXT: lld $2, 0($1) 104 ; MIPS64R6O0-NEXT: daddu $3, $2, $4 105 ; MIPS64R6O0-NEXT: scd $3, 0($1) 106 ; MIPS64R6O0-NEXT: beqzc $3, .LBB0_1 107 ; MIPS64R6O0-NEXT: # %bb.2: # %entry 108 ; MIPS64R6O0-NEXT: sd $25, 8($sp) # 8-byte Folded Spill 109 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 110 ; MIPS64R6O0-NEXT: jrc $ra 111 ; 112 ; O1-LABEL: AtomicLoadAdd: 113 ; O1: # %bb.0: # %entry 114 ; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 115 ; O1-NEXT: daddu $1, $1, $25 116 ; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 117 ; O1-NEXT: ld $1, %got_disp(x)($1) 118 ; O1-NEXT: .LBB0_1: # %entry 119 ; O1-NEXT: # =>This Inner Loop Header: Depth=1 120 ; O1-NEXT: lld $2, 0($1) 121 ; O1-NEXT: daddu $3, $2, $4 122 ; O1-NEXT: scd $3, 0($1) 123 ; O1-NEXT: beqz $3, .LBB0_1 124 ; O1-NEXT: nop 125 ; O1-NEXT: # %bb.2: # %entry 126 ; O1-NEXT: jr $ra 127 ; O1-NEXT: nop 128 ; 129 ; O2-LABEL: AtomicLoadAdd: 130 ; O2: # %bb.0: # %entry 131 ; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 132 ; O2-NEXT: daddu $1, $1, $25 133 ; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 134 ; O2-NEXT: ld $1, %got_disp(x)($1) 135 ; O2-NEXT: .LBB0_1: # %entry 136 ; O2-NEXT: # =>This Inner Loop Header: Depth=1 137 ; O2-NEXT: lld $2, 0($1) 138 ; O2-NEXT: daddu $3, $2, $4 139 ; O2-NEXT: scd $3, 0($1) 140 ; O2-NEXT: beqz $3, .LBB0_1 141 ; O2-NEXT: nop 142 ; O2-NEXT: # %bb.2: # %entry 143 ; O2-NEXT: jr $ra 144 ; O2-NEXT: nop 145 ; 146 ; O3-LABEL: AtomicLoadAdd: 147 ; O3: # %bb.0: # %entry 148 ; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 149 ; O3-NEXT: daddu $1, $1, $25 150 ; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 151 ; O3-NEXT: ld $1, %got_disp(x)($1) 152 ; O3-NEXT: .LBB0_1: # %entry 153 ; O3-NEXT: # =>This Inner Loop Header: Depth=1 154 ; O3-NEXT: lld $2, 0($1) 155 ; O3-NEXT: daddu $3, $2, $4 156 ; O3-NEXT: scd $3, 0($1) 157 ; O3-NEXT: beqz $3, .LBB0_1 158 ; O3-NEXT: nop 159 ; O3-NEXT: # %bb.2: # %entry 160 ; O3-NEXT: jr $ra 161 ; O3-NEXT: nop 162 ; 163 ; MIPS64EB-LABEL: AtomicLoadAdd: 164 ; MIPS64EB: # %bb.0: # %entry 165 ; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd))) 166 ; MIPS64EB-NEXT: daddu $1, $1, $25 167 ; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd))) 168 ; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 169 ; MIPS64EB-NEXT: .LBB0_1: # %entry 170 ; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 171 ; MIPS64EB-NEXT: lld $2, 0($1) 172 ; MIPS64EB-NEXT: daddu $3, $2, $4 173 ; MIPS64EB-NEXT: scd $3, 0($1) 174 ; MIPS64EB-NEXT: beqz $3, .LBB0_1 175 ; MIPS64EB-NEXT: nop 176 ; MIPS64EB-NEXT: # %bb.2: # %entry 177 ; MIPS64EB-NEXT: jr $ra 178 ; MIPS64EB-NEXT: nop 179 entry: 180 %0 = atomicrmw add i64* @x, i64 %incr monotonic 181 ret i64 %0 182 183 } 184 185 define i64 @AtomicLoadSub(i64 signext %incr) nounwind { 186 ; MIPS4-LABEL: AtomicLoadSub: 187 ; MIPS4: # %bb.0: # %entry 188 ; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 189 ; MIPS4-NEXT: daddu $1, $1, $25 190 ; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 191 ; MIPS4-NEXT: ld $1, %got_disp(x)($1) 192 ; MIPS4-NEXT: .LBB1_1: # %entry 193 ; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 194 ; MIPS4-NEXT: lld $2, 0($1) 195 ; MIPS4-NEXT: dsubu $3, $2, $4 196 ; MIPS4-NEXT: scd $3, 0($1) 197 ; MIPS4-NEXT: beqz $3, .LBB1_1 198 ; MIPS4-NEXT: nop 199 ; MIPS4-NEXT: # %bb.2: # %entry 200 ; MIPS4-NEXT: jr $ra 201 ; MIPS4-NEXT: nop 202 ; 203 ; MIPS64-LABEL: AtomicLoadSub: 204 ; MIPS64: # %bb.0: # %entry 205 ; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 206 ; MIPS64-NEXT: daddu $1, $1, $25 207 ; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 208 ; MIPS64-NEXT: ld $1, %got_disp(x)($1) 209 ; MIPS64-NEXT: .LBB1_1: # %entry 210 ; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 211 ; MIPS64-NEXT: lld $2, 0($1) 212 ; MIPS64-NEXT: dsubu $3, $2, $4 213 ; MIPS64-NEXT: scd $3, 0($1) 214 ; MIPS64-NEXT: beqz $3, .LBB1_1 215 ; MIPS64-NEXT: nop 216 ; MIPS64-NEXT: # %bb.2: # %entry 217 ; MIPS64-NEXT: jr $ra 218 ; MIPS64-NEXT: nop 219 ; 220 ; MIPS64R2-LABEL: AtomicLoadSub: 221 ; MIPS64R2: # %bb.0: # %entry 222 ; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 223 ; MIPS64R2-NEXT: daddu $1, $1, $25 224 ; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 225 ; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 226 ; MIPS64R2-NEXT: .LBB1_1: # %entry 227 ; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 228 ; MIPS64R2-NEXT: lld $2, 0($1) 229 ; MIPS64R2-NEXT: dsubu $3, $2, $4 230 ; MIPS64R2-NEXT: scd $3, 0($1) 231 ; MIPS64R2-NEXT: beqz $3, .LBB1_1 232 ; MIPS64R2-NEXT: nop 233 ; MIPS64R2-NEXT: # %bb.2: # %entry 234 ; MIPS64R2-NEXT: jr $ra 235 ; MIPS64R2-NEXT: nop 236 ; 237 ; MIPS64R6-LABEL: AtomicLoadSub: 238 ; MIPS64R6: # %bb.0: # %entry 239 ; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 240 ; MIPS64R6-NEXT: daddu $1, $1, $25 241 ; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 242 ; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 243 ; MIPS64R6-NEXT: .LBB1_1: # %entry 244 ; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 245 ; MIPS64R6-NEXT: lld $2, 0($1) 246 ; MIPS64R6-NEXT: dsubu $3, $2, $4 247 ; MIPS64R6-NEXT: scd $3, 0($1) 248 ; MIPS64R6-NEXT: beqzc $3, .LBB1_1 249 ; MIPS64R6-NEXT: nop 250 ; MIPS64R6-NEXT: # %bb.2: # %entry 251 ; MIPS64R6-NEXT: jrc $ra 252 ; 253 ; MIPS64R6O0-LABEL: AtomicLoadSub: 254 ; MIPS64R6O0: # %bb.0: # %entry 255 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 256 ; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 257 ; MIPS64R6O0-NEXT: daddu $1, $1, $25 258 ; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 259 ; MIPS64R6O0-NEXT: move $25, $4 260 ; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 261 ; MIPS64R6O0-NEXT: .LBB1_1: # %entry 262 ; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 263 ; MIPS64R6O0-NEXT: lld $2, 0($1) 264 ; MIPS64R6O0-NEXT: dsubu $3, $2, $4 265 ; MIPS64R6O0-NEXT: scd $3, 0($1) 266 ; MIPS64R6O0-NEXT: beqzc $3, .LBB1_1 267 ; MIPS64R6O0-NEXT: # %bb.2: # %entry 268 ; MIPS64R6O0-NEXT: sd $25, 8($sp) # 8-byte Folded Spill 269 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 270 ; MIPS64R6O0-NEXT: jrc $ra 271 ; 272 ; O1-LABEL: AtomicLoadSub: 273 ; O1: # %bb.0: # %entry 274 ; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 275 ; O1-NEXT: daddu $1, $1, $25 276 ; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 277 ; O1-NEXT: ld $1, %got_disp(x)($1) 278 ; O1-NEXT: .LBB1_1: # %entry 279 ; O1-NEXT: # =>This Inner Loop Header: Depth=1 280 ; O1-NEXT: lld $2, 0($1) 281 ; O1-NEXT: dsubu $3, $2, $4 282 ; O1-NEXT: scd $3, 0($1) 283 ; O1-NEXT: beqz $3, .LBB1_1 284 ; O1-NEXT: nop 285 ; O1-NEXT: # %bb.2: # %entry 286 ; O1-NEXT: jr $ra 287 ; O1-NEXT: nop 288 ; 289 ; O2-LABEL: AtomicLoadSub: 290 ; O2: # %bb.0: # %entry 291 ; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 292 ; O2-NEXT: daddu $1, $1, $25 293 ; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 294 ; O2-NEXT: ld $1, %got_disp(x)($1) 295 ; O2-NEXT: .LBB1_1: # %entry 296 ; O2-NEXT: # =>This Inner Loop Header: Depth=1 297 ; O2-NEXT: lld $2, 0($1) 298 ; O2-NEXT: dsubu $3, $2, $4 299 ; O2-NEXT: scd $3, 0($1) 300 ; O2-NEXT: beqz $3, .LBB1_1 301 ; O2-NEXT: nop 302 ; O2-NEXT: # %bb.2: # %entry 303 ; O2-NEXT: jr $ra 304 ; O2-NEXT: nop 305 ; 306 ; O3-LABEL: AtomicLoadSub: 307 ; O3: # %bb.0: # %entry 308 ; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 309 ; O3-NEXT: daddu $1, $1, $25 310 ; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 311 ; O3-NEXT: ld $1, %got_disp(x)($1) 312 ; O3-NEXT: .LBB1_1: # %entry 313 ; O3-NEXT: # =>This Inner Loop Header: Depth=1 314 ; O3-NEXT: lld $2, 0($1) 315 ; O3-NEXT: dsubu $3, $2, $4 316 ; O3-NEXT: scd $3, 0($1) 317 ; O3-NEXT: beqz $3, .LBB1_1 318 ; O3-NEXT: nop 319 ; O3-NEXT: # %bb.2: # %entry 320 ; O3-NEXT: jr $ra 321 ; O3-NEXT: nop 322 ; 323 ; MIPS64EB-LABEL: AtomicLoadSub: 324 ; MIPS64EB: # %bb.0: # %entry 325 ; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadSub))) 326 ; MIPS64EB-NEXT: daddu $1, $1, $25 327 ; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub))) 328 ; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 329 ; MIPS64EB-NEXT: .LBB1_1: # %entry 330 ; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 331 ; MIPS64EB-NEXT: lld $2, 0($1) 332 ; MIPS64EB-NEXT: dsubu $3, $2, $4 333 ; MIPS64EB-NEXT: scd $3, 0($1) 334 ; MIPS64EB-NEXT: beqz $3, .LBB1_1 335 ; MIPS64EB-NEXT: nop 336 ; MIPS64EB-NEXT: # %bb.2: # %entry 337 ; MIPS64EB-NEXT: jr $ra 338 ; MIPS64EB-NEXT: nop 339 entry: 340 %0 = atomicrmw sub i64* @x, i64 %incr monotonic 341 ret i64 %0 342 343 } 344 345 define i64 @AtomicLoadAnd(i64 signext %incr) nounwind { 346 ; MIPS4-LABEL: AtomicLoadAnd: 347 ; MIPS4: # %bb.0: # %entry 348 ; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 349 ; MIPS4-NEXT: daddu $1, $1, $25 350 ; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 351 ; MIPS4-NEXT: ld $1, %got_disp(x)($1) 352 ; MIPS4-NEXT: .LBB2_1: # %entry 353 ; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 354 ; MIPS4-NEXT: lld $2, 0($1) 355 ; MIPS4-NEXT: and $3, $2, $4 356 ; MIPS4-NEXT: scd $3, 0($1) 357 ; MIPS4-NEXT: beqz $3, .LBB2_1 358 ; MIPS4-NEXT: nop 359 ; MIPS4-NEXT: # %bb.2: # %entry 360 ; MIPS4-NEXT: jr $ra 361 ; MIPS4-NEXT: nop 362 ; 363 ; MIPS64-LABEL: AtomicLoadAnd: 364 ; MIPS64: # %bb.0: # %entry 365 ; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 366 ; MIPS64-NEXT: daddu $1, $1, $25 367 ; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 368 ; MIPS64-NEXT: ld $1, %got_disp(x)($1) 369 ; MIPS64-NEXT: .LBB2_1: # %entry 370 ; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 371 ; MIPS64-NEXT: lld $2, 0($1) 372 ; MIPS64-NEXT: and $3, $2, $4 373 ; MIPS64-NEXT: scd $3, 0($1) 374 ; MIPS64-NEXT: beqz $3, .LBB2_1 375 ; MIPS64-NEXT: nop 376 ; MIPS64-NEXT: # %bb.2: # %entry 377 ; MIPS64-NEXT: jr $ra 378 ; MIPS64-NEXT: nop 379 ; 380 ; MIPS64R2-LABEL: AtomicLoadAnd: 381 ; MIPS64R2: # %bb.0: # %entry 382 ; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 383 ; MIPS64R2-NEXT: daddu $1, $1, $25 384 ; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 385 ; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 386 ; MIPS64R2-NEXT: .LBB2_1: # %entry 387 ; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 388 ; MIPS64R2-NEXT: lld $2, 0($1) 389 ; MIPS64R2-NEXT: and $3, $2, $4 390 ; MIPS64R2-NEXT: scd $3, 0($1) 391 ; MIPS64R2-NEXT: beqz $3, .LBB2_1 392 ; MIPS64R2-NEXT: nop 393 ; MIPS64R2-NEXT: # %bb.2: # %entry 394 ; MIPS64R2-NEXT: jr $ra 395 ; MIPS64R2-NEXT: nop 396 ; 397 ; MIPS64R6-LABEL: AtomicLoadAnd: 398 ; MIPS64R6: # %bb.0: # %entry 399 ; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 400 ; MIPS64R6-NEXT: daddu $1, $1, $25 401 ; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 402 ; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 403 ; MIPS64R6-NEXT: .LBB2_1: # %entry 404 ; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 405 ; MIPS64R6-NEXT: lld $2, 0($1) 406 ; MIPS64R6-NEXT: and $3, $2, $4 407 ; MIPS64R6-NEXT: scd $3, 0($1) 408 ; MIPS64R6-NEXT: beqzc $3, .LBB2_1 409 ; MIPS64R6-NEXT: nop 410 ; MIPS64R6-NEXT: # %bb.2: # %entry 411 ; MIPS64R6-NEXT: jrc $ra 412 ; 413 ; MIPS64R6O0-LABEL: AtomicLoadAnd: 414 ; MIPS64R6O0: # %bb.0: # %entry 415 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 416 ; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 417 ; MIPS64R6O0-NEXT: daddu $1, $1, $25 418 ; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 419 ; MIPS64R6O0-NEXT: move $25, $4 420 ; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 421 ; MIPS64R6O0-NEXT: .LBB2_1: # %entry 422 ; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 423 ; MIPS64R6O0-NEXT: lld $2, 0($1) 424 ; MIPS64R6O0-NEXT: and $3, $2, $4 425 ; MIPS64R6O0-NEXT: scd $3, 0($1) 426 ; MIPS64R6O0-NEXT: beqzc $3, .LBB2_1 427 ; MIPS64R6O0-NEXT: # %bb.2: # %entry 428 ; MIPS64R6O0-NEXT: sd $25, 8($sp) # 8-byte Folded Spill 429 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 430 ; MIPS64R6O0-NEXT: jrc $ra 431 ; 432 ; O1-LABEL: AtomicLoadAnd: 433 ; O1: # %bb.0: # %entry 434 ; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 435 ; O1-NEXT: daddu $1, $1, $25 436 ; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 437 ; O1-NEXT: ld $1, %got_disp(x)($1) 438 ; O1-NEXT: .LBB2_1: # %entry 439 ; O1-NEXT: # =>This Inner Loop Header: Depth=1 440 ; O1-NEXT: lld $2, 0($1) 441 ; O1-NEXT: and $3, $2, $4 442 ; O1-NEXT: scd $3, 0($1) 443 ; O1-NEXT: beqz $3, .LBB2_1 444 ; O1-NEXT: nop 445 ; O1-NEXT: # %bb.2: # %entry 446 ; O1-NEXT: jr $ra 447 ; O1-NEXT: nop 448 ; 449 ; O2-LABEL: AtomicLoadAnd: 450 ; O2: # %bb.0: # %entry 451 ; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 452 ; O2-NEXT: daddu $1, $1, $25 453 ; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 454 ; O2-NEXT: ld $1, %got_disp(x)($1) 455 ; O2-NEXT: .LBB2_1: # %entry 456 ; O2-NEXT: # =>This Inner Loop Header: Depth=1 457 ; O2-NEXT: lld $2, 0($1) 458 ; O2-NEXT: and $3, $2, $4 459 ; O2-NEXT: scd $3, 0($1) 460 ; O2-NEXT: beqz $3, .LBB2_1 461 ; O2-NEXT: nop 462 ; O2-NEXT: # %bb.2: # %entry 463 ; O2-NEXT: jr $ra 464 ; O2-NEXT: nop 465 ; 466 ; O3-LABEL: AtomicLoadAnd: 467 ; O3: # %bb.0: # %entry 468 ; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 469 ; O3-NEXT: daddu $1, $1, $25 470 ; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 471 ; O3-NEXT: ld $1, %got_disp(x)($1) 472 ; O3-NEXT: .LBB2_1: # %entry 473 ; O3-NEXT: # =>This Inner Loop Header: Depth=1 474 ; O3-NEXT: lld $2, 0($1) 475 ; O3-NEXT: and $3, $2, $4 476 ; O3-NEXT: scd $3, 0($1) 477 ; O3-NEXT: beqz $3, .LBB2_1 478 ; O3-NEXT: nop 479 ; O3-NEXT: # %bb.2: # %entry 480 ; O3-NEXT: jr $ra 481 ; O3-NEXT: nop 482 ; 483 ; MIPS64EB-LABEL: AtomicLoadAnd: 484 ; MIPS64EB: # %bb.0: # %entry 485 ; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd))) 486 ; MIPS64EB-NEXT: daddu $1, $1, $25 487 ; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd))) 488 ; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 489 ; MIPS64EB-NEXT: .LBB2_1: # %entry 490 ; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 491 ; MIPS64EB-NEXT: lld $2, 0($1) 492 ; MIPS64EB-NEXT: and $3, $2, $4 493 ; MIPS64EB-NEXT: scd $3, 0($1) 494 ; MIPS64EB-NEXT: beqz $3, .LBB2_1 495 ; MIPS64EB-NEXT: nop 496 ; MIPS64EB-NEXT: # %bb.2: # %entry 497 ; MIPS64EB-NEXT: jr $ra 498 ; MIPS64EB-NEXT: nop 499 entry: 500 %0 = atomicrmw and i64* @x, i64 %incr monotonic 501 ret i64 %0 502 503 } 504 505 define i64 @AtomicLoadOr(i64 signext %incr) nounwind { 506 ; MIPS4-LABEL: AtomicLoadOr: 507 ; MIPS4: # %bb.0: # %entry 508 ; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 509 ; MIPS4-NEXT: daddu $1, $1, $25 510 ; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 511 ; MIPS4-NEXT: ld $1, %got_disp(x)($1) 512 ; MIPS4-NEXT: .LBB3_1: # %entry 513 ; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 514 ; MIPS4-NEXT: lld $2, 0($1) 515 ; MIPS4-NEXT: or $3, $2, $4 516 ; MIPS4-NEXT: scd $3, 0($1) 517 ; MIPS4-NEXT: beqz $3, .LBB3_1 518 ; MIPS4-NEXT: nop 519 ; MIPS4-NEXT: # %bb.2: # %entry 520 ; MIPS4-NEXT: jr $ra 521 ; MIPS4-NEXT: nop 522 ; 523 ; MIPS64-LABEL: AtomicLoadOr: 524 ; MIPS64: # %bb.0: # %entry 525 ; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 526 ; MIPS64-NEXT: daddu $1, $1, $25 527 ; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 528 ; MIPS64-NEXT: ld $1, %got_disp(x)($1) 529 ; MIPS64-NEXT: .LBB3_1: # %entry 530 ; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 531 ; MIPS64-NEXT: lld $2, 0($1) 532 ; MIPS64-NEXT: or $3, $2, $4 533 ; MIPS64-NEXT: scd $3, 0($1) 534 ; MIPS64-NEXT: beqz $3, .LBB3_1 535 ; MIPS64-NEXT: nop 536 ; MIPS64-NEXT: # %bb.2: # %entry 537 ; MIPS64-NEXT: jr $ra 538 ; MIPS64-NEXT: nop 539 ; 540 ; MIPS64R2-LABEL: AtomicLoadOr: 541 ; MIPS64R2: # %bb.0: # %entry 542 ; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 543 ; MIPS64R2-NEXT: daddu $1, $1, $25 544 ; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 545 ; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 546 ; MIPS64R2-NEXT: .LBB3_1: # %entry 547 ; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 548 ; MIPS64R2-NEXT: lld $2, 0($1) 549 ; MIPS64R2-NEXT: or $3, $2, $4 550 ; MIPS64R2-NEXT: scd $3, 0($1) 551 ; MIPS64R2-NEXT: beqz $3, .LBB3_1 552 ; MIPS64R2-NEXT: nop 553 ; MIPS64R2-NEXT: # %bb.2: # %entry 554 ; MIPS64R2-NEXT: jr $ra 555 ; MIPS64R2-NEXT: nop 556 ; 557 ; MIPS64R6-LABEL: AtomicLoadOr: 558 ; MIPS64R6: # %bb.0: # %entry 559 ; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 560 ; MIPS64R6-NEXT: daddu $1, $1, $25 561 ; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 562 ; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 563 ; MIPS64R6-NEXT: .LBB3_1: # %entry 564 ; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 565 ; MIPS64R6-NEXT: lld $2, 0($1) 566 ; MIPS64R6-NEXT: or $3, $2, $4 567 ; MIPS64R6-NEXT: scd $3, 0($1) 568 ; MIPS64R6-NEXT: beqzc $3, .LBB3_1 569 ; MIPS64R6-NEXT: nop 570 ; MIPS64R6-NEXT: # %bb.2: # %entry 571 ; MIPS64R6-NEXT: jrc $ra 572 ; 573 ; MIPS64R6O0-LABEL: AtomicLoadOr: 574 ; MIPS64R6O0: # %bb.0: # %entry 575 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 576 ; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 577 ; MIPS64R6O0-NEXT: daddu $1, $1, $25 578 ; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 579 ; MIPS64R6O0-NEXT: move $25, $4 580 ; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 581 ; MIPS64R6O0-NEXT: .LBB3_1: # %entry 582 ; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 583 ; MIPS64R6O0-NEXT: lld $2, 0($1) 584 ; MIPS64R6O0-NEXT: or $3, $2, $4 585 ; MIPS64R6O0-NEXT: scd $3, 0($1) 586 ; MIPS64R6O0-NEXT: beqzc $3, .LBB3_1 587 ; MIPS64R6O0-NEXT: # %bb.2: # %entry 588 ; MIPS64R6O0-NEXT: sd $25, 8($sp) # 8-byte Folded Spill 589 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 590 ; MIPS64R6O0-NEXT: jrc $ra 591 ; 592 ; O1-LABEL: AtomicLoadOr: 593 ; O1: # %bb.0: # %entry 594 ; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 595 ; O1-NEXT: daddu $1, $1, $25 596 ; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 597 ; O1-NEXT: ld $1, %got_disp(x)($1) 598 ; O1-NEXT: .LBB3_1: # %entry 599 ; O1-NEXT: # =>This Inner Loop Header: Depth=1 600 ; O1-NEXT: lld $2, 0($1) 601 ; O1-NEXT: or $3, $2, $4 602 ; O1-NEXT: scd $3, 0($1) 603 ; O1-NEXT: beqz $3, .LBB3_1 604 ; O1-NEXT: nop 605 ; O1-NEXT: # %bb.2: # %entry 606 ; O1-NEXT: jr $ra 607 ; O1-NEXT: nop 608 ; 609 ; O2-LABEL: AtomicLoadOr: 610 ; O2: # %bb.0: # %entry 611 ; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 612 ; O2-NEXT: daddu $1, $1, $25 613 ; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 614 ; O2-NEXT: ld $1, %got_disp(x)($1) 615 ; O2-NEXT: .LBB3_1: # %entry 616 ; O2-NEXT: # =>This Inner Loop Header: Depth=1 617 ; O2-NEXT: lld $2, 0($1) 618 ; O2-NEXT: or $3, $2, $4 619 ; O2-NEXT: scd $3, 0($1) 620 ; O2-NEXT: beqz $3, .LBB3_1 621 ; O2-NEXT: nop 622 ; O2-NEXT: # %bb.2: # %entry 623 ; O2-NEXT: jr $ra 624 ; O2-NEXT: nop 625 ; 626 ; O3-LABEL: AtomicLoadOr: 627 ; O3: # %bb.0: # %entry 628 ; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 629 ; O3-NEXT: daddu $1, $1, $25 630 ; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 631 ; O3-NEXT: ld $1, %got_disp(x)($1) 632 ; O3-NEXT: .LBB3_1: # %entry 633 ; O3-NEXT: # =>This Inner Loop Header: Depth=1 634 ; O3-NEXT: lld $2, 0($1) 635 ; O3-NEXT: or $3, $2, $4 636 ; O3-NEXT: scd $3, 0($1) 637 ; O3-NEXT: beqz $3, .LBB3_1 638 ; O3-NEXT: nop 639 ; O3-NEXT: # %bb.2: # %entry 640 ; O3-NEXT: jr $ra 641 ; O3-NEXT: nop 642 ; 643 ; MIPS64EB-LABEL: AtomicLoadOr: 644 ; MIPS64EB: # %bb.0: # %entry 645 ; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadOr))) 646 ; MIPS64EB-NEXT: daddu $1, $1, $25 647 ; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr))) 648 ; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 649 ; MIPS64EB-NEXT: .LBB3_1: # %entry 650 ; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 651 ; MIPS64EB-NEXT: lld $2, 0($1) 652 ; MIPS64EB-NEXT: or $3, $2, $4 653 ; MIPS64EB-NEXT: scd $3, 0($1) 654 ; MIPS64EB-NEXT: beqz $3, .LBB3_1 655 ; MIPS64EB-NEXT: nop 656 ; MIPS64EB-NEXT: # %bb.2: # %entry 657 ; MIPS64EB-NEXT: jr $ra 658 ; MIPS64EB-NEXT: nop 659 entry: 660 %0 = atomicrmw or i64* @x, i64 %incr monotonic 661 ret i64 %0 662 663 } 664 665 define i64 @AtomicLoadXor(i64 signext %incr) nounwind { 666 ; MIPS4-LABEL: AtomicLoadXor: 667 ; MIPS4: # %bb.0: # %entry 668 ; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 669 ; MIPS4-NEXT: daddu $1, $1, $25 670 ; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 671 ; MIPS4-NEXT: ld $1, %got_disp(x)($1) 672 ; MIPS4-NEXT: .LBB4_1: # %entry 673 ; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 674 ; MIPS4-NEXT: lld $2, 0($1) 675 ; MIPS4-NEXT: xor $3, $2, $4 676 ; MIPS4-NEXT: scd $3, 0($1) 677 ; MIPS4-NEXT: beqz $3, .LBB4_1 678 ; MIPS4-NEXT: nop 679 ; MIPS4-NEXT: # %bb.2: # %entry 680 ; MIPS4-NEXT: jr $ra 681 ; MIPS4-NEXT: nop 682 ; 683 ; MIPS64-LABEL: AtomicLoadXor: 684 ; MIPS64: # %bb.0: # %entry 685 ; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 686 ; MIPS64-NEXT: daddu $1, $1, $25 687 ; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 688 ; MIPS64-NEXT: ld $1, %got_disp(x)($1) 689 ; MIPS64-NEXT: .LBB4_1: # %entry 690 ; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 691 ; MIPS64-NEXT: lld $2, 0($1) 692 ; MIPS64-NEXT: xor $3, $2, $4 693 ; MIPS64-NEXT: scd $3, 0($1) 694 ; MIPS64-NEXT: beqz $3, .LBB4_1 695 ; MIPS64-NEXT: nop 696 ; MIPS64-NEXT: # %bb.2: # %entry 697 ; MIPS64-NEXT: jr $ra 698 ; MIPS64-NEXT: nop 699 ; 700 ; MIPS64R2-LABEL: AtomicLoadXor: 701 ; MIPS64R2: # %bb.0: # %entry 702 ; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 703 ; MIPS64R2-NEXT: daddu $1, $1, $25 704 ; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 705 ; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 706 ; MIPS64R2-NEXT: .LBB4_1: # %entry 707 ; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 708 ; MIPS64R2-NEXT: lld $2, 0($1) 709 ; MIPS64R2-NEXT: xor $3, $2, $4 710 ; MIPS64R2-NEXT: scd $3, 0($1) 711 ; MIPS64R2-NEXT: beqz $3, .LBB4_1 712 ; MIPS64R2-NEXT: nop 713 ; MIPS64R2-NEXT: # %bb.2: # %entry 714 ; MIPS64R2-NEXT: jr $ra 715 ; MIPS64R2-NEXT: nop 716 ; 717 ; MIPS64R6-LABEL: AtomicLoadXor: 718 ; MIPS64R6: # %bb.0: # %entry 719 ; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 720 ; MIPS64R6-NEXT: daddu $1, $1, $25 721 ; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 722 ; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 723 ; MIPS64R6-NEXT: .LBB4_1: # %entry 724 ; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 725 ; MIPS64R6-NEXT: lld $2, 0($1) 726 ; MIPS64R6-NEXT: xor $3, $2, $4 727 ; MIPS64R6-NEXT: scd $3, 0($1) 728 ; MIPS64R6-NEXT: beqzc $3, .LBB4_1 729 ; MIPS64R6-NEXT: nop 730 ; MIPS64R6-NEXT: # %bb.2: # %entry 731 ; MIPS64R6-NEXT: jrc $ra 732 ; 733 ; MIPS64R6O0-LABEL: AtomicLoadXor: 734 ; MIPS64R6O0: # %bb.0: # %entry 735 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 736 ; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 737 ; MIPS64R6O0-NEXT: daddu $1, $1, $25 738 ; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 739 ; MIPS64R6O0-NEXT: move $25, $4 740 ; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 741 ; MIPS64R6O0-NEXT: .LBB4_1: # %entry 742 ; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 743 ; MIPS64R6O0-NEXT: lld $2, 0($1) 744 ; MIPS64R6O0-NEXT: xor $3, $2, $4 745 ; MIPS64R6O0-NEXT: scd $3, 0($1) 746 ; MIPS64R6O0-NEXT: beqzc $3, .LBB4_1 747 ; MIPS64R6O0-NEXT: # %bb.2: # %entry 748 ; MIPS64R6O0-NEXT: sd $25, 8($sp) # 8-byte Folded Spill 749 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 750 ; MIPS64R6O0-NEXT: jrc $ra 751 ; 752 ; O1-LABEL: AtomicLoadXor: 753 ; O1: # %bb.0: # %entry 754 ; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 755 ; O1-NEXT: daddu $1, $1, $25 756 ; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 757 ; O1-NEXT: ld $1, %got_disp(x)($1) 758 ; O1-NEXT: .LBB4_1: # %entry 759 ; O1-NEXT: # =>This Inner Loop Header: Depth=1 760 ; O1-NEXT: lld $2, 0($1) 761 ; O1-NEXT: xor $3, $2, $4 762 ; O1-NEXT: scd $3, 0($1) 763 ; O1-NEXT: beqz $3, .LBB4_1 764 ; O1-NEXT: nop 765 ; O1-NEXT: # %bb.2: # %entry 766 ; O1-NEXT: jr $ra 767 ; O1-NEXT: nop 768 ; 769 ; O2-LABEL: AtomicLoadXor: 770 ; O2: # %bb.0: # %entry 771 ; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 772 ; O2-NEXT: daddu $1, $1, $25 773 ; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 774 ; O2-NEXT: ld $1, %got_disp(x)($1) 775 ; O2-NEXT: .LBB4_1: # %entry 776 ; O2-NEXT: # =>This Inner Loop Header: Depth=1 777 ; O2-NEXT: lld $2, 0($1) 778 ; O2-NEXT: xor $3, $2, $4 779 ; O2-NEXT: scd $3, 0($1) 780 ; O2-NEXT: beqz $3, .LBB4_1 781 ; O2-NEXT: nop 782 ; O2-NEXT: # %bb.2: # %entry 783 ; O2-NEXT: jr $ra 784 ; O2-NEXT: nop 785 ; 786 ; O3-LABEL: AtomicLoadXor: 787 ; O3: # %bb.0: # %entry 788 ; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 789 ; O3-NEXT: daddu $1, $1, $25 790 ; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 791 ; O3-NEXT: ld $1, %got_disp(x)($1) 792 ; O3-NEXT: .LBB4_1: # %entry 793 ; O3-NEXT: # =>This Inner Loop Header: Depth=1 794 ; O3-NEXT: lld $2, 0($1) 795 ; O3-NEXT: xor $3, $2, $4 796 ; O3-NEXT: scd $3, 0($1) 797 ; O3-NEXT: beqz $3, .LBB4_1 798 ; O3-NEXT: nop 799 ; O3-NEXT: # %bb.2: # %entry 800 ; O3-NEXT: jr $ra 801 ; O3-NEXT: nop 802 ; 803 ; MIPS64EB-LABEL: AtomicLoadXor: 804 ; MIPS64EB: # %bb.0: # %entry 805 ; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadXor))) 806 ; MIPS64EB-NEXT: daddu $1, $1, $25 807 ; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor))) 808 ; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 809 ; MIPS64EB-NEXT: .LBB4_1: # %entry 810 ; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 811 ; MIPS64EB-NEXT: lld $2, 0($1) 812 ; MIPS64EB-NEXT: xor $3, $2, $4 813 ; MIPS64EB-NEXT: scd $3, 0($1) 814 ; MIPS64EB-NEXT: beqz $3, .LBB4_1 815 ; MIPS64EB-NEXT: nop 816 ; MIPS64EB-NEXT: # %bb.2: # %entry 817 ; MIPS64EB-NEXT: jr $ra 818 ; MIPS64EB-NEXT: nop 819 entry: 820 %0 = atomicrmw xor i64* @x, i64 %incr monotonic 821 ret i64 %0 822 823 } 824 825 define i64 @AtomicLoadNand(i64 signext %incr) nounwind { 826 ; MIPS4-LABEL: AtomicLoadNand: 827 ; MIPS4: # %bb.0: # %entry 828 ; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 829 ; MIPS4-NEXT: daddu $1, $1, $25 830 ; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 831 ; MIPS4-NEXT: ld $1, %got_disp(x)($1) 832 ; MIPS4-NEXT: .LBB5_1: # %entry 833 ; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 834 ; MIPS4-NEXT: lld $2, 0($1) 835 ; MIPS4-NEXT: and $3, $2, $4 836 ; MIPS4-NEXT: nor $3, $zero, $3 837 ; MIPS4-NEXT: scd $3, 0($1) 838 ; MIPS4-NEXT: beqz $3, .LBB5_1 839 ; MIPS4-NEXT: nop 840 ; MIPS4-NEXT: # %bb.2: # %entry 841 ; MIPS4-NEXT: jr $ra 842 ; MIPS4-NEXT: nop 843 ; 844 ; MIPS64-LABEL: AtomicLoadNand: 845 ; MIPS64: # %bb.0: # %entry 846 ; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 847 ; MIPS64-NEXT: daddu $1, $1, $25 848 ; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 849 ; MIPS64-NEXT: ld $1, %got_disp(x)($1) 850 ; MIPS64-NEXT: .LBB5_1: # %entry 851 ; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 852 ; MIPS64-NEXT: lld $2, 0($1) 853 ; MIPS64-NEXT: and $3, $2, $4 854 ; MIPS64-NEXT: nor $3, $zero, $3 855 ; MIPS64-NEXT: scd $3, 0($1) 856 ; MIPS64-NEXT: beqz $3, .LBB5_1 857 ; MIPS64-NEXT: nop 858 ; MIPS64-NEXT: # %bb.2: # %entry 859 ; MIPS64-NEXT: jr $ra 860 ; MIPS64-NEXT: nop 861 ; 862 ; MIPS64R2-LABEL: AtomicLoadNand: 863 ; MIPS64R2: # %bb.0: # %entry 864 ; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 865 ; MIPS64R2-NEXT: daddu $1, $1, $25 866 ; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 867 ; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 868 ; MIPS64R2-NEXT: .LBB5_1: # %entry 869 ; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 870 ; MIPS64R2-NEXT: lld $2, 0($1) 871 ; MIPS64R2-NEXT: and $3, $2, $4 872 ; MIPS64R2-NEXT: nor $3, $zero, $3 873 ; MIPS64R2-NEXT: scd $3, 0($1) 874 ; MIPS64R2-NEXT: beqz $3, .LBB5_1 875 ; MIPS64R2-NEXT: nop 876 ; MIPS64R2-NEXT: # %bb.2: # %entry 877 ; MIPS64R2-NEXT: jr $ra 878 ; MIPS64R2-NEXT: nop 879 ; 880 ; MIPS64R6-LABEL: AtomicLoadNand: 881 ; MIPS64R6: # %bb.0: # %entry 882 ; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 883 ; MIPS64R6-NEXT: daddu $1, $1, $25 884 ; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 885 ; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 886 ; MIPS64R6-NEXT: .LBB5_1: # %entry 887 ; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 888 ; MIPS64R6-NEXT: lld $2, 0($1) 889 ; MIPS64R6-NEXT: and $3, $2, $4 890 ; MIPS64R6-NEXT: nor $3, $zero, $3 891 ; MIPS64R6-NEXT: scd $3, 0($1) 892 ; MIPS64R6-NEXT: beqzc $3, .LBB5_1 893 ; MIPS64R6-NEXT: nop 894 ; MIPS64R6-NEXT: # %bb.2: # %entry 895 ; MIPS64R6-NEXT: jrc $ra 896 ; 897 ; MIPS64R6O0-LABEL: AtomicLoadNand: 898 ; MIPS64R6O0: # %bb.0: # %entry 899 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 900 ; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 901 ; MIPS64R6O0-NEXT: daddu $1, $1, $25 902 ; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 903 ; MIPS64R6O0-NEXT: move $25, $4 904 ; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 905 ; MIPS64R6O0-NEXT: .LBB5_1: # %entry 906 ; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 907 ; MIPS64R6O0-NEXT: lld $2, 0($1) 908 ; MIPS64R6O0-NEXT: and $3, $2, $4 909 ; MIPS64R6O0-NEXT: nor $3, $zero, $3 910 ; MIPS64R6O0-NEXT: scd $3, 0($1) 911 ; MIPS64R6O0-NEXT: beqzc $3, .LBB5_1 912 ; MIPS64R6O0-NEXT: # %bb.2: # %entry 913 ; MIPS64R6O0-NEXT: sd $25, 8($sp) # 8-byte Folded Spill 914 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 915 ; MIPS64R6O0-NEXT: jrc $ra 916 ; 917 ; O1-LABEL: AtomicLoadNand: 918 ; O1: # %bb.0: # %entry 919 ; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 920 ; O1-NEXT: daddu $1, $1, $25 921 ; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 922 ; O1-NEXT: ld $1, %got_disp(x)($1) 923 ; O1-NEXT: .LBB5_1: # %entry 924 ; O1-NEXT: # =>This Inner Loop Header: Depth=1 925 ; O1-NEXT: lld $2, 0($1) 926 ; O1-NEXT: and $3, $2, $4 927 ; O1-NEXT: nor $3, $zero, $3 928 ; O1-NEXT: scd $3, 0($1) 929 ; O1-NEXT: beqz $3, .LBB5_1 930 ; O1-NEXT: nop 931 ; O1-NEXT: # %bb.2: # %entry 932 ; O1-NEXT: jr $ra 933 ; O1-NEXT: nop 934 ; 935 ; O2-LABEL: AtomicLoadNand: 936 ; O2: # %bb.0: # %entry 937 ; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 938 ; O2-NEXT: daddu $1, $1, $25 939 ; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 940 ; O2-NEXT: ld $1, %got_disp(x)($1) 941 ; O2-NEXT: .LBB5_1: # %entry 942 ; O2-NEXT: # =>This Inner Loop Header: Depth=1 943 ; O2-NEXT: lld $2, 0($1) 944 ; O2-NEXT: and $3, $2, $4 945 ; O2-NEXT: nor $3, $zero, $3 946 ; O2-NEXT: scd $3, 0($1) 947 ; O2-NEXT: beqz $3, .LBB5_1 948 ; O2-NEXT: nop 949 ; O2-NEXT: # %bb.2: # %entry 950 ; O2-NEXT: jr $ra 951 ; O2-NEXT: nop 952 ; 953 ; O3-LABEL: AtomicLoadNand: 954 ; O3: # %bb.0: # %entry 955 ; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 956 ; O3-NEXT: daddu $1, $1, $25 957 ; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 958 ; O3-NEXT: ld $1, %got_disp(x)($1) 959 ; O3-NEXT: .LBB5_1: # %entry 960 ; O3-NEXT: # =>This Inner Loop Header: Depth=1 961 ; O3-NEXT: lld $2, 0($1) 962 ; O3-NEXT: and $3, $2, $4 963 ; O3-NEXT: nor $3, $zero, $3 964 ; O3-NEXT: scd $3, 0($1) 965 ; O3-NEXT: beqz $3, .LBB5_1 966 ; O3-NEXT: nop 967 ; O3-NEXT: # %bb.2: # %entry 968 ; O3-NEXT: jr $ra 969 ; O3-NEXT: nop 970 ; 971 ; MIPS64EB-LABEL: AtomicLoadNand: 972 ; MIPS64EB: # %bb.0: # %entry 973 ; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicLoadNand))) 974 ; MIPS64EB-NEXT: daddu $1, $1, $25 975 ; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand))) 976 ; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 977 ; MIPS64EB-NEXT: .LBB5_1: # %entry 978 ; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 979 ; MIPS64EB-NEXT: lld $2, 0($1) 980 ; MIPS64EB-NEXT: and $3, $2, $4 981 ; MIPS64EB-NEXT: nor $3, $zero, $3 982 ; MIPS64EB-NEXT: scd $3, 0($1) 983 ; MIPS64EB-NEXT: beqz $3, .LBB5_1 984 ; MIPS64EB-NEXT: nop 985 ; MIPS64EB-NEXT: # %bb.2: # %entry 986 ; MIPS64EB-NEXT: jr $ra 987 ; MIPS64EB-NEXT: nop 988 entry: 989 %0 = atomicrmw nand i64* @x, i64 %incr monotonic 990 ret i64 %0 991 992 } 993 994 define i64 @AtomicSwap64(i64 signext %newval) nounwind { 995 ; MIPS4-LABEL: AtomicSwap64: 996 ; MIPS4: # %bb.0: # %entry 997 ; MIPS4-NEXT: daddiu $sp, $sp, -16 998 ; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 999 ; MIPS4-NEXT: daddu $1, $1, $25 1000 ; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1001 ; MIPS4-NEXT: sd $4, 8($sp) 1002 ; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1003 ; MIPS4-NEXT: .LBB6_1: # %entry 1004 ; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1005 ; MIPS4-NEXT: lld $2, 0($1) 1006 ; MIPS4-NEXT: move $3, $4 1007 ; MIPS4-NEXT: scd $3, 0($1) 1008 ; MIPS4-NEXT: beqz $3, .LBB6_1 1009 ; MIPS4-NEXT: nop 1010 ; MIPS4-NEXT: # %bb.2: # %entry 1011 ; MIPS4-NEXT: jr $ra 1012 ; MIPS4-NEXT: daddiu $sp, $sp, 16 1013 ; 1014 ; MIPS64-LABEL: AtomicSwap64: 1015 ; MIPS64: # %bb.0: # %entry 1016 ; MIPS64-NEXT: daddiu $sp, $sp, -16 1017 ; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1018 ; MIPS64-NEXT: daddu $1, $1, $25 1019 ; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1020 ; MIPS64-NEXT: sd $4, 8($sp) 1021 ; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1022 ; MIPS64-NEXT: .LBB6_1: # %entry 1023 ; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1024 ; MIPS64-NEXT: lld $2, 0($1) 1025 ; MIPS64-NEXT: move $3, $4 1026 ; MIPS64-NEXT: scd $3, 0($1) 1027 ; MIPS64-NEXT: beqz $3, .LBB6_1 1028 ; MIPS64-NEXT: nop 1029 ; MIPS64-NEXT: # %bb.2: # %entry 1030 ; MIPS64-NEXT: jr $ra 1031 ; MIPS64-NEXT: daddiu $sp, $sp, 16 1032 ; 1033 ; MIPS64R2-LABEL: AtomicSwap64: 1034 ; MIPS64R2: # %bb.0: # %entry 1035 ; MIPS64R2-NEXT: daddiu $sp, $sp, -16 1036 ; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1037 ; MIPS64R2-NEXT: daddu $1, $1, $25 1038 ; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1039 ; MIPS64R2-NEXT: sd $4, 8($sp) 1040 ; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1041 ; MIPS64R2-NEXT: .LBB6_1: # %entry 1042 ; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1043 ; MIPS64R2-NEXT: lld $2, 0($1) 1044 ; MIPS64R2-NEXT: move $3, $4 1045 ; MIPS64R2-NEXT: scd $3, 0($1) 1046 ; MIPS64R2-NEXT: beqz $3, .LBB6_1 1047 ; MIPS64R2-NEXT: nop 1048 ; MIPS64R2-NEXT: # %bb.2: # %entry 1049 ; MIPS64R2-NEXT: jr $ra 1050 ; MIPS64R2-NEXT: daddiu $sp, $sp, 16 1051 ; 1052 ; MIPS64R6-LABEL: AtomicSwap64: 1053 ; MIPS64R6: # %bb.0: # %entry 1054 ; MIPS64R6-NEXT: daddiu $sp, $sp, -16 1055 ; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1056 ; MIPS64R6-NEXT: daddu $1, $1, $25 1057 ; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1058 ; MIPS64R6-NEXT: sd $4, 8($sp) 1059 ; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1060 ; MIPS64R6-NEXT: .LBB6_1: # %entry 1061 ; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1062 ; MIPS64R6-NEXT: lld $2, 0($1) 1063 ; MIPS64R6-NEXT: move $3, $4 1064 ; MIPS64R6-NEXT: scd $3, 0($1) 1065 ; MIPS64R6-NEXT: beqzc $3, .LBB6_1 1066 ; MIPS64R6-NEXT: nop 1067 ; MIPS64R6-NEXT: # %bb.2: # %entry 1068 ; MIPS64R6-NEXT: jr $ra 1069 ; MIPS64R6-NEXT: daddiu $sp, $sp, 16 1070 ; 1071 ; MIPS64R6O0-LABEL: AtomicSwap64: 1072 ; MIPS64R6O0: # %bb.0: # %entry 1073 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, -16 1074 ; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1075 ; MIPS64R6O0-NEXT: daddu $1, $1, $25 1076 ; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1077 ; MIPS64R6O0-NEXT: move $25, $4 1078 ; MIPS64R6O0-NEXT: sd $4, 8($sp) 1079 ; MIPS64R6O0-NEXT: ld $4, 8($sp) 1080 ; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 1081 ; MIPS64R6O0-NEXT: .LBB6_1: # %entry 1082 ; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1083 ; MIPS64R6O0-NEXT: lld $2, 0($1) 1084 ; MIPS64R6O0-NEXT: move $3, $4 1085 ; MIPS64R6O0-NEXT: scd $3, 0($1) 1086 ; MIPS64R6O0-NEXT: beqzc $3, .LBB6_1 1087 ; MIPS64R6O0-NEXT: # %bb.2: # %entry 1088 ; MIPS64R6O0-NEXT: sd $25, 0($sp) # 8-byte Folded Spill 1089 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, 16 1090 ; MIPS64R6O0-NEXT: jrc $ra 1091 ; 1092 ; O1-LABEL: AtomicSwap64: 1093 ; O1: # %bb.0: # %entry 1094 ; O1-NEXT: daddiu $sp, $sp, -16 1095 ; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1096 ; O1-NEXT: daddu $1, $1, $25 1097 ; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1098 ; O1-NEXT: sd $4, 8($sp) 1099 ; O1-NEXT: ld $1, %got_disp(x)($1) 1100 ; O1-NEXT: .LBB6_1: # %entry 1101 ; O1-NEXT: # =>This Inner Loop Header: Depth=1 1102 ; O1-NEXT: lld $2, 0($1) 1103 ; O1-NEXT: move $3, $4 1104 ; O1-NEXT: scd $3, 0($1) 1105 ; O1-NEXT: beqz $3, .LBB6_1 1106 ; O1-NEXT: nop 1107 ; O1-NEXT: # %bb.2: # %entry 1108 ; O1-NEXT: jr $ra 1109 ; O1-NEXT: daddiu $sp, $sp, 16 1110 ; 1111 ; O2-LABEL: AtomicSwap64: 1112 ; O2: # %bb.0: # %entry 1113 ; O2-NEXT: daddiu $sp, $sp, -16 1114 ; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1115 ; O2-NEXT: daddu $1, $1, $25 1116 ; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1117 ; O2-NEXT: sd $4, 8($sp) 1118 ; O2-NEXT: ld $1, %got_disp(x)($1) 1119 ; O2-NEXT: .LBB6_1: # %entry 1120 ; O2-NEXT: # =>This Inner Loop Header: Depth=1 1121 ; O2-NEXT: lld $2, 0($1) 1122 ; O2-NEXT: move $3, $4 1123 ; O2-NEXT: scd $3, 0($1) 1124 ; O2-NEXT: beqz $3, .LBB6_1 1125 ; O2-NEXT: nop 1126 ; O2-NEXT: # %bb.2: # %entry 1127 ; O2-NEXT: jr $ra 1128 ; O2-NEXT: daddiu $sp, $sp, 16 1129 ; 1130 ; O3-LABEL: AtomicSwap64: 1131 ; O3: # %bb.0: # %entry 1132 ; O3-NEXT: daddiu $sp, $sp, -16 1133 ; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1134 ; O3-NEXT: sd $4, 8($sp) 1135 ; O3-NEXT: daddu $1, $1, $25 1136 ; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1137 ; O3-NEXT: ld $1, %got_disp(x)($1) 1138 ; O3-NEXT: .LBB6_1: # %entry 1139 ; O3-NEXT: # =>This Inner Loop Header: Depth=1 1140 ; O3-NEXT: lld $2, 0($1) 1141 ; O3-NEXT: move $3, $4 1142 ; O3-NEXT: scd $3, 0($1) 1143 ; O3-NEXT: beqz $3, .LBB6_1 1144 ; O3-NEXT: nop 1145 ; O3-NEXT: # %bb.2: # %entry 1146 ; O3-NEXT: jr $ra 1147 ; O3-NEXT: daddiu $sp, $sp, 16 1148 ; 1149 ; MIPS64EB-LABEL: AtomicSwap64: 1150 ; MIPS64EB: # %bb.0: # %entry 1151 ; MIPS64EB-NEXT: daddiu $sp, $sp, -16 1152 ; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicSwap64))) 1153 ; MIPS64EB-NEXT: daddu $1, $1, $25 1154 ; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64))) 1155 ; MIPS64EB-NEXT: sd $4, 8($sp) 1156 ; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 1157 ; MIPS64EB-NEXT: .LBB6_1: # %entry 1158 ; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 1159 ; MIPS64EB-NEXT: lld $2, 0($1) 1160 ; MIPS64EB-NEXT: move $3, $4 1161 ; MIPS64EB-NEXT: scd $3, 0($1) 1162 ; MIPS64EB-NEXT: beqz $3, .LBB6_1 1163 ; MIPS64EB-NEXT: nop 1164 ; MIPS64EB-NEXT: # %bb.2: # %entry 1165 ; MIPS64EB-NEXT: jr $ra 1166 ; MIPS64EB-NEXT: daddiu $sp, $sp, 16 1167 entry: 1168 %newval.addr = alloca i64, align 4 1169 store i64 %newval, i64* %newval.addr, align 4 1170 %tmp = load i64, i64* %newval.addr, align 4 1171 %0 = atomicrmw xchg i64* @x, i64 %tmp monotonic 1172 ret i64 %0 1173 1174 } 1175 1176 define i64 @AtomicCmpSwap64(i64 signext %oldval, i64 signext %newval) nounwind { 1177 ; MIPS4-LABEL: AtomicCmpSwap64: 1178 ; MIPS4: # %bb.0: # %entry 1179 ; MIPS4-NEXT: daddiu $sp, $sp, -16 1180 ; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1181 ; MIPS4-NEXT: daddu $1, $1, $25 1182 ; MIPS4-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1183 ; MIPS4-NEXT: sd $5, 8($sp) 1184 ; MIPS4-NEXT: ld $1, %got_disp(x)($1) 1185 ; MIPS4-NEXT: .LBB7_1: # %entry 1186 ; MIPS4-NEXT: # =>This Inner Loop Header: Depth=1 1187 ; MIPS4-NEXT: lld $2, 0($1) 1188 ; MIPS4-NEXT: bne $2, $4, .LBB7_3 1189 ; MIPS4-NEXT: nop 1190 ; MIPS4-NEXT: # %bb.2: # %entry 1191 ; MIPS4-NEXT: # in Loop: Header=BB7_1 Depth=1 1192 ; MIPS4-NEXT: move $3, $5 1193 ; MIPS4-NEXT: scd $3, 0($1) 1194 ; MIPS4-NEXT: beqz $3, .LBB7_1 1195 ; MIPS4-NEXT: nop 1196 ; MIPS4-NEXT: .LBB7_3: # %entry 1197 ; MIPS4-NEXT: jr $ra 1198 ; MIPS4-NEXT: daddiu $sp, $sp, 16 1199 ; 1200 ; MIPS64-LABEL: AtomicCmpSwap64: 1201 ; MIPS64: # %bb.0: # %entry 1202 ; MIPS64-NEXT: daddiu $sp, $sp, -16 1203 ; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1204 ; MIPS64-NEXT: daddu $1, $1, $25 1205 ; MIPS64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1206 ; MIPS64-NEXT: sd $5, 8($sp) 1207 ; MIPS64-NEXT: ld $1, %got_disp(x)($1) 1208 ; MIPS64-NEXT: .LBB7_1: # %entry 1209 ; MIPS64-NEXT: # =>This Inner Loop Header: Depth=1 1210 ; MIPS64-NEXT: lld $2, 0($1) 1211 ; MIPS64-NEXT: bne $2, $4, .LBB7_3 1212 ; MIPS64-NEXT: nop 1213 ; MIPS64-NEXT: # %bb.2: # %entry 1214 ; MIPS64-NEXT: # in Loop: Header=BB7_1 Depth=1 1215 ; MIPS64-NEXT: move $3, $5 1216 ; MIPS64-NEXT: scd $3, 0($1) 1217 ; MIPS64-NEXT: beqz $3, .LBB7_1 1218 ; MIPS64-NEXT: nop 1219 ; MIPS64-NEXT: .LBB7_3: # %entry 1220 ; MIPS64-NEXT: jr $ra 1221 ; MIPS64-NEXT: daddiu $sp, $sp, 16 1222 ; 1223 ; MIPS64R2-LABEL: AtomicCmpSwap64: 1224 ; MIPS64R2: # %bb.0: # %entry 1225 ; MIPS64R2-NEXT: daddiu $sp, $sp, -16 1226 ; MIPS64R2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1227 ; MIPS64R2-NEXT: daddu $1, $1, $25 1228 ; MIPS64R2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1229 ; MIPS64R2-NEXT: sd $5, 8($sp) 1230 ; MIPS64R2-NEXT: ld $1, %got_disp(x)($1) 1231 ; MIPS64R2-NEXT: .LBB7_1: # %entry 1232 ; MIPS64R2-NEXT: # =>This Inner Loop Header: Depth=1 1233 ; MIPS64R2-NEXT: lld $2, 0($1) 1234 ; MIPS64R2-NEXT: bne $2, $4, .LBB7_3 1235 ; MIPS64R2-NEXT: nop 1236 ; MIPS64R2-NEXT: # %bb.2: # %entry 1237 ; MIPS64R2-NEXT: # in Loop: Header=BB7_1 Depth=1 1238 ; MIPS64R2-NEXT: move $3, $5 1239 ; MIPS64R2-NEXT: scd $3, 0($1) 1240 ; MIPS64R2-NEXT: beqz $3, .LBB7_1 1241 ; MIPS64R2-NEXT: nop 1242 ; MIPS64R2-NEXT: .LBB7_3: # %entry 1243 ; MIPS64R2-NEXT: jr $ra 1244 ; MIPS64R2-NEXT: daddiu $sp, $sp, 16 1245 ; 1246 ; MIPS64R6-LABEL: AtomicCmpSwap64: 1247 ; MIPS64R6: # %bb.0: # %entry 1248 ; MIPS64R6-NEXT: daddiu $sp, $sp, -16 1249 ; MIPS64R6-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1250 ; MIPS64R6-NEXT: daddu $1, $1, $25 1251 ; MIPS64R6-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1252 ; MIPS64R6-NEXT: sd $5, 8($sp) 1253 ; MIPS64R6-NEXT: ld $1, %got_disp(x)($1) 1254 ; MIPS64R6-NEXT: .LBB7_1: # %entry 1255 ; MIPS64R6-NEXT: # =>This Inner Loop Header: Depth=1 1256 ; MIPS64R6-NEXT: lld $2, 0($1) 1257 ; MIPS64R6-NEXT: bnec $2, $4, .LBB7_3 1258 ; MIPS64R6-NEXT: # %bb.2: # %entry 1259 ; MIPS64R6-NEXT: # in Loop: Header=BB7_1 Depth=1 1260 ; MIPS64R6-NEXT: move $3, $5 1261 ; MIPS64R6-NEXT: scd $3, 0($1) 1262 ; MIPS64R6-NEXT: beqzc $3, .LBB7_1 1263 ; MIPS64R6-NEXT: nop 1264 ; MIPS64R6-NEXT: .LBB7_3: # %entry 1265 ; MIPS64R6-NEXT: jr $ra 1266 ; MIPS64R6-NEXT: daddiu $sp, $sp, 16 1267 ; 1268 ; MIPS64R6O0-LABEL: AtomicCmpSwap64: 1269 ; MIPS64R6O0: # %bb.0: # %entry 1270 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, -48 1271 ; MIPS64R6O0-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1272 ; MIPS64R6O0-NEXT: daddu $1, $1, $25 1273 ; MIPS64R6O0-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1274 ; MIPS64R6O0-NEXT: move $25, $5 1275 ; MIPS64R6O0-NEXT: move $2, $4 1276 ; MIPS64R6O0-NEXT: sd $5, 40($sp) 1277 ; MIPS64R6O0-NEXT: ld $5, 40($sp) 1278 ; MIPS64R6O0-NEXT: ld $1, %got_disp(x)($1) 1279 ; MIPS64R6O0-NEXT: ld $3, 32($sp) # 8-byte Folded Reload 1280 ; MIPS64R6O0-NEXT: .LBB7_1: # %entry 1281 ; MIPS64R6O0-NEXT: # =>This Inner Loop Header: Depth=1 1282 ; MIPS64R6O0-NEXT: lld $6, 0($1) 1283 ; MIPS64R6O0-NEXT: bnec $6, $4, .LBB7_3 1284 ; MIPS64R6O0-NEXT: # %bb.2: # %entry 1285 ; MIPS64R6O0-NEXT: # in Loop: Header=BB7_1 Depth=1 1286 ; MIPS64R6O0-NEXT: move $7, $5 1287 ; MIPS64R6O0-NEXT: scd $7, 0($1) 1288 ; MIPS64R6O0-NEXT: beqzc $7, .LBB7_1 1289 ; MIPS64R6O0-NEXT: .LBB7_3: # %entry 1290 ; MIPS64R6O0-NEXT: sd $2, 24($sp) # 8-byte Folded Spill 1291 ; MIPS64R6O0-NEXT: move $2, $6 1292 ; MIPS64R6O0-NEXT: sd $6, 32($sp) # 8-byte Folded Spill 1293 ; MIPS64R6O0-NEXT: sd $25, 16($sp) # 8-byte Folded Spill 1294 ; MIPS64R6O0-NEXT: sd $3, 8($sp) # 8-byte Folded Spill 1295 ; MIPS64R6O0-NEXT: daddiu $sp, $sp, 48 1296 ; MIPS64R6O0-NEXT: jrc $ra 1297 ; 1298 ; O1-LABEL: AtomicCmpSwap64: 1299 ; O1: # %bb.0: # %entry 1300 ; O1-NEXT: daddiu $sp, $sp, -16 1301 ; O1-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1302 ; O1-NEXT: daddu $1, $1, $25 1303 ; O1-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1304 ; O1-NEXT: sd $5, 8($sp) 1305 ; O1-NEXT: ld $1, %got_disp(x)($1) 1306 ; O1-NEXT: .LBB7_1: # %entry 1307 ; O1-NEXT: # =>This Inner Loop Header: Depth=1 1308 ; O1-NEXT: lld $2, 0($1) 1309 ; O1-NEXT: bne $2, $4, .LBB7_3 1310 ; O1-NEXT: nop 1311 ; O1-NEXT: # %bb.2: # %entry 1312 ; O1-NEXT: # in Loop: Header=BB7_1 Depth=1 1313 ; O1-NEXT: move $3, $5 1314 ; O1-NEXT: scd $3, 0($1) 1315 ; O1-NEXT: beqz $3, .LBB7_1 1316 ; O1-NEXT: nop 1317 ; O1-NEXT: .LBB7_3: # %entry 1318 ; O1-NEXT: jr $ra 1319 ; O1-NEXT: daddiu $sp, $sp, 16 1320 ; 1321 ; O2-LABEL: AtomicCmpSwap64: 1322 ; O2: # %bb.0: # %entry 1323 ; O2-NEXT: daddiu $sp, $sp, -16 1324 ; O2-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1325 ; O2-NEXT: daddu $1, $1, $25 1326 ; O2-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1327 ; O2-NEXT: sd $5, 8($sp) 1328 ; O2-NEXT: ld $1, %got_disp(x)($1) 1329 ; O2-NEXT: .LBB7_1: # %entry 1330 ; O2-NEXT: # =>This Inner Loop Header: Depth=1 1331 ; O2-NEXT: lld $2, 0($1) 1332 ; O2-NEXT: bne $2, $4, .LBB7_3 1333 ; O2-NEXT: nop 1334 ; O2-NEXT: # %bb.2: # %entry 1335 ; O2-NEXT: # in Loop: Header=BB7_1 Depth=1 1336 ; O2-NEXT: move $3, $5 1337 ; O2-NEXT: scd $3, 0($1) 1338 ; O2-NEXT: beqz $3, .LBB7_1 1339 ; O2-NEXT: nop 1340 ; O2-NEXT: .LBB7_3: # %entry 1341 ; O2-NEXT: jr $ra 1342 ; O2-NEXT: daddiu $sp, $sp, 16 1343 ; 1344 ; O3-LABEL: AtomicCmpSwap64: 1345 ; O3: # %bb.0: # %entry 1346 ; O3-NEXT: daddiu $sp, $sp, -16 1347 ; O3-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1348 ; O3-NEXT: sd $5, 8($sp) 1349 ; O3-NEXT: daddu $1, $1, $25 1350 ; O3-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1351 ; O3-NEXT: ld $1, %got_disp(x)($1) 1352 ; O3-NEXT: .LBB7_1: # %entry 1353 ; O3-NEXT: # =>This Inner Loop Header: Depth=1 1354 ; O3-NEXT: lld $2, 0($1) 1355 ; O3-NEXT: bne $2, $4, .LBB7_3 1356 ; O3-NEXT: nop 1357 ; O3-NEXT: # %bb.2: # %entry 1358 ; O3-NEXT: # in Loop: Header=BB7_1 Depth=1 1359 ; O3-NEXT: move $3, $5 1360 ; O3-NEXT: scd $3, 0($1) 1361 ; O3-NEXT: beqz $3, .LBB7_1 1362 ; O3-NEXT: nop 1363 ; O3-NEXT: .LBB7_3: # %entry 1364 ; O3-NEXT: jr $ra 1365 ; O3-NEXT: daddiu $sp, $sp, 16 1366 ; 1367 ; MIPS64EB-LABEL: AtomicCmpSwap64: 1368 ; MIPS64EB: # %bb.0: # %entry 1369 ; MIPS64EB-NEXT: daddiu $sp, $sp, -16 1370 ; MIPS64EB-NEXT: lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64))) 1371 ; MIPS64EB-NEXT: daddu $1, $1, $25 1372 ; MIPS64EB-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64))) 1373 ; MIPS64EB-NEXT: sd $5, 8($sp) 1374 ; MIPS64EB-NEXT: ld $1, %got_disp(x)($1) 1375 ; MIPS64EB-NEXT: .LBB7_1: # %entry 1376 ; MIPS64EB-NEXT: # =>This Inner Loop Header: Depth=1 1377 ; MIPS64EB-NEXT: lld $2, 0($1) 1378 ; MIPS64EB-NEXT: bne $2, $4, .LBB7_3 1379 ; MIPS64EB-NEXT: nop 1380 ; MIPS64EB-NEXT: # %bb.2: # %entry 1381 ; MIPS64EB-NEXT: # in Loop: Header=BB7_1 Depth=1 1382 ; MIPS64EB-NEXT: move $3, $5 1383 ; MIPS64EB-NEXT: scd $3, 0($1) 1384 ; MIPS64EB-NEXT: beqz $3, .LBB7_1 1385 ; MIPS64EB-NEXT: nop 1386 ; MIPS64EB-NEXT: .LBB7_3: # %entry 1387 ; MIPS64EB-NEXT: jr $ra 1388 ; MIPS64EB-NEXT: daddiu $sp, $sp, 16 1389 entry: 1390 %newval.addr = alloca i64, align 4 1391 store i64 %newval, i64* %newval.addr, align 4 1392 %tmp = load i64, i64* %newval.addr, align 4 1393 %0 = cmpxchg i64* @x, i64 %oldval, i64 %tmp monotonic monotonic 1394 %1 = extractvalue { i64, i1 } %0, 0 1395 ret i64 %1 1396 1397 } 1398