Home | History | Annotate | Download | only in Mips
      1 ; RUN: llc -march=mipsel --disable-machine-licm < %s | FileCheck %s -check-prefix=CHECK-EL
      2 ; RUN: llc -march=mips   --disable-machine-licm < %s | FileCheck %s -check-prefix=CHECK-EB
      3 
      4 @x = common global i32 0, align 4
      5 
      6 define i32 @AtomicLoadAdd32(i32 %incr) nounwind {
      7 entry:
      8   %0 = atomicrmw add i32* @x, i32 %incr monotonic
      9   ret i32 %0
     10 
     11 ; CHECK-EL-LABEL:   AtomicLoadAdd32:
     12 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(x)
     13 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
     14 ; CHECK-EL:   ll      $[[R1:[0-9]+]], 0($[[R0]])
     15 ; CHECK-EL:   addu    $[[R2:[0-9]+]], $[[R1]], $4
     16 ; CHECK-EL:   sc      $[[R2]], 0($[[R0]])
     17 ; CHECK-EL:   beqz    $[[R2]], $[[BB0]]
     18 
     19 ; CHECK-EB-LABEL:   AtomicLoadAdd32:
     20 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(x)
     21 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
     22 ; CHECK-EB:   ll      $[[R1:[0-9]+]], 0($[[R0]])
     23 ; CHECK-EB:   addu    $[[R2:[0-9]+]], $[[R1]], $4
     24 ; CHECK-EB:   sc      $[[R2]], 0($[[R0]])
     25 ; CHECK-EB:   beqz    $[[R2]], $[[BB0]]
     26 }
     27 
     28 define i32 @AtomicLoadNand32(i32 %incr) nounwind {
     29 entry:
     30   %0 = atomicrmw nand i32* @x, i32 %incr monotonic
     31   ret i32 %0
     32 
     33 ; CHECK-EL-LABEL:   AtomicLoadNand32:
     34 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(x)
     35 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
     36 ; CHECK-EL:   ll      $[[R1:[0-9]+]], 0($[[R0]])
     37 ; CHECK-EL:   and     $[[R3:[0-9]+]], $[[R1]], $4
     38 ; CHECK-EL:   nor     $[[R2:[0-9]+]], $zero, $[[R3]]
     39 ; CHECK-EL:   sc      $[[R2]], 0($[[R0]])
     40 ; CHECK-EL:   beqz    $[[R2]], $[[BB0]]
     41 
     42 ; CHECK-EB-LABEL:   AtomicLoadNand32:
     43 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(x)
     44 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
     45 ; CHECK-EB:   ll      $[[R1:[0-9]+]], 0($[[R0]])
     46 ; CHECK-EB:   and     $[[R3:[0-9]+]], $[[R1]], $4
     47 ; CHECK-EB:   nor     $[[R2:[0-9]+]], $zero, $[[R3]]
     48 ; CHECK-EB:   sc      $[[R2]], 0($[[R0]])
     49 ; CHECK-EB:   beqz    $[[R2]], $[[BB0]]
     50 }
     51 
     52 define i32 @AtomicSwap32(i32 %newval) nounwind {
     53 entry:
     54   %newval.addr = alloca i32, align 4
     55   store i32 %newval, i32* %newval.addr, align 4
     56   %tmp = load i32* %newval.addr, align 4
     57   %0 = atomicrmw xchg i32* @x, i32 %tmp monotonic
     58   ret i32 %0
     59 
     60 ; CHECK-EL-LABEL:   AtomicSwap32:
     61 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(x)
     62 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
     63 ; CHECK-EL:   ll      ${{[0-9]+}}, 0($[[R0]])
     64 ; CHECK-EL:   sc      $[[R2:[0-9]+]], 0($[[R0]])
     65 ; CHECK-EL:   beqz    $[[R2]], $[[BB0]]
     66 
     67 ; CHECK-EB-LABEL:   AtomicSwap32:
     68 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(x)
     69 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
     70 ; CHECK-EB:   ll      ${{[0-9]+}}, 0($[[R0]])
     71 ; CHECK-EB:   sc      $[[R2:[0-9]+]], 0($[[R0]])
     72 ; CHECK-EB:   beqz    $[[R2]], $[[BB0]]
     73 }
     74 
     75 define i32 @AtomicCmpSwap32(i32 %oldval, i32 %newval) nounwind {
     76 entry:
     77   %newval.addr = alloca i32, align 4
     78   store i32 %newval, i32* %newval.addr, align 4
     79   %tmp = load i32* %newval.addr, align 4
     80   %0 = cmpxchg i32* @x, i32 %oldval, i32 %tmp monotonic
     81   ret i32 %0
     82 
     83 ; CHECK-EL-LABEL:   AtomicCmpSwap32:
     84 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(x)
     85 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
     86 ; CHECK-EL:   ll      $2, 0($[[R0]])
     87 ; CHECK-EL:   bne     $2, $4, $[[BB1:[A-Z_0-9]+]]
     88 ; CHECK-EL:   sc      $[[R2:[0-9]+]], 0($[[R0]])
     89 ; CHECK-EL:   beqz    $[[R2]], $[[BB0]]
     90 ; CHECK-EL:   $[[BB1]]:
     91 
     92 ; CHECK-EB-LABEL:   AtomicCmpSwap32:
     93 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(x)
     94 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
     95 ; CHECK-EB:   ll      $2, 0($[[R0]])
     96 ; CHECK-EB:   bne     $2, $4, $[[BB1:[A-Z_0-9]+]]
     97 ; CHECK-EB:   sc      $[[R2:[0-9]+]], 0($[[R0]])
     98 ; CHECK-EB:   beqz    $[[R2]], $[[BB0]]
     99 ; CHECK-EB:   $[[BB1]]:
    100 }
    101 
    102 
    103 
    104 @y = common global i8 0, align 1
    105 
    106 define signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind {
    107 entry:
    108   %0 = atomicrmw add i8* @y, i8 %incr monotonic
    109   ret i8 %0
    110 
    111 ; CHECK-EL-LABEL:   AtomicLoadAdd8:
    112 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(y)
    113 ; CHECK-EL:   addiu   $[[R1:[0-9]+]], $zero, -4
    114 ; CHECK-EL:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
    115 ; CHECK-EL:   andi    $[[R3:[0-9]+]], $[[R0]], 3
    116 ; CHECK-EL:   sll     $[[R4:[0-9]+]], $[[R3]], 3
    117 ; CHECK-EL:   ori     $[[R5:[0-9]+]], $zero, 255
    118 ; CHECK-EL:   sllv    $[[R6:[0-9]+]], $[[R5]], $[[R4]]
    119 ; CHECK-EL:   nor     $[[R7:[0-9]+]], $zero, $[[R6]]
    120 ; CHECK-EL:   sllv    $[[R9:[0-9]+]], $4, $[[R4]]
    121 
    122 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
    123 ; CHECK-EL:   ll      $[[R10:[0-9]+]], 0($[[R2]])
    124 ; CHECK-EL:   addu    $[[R11:[0-9]+]], $[[R10]], $[[R9]]
    125 ; CHECK-EL:   and     $[[R12:[0-9]+]], $[[R11]], $[[R6]]
    126 ; CHECK-EL:   and     $[[R13:[0-9]+]], $[[R10]], $[[R7]]
    127 ; CHECK-EL:   or      $[[R14:[0-9]+]], $[[R13]], $[[R12]]
    128 ; CHECK-EL:   sc      $[[R14]], 0($[[R2]])
    129 ; CHECK-EL:   beqz    $[[R14]], $[[BB0]]
    130 
    131 ; CHECK-EL:   and     $[[R15:[0-9]+]], $[[R10]], $[[R6]]
    132 ; CHECK-EL:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R4]]
    133 ; CHECK-EL:   sll     $[[R17:[0-9]+]], $[[R16]], 24
    134 ; CHECK-EL:   sra     $2, $[[R17]], 24
    135 
    136 ; CHECK-EB-LABEL:   AtomicLoadAdd8:
    137 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(y)
    138 ; CHECK-EB:   addiu   $[[R1:[0-9]+]], $zero, -4
    139 ; CHECK-EB:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
    140 ; CHECK-EB:   andi    $[[R3:[0-9]+]], $[[R0]], 3
    141 ; CHECK-EB:   xori    $[[R4:[0-9]+]], $[[R3]], 3
    142 ; CHECK-EB:   sll     $[[R5:[0-9]+]], $[[R4]], 3
    143 ; CHECK-EB:   ori     $[[R6:[0-9]+]], $zero, 255
    144 ; CHECK-EB:   sllv    $[[R7:[0-9]+]], $[[R6]], $[[R5]]
    145 ; CHECK-EB:   nor     $[[R8:[0-9]+]], $zero, $[[R7]]
    146 ; CHECK-EB:   sllv    $[[R9:[0-9]+]], $4, $[[R5]]
    147 
    148 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
    149 ; CHECK-EB:   ll      $[[R10:[0-9]+]], 0($[[R2]])
    150 ; CHECK-EB:   addu    $[[R11:[0-9]+]], $[[R10]], $[[R9]]
    151 ; CHECK-EB:   and     $[[R12:[0-9]+]], $[[R11]], $[[R7]]
    152 ; CHECK-EB:   and     $[[R13:[0-9]+]], $[[R10]], $[[R8]]
    153 ; CHECK-EB:   or      $[[R14:[0-9]+]], $[[R13]], $[[R12]]
    154 ; CHECK-EB:   sc      $[[R14]], 0($[[R2]])
    155 ; CHECK-EB:   beqz    $[[R14]], $[[BB0]]
    156 
    157 ; CHECK-EB:   and     $[[R15:[0-9]+]], $[[R10]], $[[R7]]
    158 ; CHECK-EB:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R5]]
    159 ; CHECK-EB:   sll     $[[R17:[0-9]+]], $[[R16]], 24
    160 ; CHECK-EB:   sra     $2, $[[R17]], 24
    161 }
    162 
    163 define signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind {
    164 entry:
    165   %0 = atomicrmw sub i8* @y, i8 %incr monotonic
    166   ret i8 %0
    167 
    168 ; CHECK-EL-LABEL:   AtomicLoadSub8:
    169 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(y)
    170 ; CHECK-EL:   addiu   $[[R1:[0-9]+]], $zero, -4
    171 ; CHECK-EL:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
    172 ; CHECK-EL:   andi    $[[R3:[0-9]+]], $[[R0]], 3
    173 ; CHECK-EL:   sll     $[[R4:[0-9]+]], $[[R3]], 3
    174 ; CHECK-EL:   ori     $[[R5:[0-9]+]], $zero, 255
    175 ; CHECK-EL:   sllv    $[[R6:[0-9]+]], $[[R5]], $[[R4]]
    176 ; CHECK-EL:   nor     $[[R7:[0-9]+]], $zero, $[[R6]]
    177 ; CHECK-EL:   sllv     $[[R9:[0-9]+]], $4, $[[R4]]
    178 
    179 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
    180 ; CHECK-EL:   ll      $[[R10:[0-9]+]], 0($[[R2]])
    181 ; CHECK-EL:   subu    $[[R11:[0-9]+]], $[[R10]], $[[R9]]
    182 ; CHECK-EL:   and     $[[R12:[0-9]+]], $[[R11]], $[[R6]]
    183 ; CHECK-EL:   and     $[[R13:[0-9]+]], $[[R10]], $[[R7]]
    184 ; CHECK-EL:   or      $[[R14:[0-9]+]], $[[R13]], $[[R12]]
    185 ; CHECK-EL:   sc      $[[R14]], 0($[[R2]])
    186 ; CHECK-EL:   beqz    $[[R14]], $[[BB0]]
    187 
    188 ; CHECK-EL:   and     $[[R15:[0-9]+]], $[[R10]], $[[R6]]
    189 ; CHECK-EL:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R4]]
    190 ; CHECK-EL:   sll     $[[R17:[0-9]+]], $[[R16]], 24
    191 ; CHECK-EL:   sra     $2, $[[R17]], 24
    192 
    193 ; CHECK-EB-LABEL:   AtomicLoadSub8:
    194 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(y)
    195 ; CHECK-EB:   addiu   $[[R1:[0-9]+]], $zero, -4
    196 ; CHECK-EB:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
    197 ; CHECK-EB:   andi    $[[R3:[0-9]+]], $[[R0]], 3
    198 ; CHECK-EB:   xori    $[[R4:[0-9]+]], $[[R3]], 3
    199 ; CHECK-EB:   sll     $[[R5:[0-9]+]], $[[R4]], 3
    200 ; CHECK-EB:   ori     $[[R6:[0-9]+]], $zero, 255
    201 ; CHECK-EB:   sllv    $[[R7:[0-9]+]], $[[R6]], $[[R5]]
    202 ; CHECK-EB:   nor     $[[R8:[0-9]+]], $zero, $[[R7]]
    203 ; CHECK-EB:   sllv    $[[R9:[0-9]+]], $4, $[[R5]]
    204 
    205 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
    206 ; CHECK-EB:   ll      $[[R10:[0-9]+]], 0($[[R2]])
    207 ; CHECK-EB:   subu    $[[R11:[0-9]+]], $[[R10]], $[[R9]]
    208 ; CHECK-EB:   and     $[[R12:[0-9]+]], $[[R11]], $[[R7]]
    209 ; CHECK-EB:   and     $[[R13:[0-9]+]], $[[R10]], $[[R8]]
    210 ; CHECK-EB:   or      $[[R14:[0-9]+]], $[[R13]], $[[R12]]
    211 ; CHECK-EB:   sc      $[[R14]], 0($[[R2]])
    212 ; CHECK-EB:   beqz    $[[R14]], $[[BB0]]
    213 
    214 ; CHECK-EB:   and     $[[R15:[0-9]+]], $[[R10]], $[[R7]]
    215 ; CHECK-EB:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R5]]
    216 ; CHECK-EB:   sll     $[[R17:[0-9]+]], $[[R16]], 24
    217 ; CHECK-EB:   sra     $2, $[[R17]], 24
    218 }
    219 
    220 define signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind {
    221 entry:
    222   %0 = atomicrmw nand i8* @y, i8 %incr monotonic
    223   ret i8 %0
    224 
    225 ; CHECK-EL-LABEL:   AtomicLoadNand8:
    226 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(y)
    227 ; CHECK-EL:   addiu   $[[R1:[0-9]+]], $zero, -4
    228 ; CHECK-EL:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
    229 ; CHECK-EL:   andi    $[[R3:[0-9]+]], $[[R0]], 3
    230 ; CHECK-EL:   sll     $[[R4:[0-9]+]], $[[R3]], 3
    231 ; CHECK-EL:   ori     $[[R5:[0-9]+]], $zero, 255
    232 ; CHECK-EL:   sllv    $[[R6:[0-9]+]], $[[R5]], $[[R4]]
    233 ; CHECK-EL:   nor     $[[R7:[0-9]+]], $zero, $[[R6]]
    234 ; CHECK-EL:   sllv    $[[R9:[0-9]+]], $4, $[[R4]]
    235 
    236 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
    237 ; CHECK-EL:   ll      $[[R10:[0-9]+]], 0($[[R2]])
    238 ; CHECK-EL:   and     $[[R18:[0-9]+]], $[[R10]], $[[R9]]
    239 ; CHECK-EL:   nor     $[[R11:[0-9]+]], $zero, $[[R18]]
    240 ; CHECK-EL:   and     $[[R12:[0-9]+]], $[[R11]], $[[R6]]
    241 ; CHECK-EL:   and     $[[R13:[0-9]+]], $[[R10]], $[[R7]]
    242 ; CHECK-EL:   or      $[[R14:[0-9]+]], $[[R13]], $[[R12]]
    243 ; CHECK-EL:   sc      $[[R14]], 0($[[R2]])
    244 ; CHECK-EL:   beqz    $[[R14]], $[[BB0]]
    245 
    246 ; CHECK-EL:   and     $[[R15:[0-9]+]], $[[R10]], $[[R6]]
    247 ; CHECK-EL:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R4]]
    248 ; CHECK-EL:   sll     $[[R17:[0-9]+]], $[[R16]], 24
    249 ; CHECK-EL:   sra     $2, $[[R17]], 24
    250 
    251 ; CHECK-EB-LABEL:   AtomicLoadNand8:
    252 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(y)
    253 ; CHECK-EB:   addiu   $[[R1:[0-9]+]], $zero, -4
    254 ; CHECK-EB:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
    255 ; CHECK-EB:   andi    $[[R3:[0-9]+]], $[[R0]], 3
    256 ; CHECK-EB:   xori    $[[R4:[0-9]+]], $[[R3]], 3
    257 ; CHECK-EB:   sll     $[[R5:[0-9]+]], $[[R4]], 3
    258 ; CHECK-EB:   ori     $[[R6:[0-9]+]], $zero, 255
    259 ; CHECK-EB:   sllv    $[[R7:[0-9]+]], $[[R6]], $[[R5]]
    260 ; CHECK-EB:   nor     $[[R8:[0-9]+]], $zero, $[[R7]]
    261 ; CHECK-EB:   sllv    $[[R9:[0-9]+]], $4, $[[R5]]
    262 
    263 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
    264 ; CHECK-EB:   ll      $[[R10:[0-9]+]], 0($[[R2]])
    265 ; CHECK-EB:   and     $[[R18:[0-9]+]], $[[R10]], $[[R9]]
    266 ; CHECK-EB:   nor     $[[R11:[0-9]+]], $zero, $[[R18]]
    267 ; CHECK-EB:   and     $[[R12:[0-9]+]], $[[R11]], $[[R7]]
    268 ; CHECK-EB:   and     $[[R13:[0-9]+]], $[[R10]], $[[R8]]
    269 ; CHECK-EB:   or      $[[R14:[0-9]+]], $[[R13]], $[[R12]]
    270 ; CHECK-EB:   sc      $[[R14]], 0($[[R2]])
    271 ; CHECK-EB:   beqz    $[[R14]], $[[BB0]]
    272 
    273 ; CHECK-EB:   and     $[[R15:[0-9]+]], $[[R10]], $[[R7]]
    274 ; CHECK-EB:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R5]]
    275 ; CHECK-EB:   sll     $[[R17:[0-9]+]], $[[R16]], 24
    276 ; CHECK-EB:   sra     $2, $[[R17]], 24
    277 }
    278 
    279 define signext i8 @AtomicSwap8(i8 signext %newval) nounwind {
    280 entry:
    281   %0 = atomicrmw xchg i8* @y, i8 %newval monotonic
    282   ret i8 %0
    283 
    284 ; CHECK-EL-LABEL:   AtomicSwap8:
    285 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(y)
    286 ; CHECK-EL:   addiu   $[[R1:[0-9]+]], $zero, -4
    287 ; CHECK-EL:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
    288 ; CHECK-EL:   andi    $[[R3:[0-9]+]], $[[R0]], 3
    289 ; CHECK-EL:   sll     $[[R4:[0-9]+]], $[[R3]], 3
    290 ; CHECK-EL:   ori     $[[R5:[0-9]+]], $zero, 255
    291 ; CHECK-EL:   sllv    $[[R6:[0-9]+]], $[[R5]], $[[R4]]
    292 ; CHECK-EL:   nor     $[[R7:[0-9]+]], $zero, $[[R6]]
    293 ; CHECK-EL:   sllv    $[[R9:[0-9]+]], $4, $[[R4]]
    294 
    295 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
    296 ; CHECK-EL:   ll      $[[R10:[0-9]+]], 0($[[R2]])
    297 ; CHECK-EL:   and     $[[R18:[0-9]+]], $[[R9]], $[[R6]]
    298 ; CHECK-EL:   and     $[[R13:[0-9]+]], $[[R10]], $[[R7]]
    299 ; CHECK-EL:   or      $[[R14:[0-9]+]], $[[R13]], $[[R18]]
    300 ; CHECK-EL:   sc      $[[R14]], 0($[[R2]])
    301 ; CHECK-EL:   beqz    $[[R14]], $[[BB0]]
    302 
    303 ; CHECK-EL:   and     $[[R15:[0-9]+]], $[[R10]], $[[R6]]
    304 ; CHECK-EL:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R4]]
    305 ; CHECK-EL:   sll     $[[R17:[0-9]+]], $[[R16]], 24
    306 ; CHECK-EL:   sra     $2, $[[R17]], 24
    307 
    308 ; CHECK-EB-LABEL:   AtomicSwap8:
    309 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(y)
    310 ; CHECK-EB:   addiu   $[[R1:[0-9]+]], $zero, -4
    311 ; CHECK-EB:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
    312 ; CHECK-EB:   andi    $[[R3:[0-9]+]], $[[R0]], 3
    313 ; CHECK-EB:   xori    $[[R4:[0-9]+]], $[[R3]], 3
    314 ; CHECK-EB:   sll     $[[R5:[0-9]+]], $[[R4]], 3
    315 ; CHECK-EB:   ori     $[[R6:[0-9]+]], $zero, 255
    316 ; CHECK-EB:   sllv    $[[R7:[0-9]+]], $[[R6]], $[[R5]]
    317 ; CHECK-EB:   nor     $[[R8:[0-9]+]], $zero, $[[R7]]
    318 ; CHECK-EB:   sllv    $[[R9:[0-9]+]], $4, $[[R5]]
    319 
    320 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
    321 ; CHECK-EB:   ll      $[[R10:[0-9]+]], 0($[[R2]])
    322 ; CHECK-EB:   and     $[[R18:[0-9]+]], $[[R9]], $[[R7]]
    323 ; CHECK-EB:   and     $[[R13:[0-9]+]], $[[R10]], $[[R8]]
    324 ; CHECK-EB:   or      $[[R14:[0-9]+]], $[[R13]], $[[R18]]
    325 ; CHECK-EB:   sc      $[[R14]], 0($[[R2]])
    326 ; CHECK-EB:   beqz    $[[R14]], $[[BB0]]
    327 
    328 ; CHECK-EB:   and     $[[R15:[0-9]+]], $[[R10]], $[[R7]]
    329 ; CHECK-EB:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R5]]
    330 ; CHECK-EB:   sll     $[[R17:[0-9]+]], $[[R16]], 24
    331 ; CHECK-EB:   sra     $2, $[[R17]], 24
    332 }
    333 
    334 define signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind {
    335 entry:
    336   %0 = cmpxchg i8* @y, i8 %oldval, i8 %newval monotonic
    337   ret i8 %0
    338 
    339 ; CHECK-EL-LABEL:   AtomicCmpSwap8:
    340 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(y)
    341 ; CHECK-EL:   addiu   $[[R1:[0-9]+]], $zero, -4
    342 ; CHECK-EL:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
    343 ; CHECK-EL:   andi    $[[R3:[0-9]+]], $[[R0]], 3
    344 ; CHECK-EL:   sll     $[[R4:[0-9]+]], $[[R3]], 3
    345 ; CHECK-EL:   ori     $[[R5:[0-9]+]], $zero, 255
    346 ; CHECK-EL:   sllv    $[[R6:[0-9]+]], $[[R5]], $[[R4]]
    347 ; CHECK-EL:   nor     $[[R7:[0-9]+]], $zero, $[[R6]]
    348 ; CHECK-EL:   andi    $[[R8:[0-9]+]], $4, 255
    349 ; CHECK-EL:   sllv    $[[R9:[0-9]+]], $[[R8]], $[[R4]]
    350 ; CHECK-EL:   andi    $[[R10:[0-9]+]], $5, 255
    351 ; CHECK-EL:   sllv    $[[R11:[0-9]+]], $[[R10]], $[[R4]]
    352 
    353 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
    354 ; CHECK-EL:   ll      $[[R12:[0-9]+]], 0($[[R2]])
    355 ; CHECK-EL:   and     $[[R13:[0-9]+]], $[[R12]], $[[R6]]
    356 ; CHECK-EL:   bne     $[[R13]], $[[R9]], $[[BB1:[A-Z_0-9]+]]
    357 
    358 ; CHECK-EL:   and     $[[R14:[0-9]+]], $[[R12]], $[[R7]]
    359 ; CHECK-EL:   or      $[[R15:[0-9]+]], $[[R14]], $[[R11]]
    360 ; CHECK-EL:   sc      $[[R15]], 0($[[R2]])
    361 ; CHECK-EL:   beqz    $[[R15]], $[[BB0]]
    362 
    363 ; CHECK-EL:   $[[BB1]]:
    364 ; CHECK-EL:   srlv    $[[R16:[0-9]+]], $[[R13]], $[[R4]]
    365 ; CHECK-EL:   sll     $[[R17:[0-9]+]], $[[R16]], 24
    366 ; CHECK-EL:   sra     $2, $[[R17]], 24
    367 
    368 ; CHECK-EB-LABEL:   AtomicCmpSwap8:
    369 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(y)
    370 ; CHECK-EB:   addiu   $[[R1:[0-9]+]], $zero, -4
    371 ; CHECK-EB:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
    372 ; CHECK-EB:   andi    $[[R3:[0-9]+]], $[[R0]], 3
    373 ; CHECK-EB:   xori    $[[R4:[0-9]+]], $[[R3]], 3
    374 ; CHECK-EB:   sll     $[[R5:[0-9]+]], $[[R4]], 3
    375 ; CHECK-EB:   ori     $[[R6:[0-9]+]], $zero, 255
    376 ; CHECK-EB:   sllv    $[[R7:[0-9]+]], $[[R6]], $[[R5]]
    377 ; CHECK-EB:   nor     $[[R8:[0-9]+]], $zero, $[[R7]]
    378 ; CHECK-EB:   andi    $[[R9:[0-9]+]], $4, 255
    379 ; CHECK-EB:   sllv    $[[R10:[0-9]+]], $[[R9]], $[[R5]]
    380 ; CHECK-EB:   andi    $[[R11:[0-9]+]], $5, 255
    381 ; CHECK-EB:   sllv    $[[R12:[0-9]+]], $[[R11]], $[[R5]]
    382 
    383 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
    384 ; CHECK-EB:   ll      $[[R13:[0-9]+]], 0($[[R2]])
    385 ; CHECK-EB:   and     $[[R14:[0-9]+]], $[[R13]], $[[R7]]
    386 ; CHECK-EB:   bne     $[[R14]], $[[R10]], $[[BB1:[A-Z_0-9]+]]
    387 
    388 ; CHECK-EB:   and     $[[R15:[0-9]+]], $[[R13]], $[[R8]]
    389 ; CHECK-EB:   or      $[[R16:[0-9]+]], $[[R15]], $[[R12]]
    390 ; CHECK-EB:   sc      $[[R16]], 0($[[R2]])
    391 ; CHECK-EB:   beqz    $[[R16]], $[[BB0]]
    392 
    393 ; CHECK-EB:   $[[BB1]]:
    394 ; CHECK-EB:   srlv    $[[R17:[0-9]+]], $[[R14]], $[[R5]]
    395 ; CHECK-EB:   sll     $[[R18:[0-9]+]], $[[R17]], 24
    396 ; CHECK-EB:   sra     $2, $[[R18]], 24
    397 }
    398 
    399 @countsint = common global i32 0, align 4
    400 
    401 define i32 @CheckSync(i32 %v) nounwind noinline {
    402 entry:
    403   %0 = atomicrmw add i32* @countsint, i32 %v seq_cst
    404   ret i32 %0 
    405 
    406 ; CHECK-EL-LABEL:   CheckSync:
    407 ; CHECK-EL:   sync 0
    408 ; CHECK-EL:   ll
    409 ; CHECK-EL:   sc
    410 ; CHECK-EL:   beq
    411 ; CHECK-EL:   sync 0
    412 
    413 ; CHECK-EB-LABEL:   CheckSync:
    414 ; CHECK-EB:   sync 0
    415 ; CHECK-EB:   ll
    416 ; CHECK-EB:   sc
    417 ; CHECK-EB:   beq
    418 ; CHECK-EB:   sync 0
    419 }
    420 
    421 ; make sure that this assertion in
    422 ; TwoAddressInstructionPass::TryInstructionTransform does not fail:
    423 ;
    424 ; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) &&
    425 ;
    426 ; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an
    427 ; operand of an atomic instruction with register $zero. 
    428 @a = external global i32
    429 
    430 define i32 @zeroreg() nounwind {
    431 entry:
    432   %0 = cmpxchg i32* @a, i32 1, i32 0 seq_cst
    433   %1 = icmp eq i32 %0, 1
    434   %conv = zext i1 %1 to i32
    435   ret i32 %conv
    436 }
    437