Home | History | Annotate | Download | only in Mips
      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