1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel --disable-machine-licm -mcpu=mips32 -relocation-model=pic < %s | \ 2*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,MIPS32-ANY,NO-SEB-SEH,CHECK-EL,NOT-MICROMIPS 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel --disable-machine-licm -mcpu=mips32r2 -relocation-model=pic -verify-machineinstrs < %s | \ 4*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,MIPS32-ANY,HAS-SEB-SEH,CHECK-EL,NOT-MICROMIPS 5*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel --disable-machine-licm -mcpu=mips32r6 -relocation-model=pic -verify-machineinstrs < %s | \ 6*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,MIPS32-ANY,HAS-SEB-SEH,CHECK-EL,MIPSR6 7*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el --disable-machine-licm -mcpu=mips4 -relocation-model=pic < %s | \ 8*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,MIPS64-ANY,NO-SEB-SEH,CHECK-EL,NOT-MICROMIPS 9*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el --disable-machine-licm -mcpu=mips64 -relocation-model=pic < %s | \ 10*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,MIPS64-ANY,NO-SEB-SEH,CHECK-EL,NOT-MICROMIPS 11*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el --disable-machine-licm -mcpu=mips64r2 -relocation-model=pic -verify-machineinstrs < %s | \ 12*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,MIPS64-ANY,HAS-SEB-SEH,CHECK-EL,NOT-MICROMIPS 13*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el --disable-machine-licm -mcpu=mips64r6 -relocation-model=pic < %s | \ 14*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,MIPS64-ANY,HAS-SEB-SEH,CHECK-EL,MIPSR6 15*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -O0 -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs < %s | \ 16*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL-LABEL,MIPS64-ANY,O0 17*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel --disable-machine-licm -mcpu=mips32r2 -mattr=micromips -relocation-model=pic < %s | \ 18*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,MIPS32-ANY,HAS-SEB-SEH,CHECK-EL,MICROMIPS 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; Keep one big-endian check so that we don't reduce testing, but don't add more 21*9880d681SAndroid Build Coastguard Worker; since endianness doesn't affect the body of the atomic operations. 22*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips --disable-machine-licm -mcpu=mips32 -relocation-model=pic < %s | \ 23*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck %s -check-prefixes=ALL,MIPS32-ANY,NO-SEB-SEH,CHECK-EB,NOT-MICROMIPS 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker@x = common global i32 0, align 4 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine i32 @AtomicLoadAdd32(i32 signext %incr) nounwind { 28*9880d681SAndroid Build Coastguard Workerentry: 29*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i32* @x, i32 %incr monotonic 30*9880d681SAndroid Build Coastguard Worker ret i32 %0 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: AtomicLoadAdd32: 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; MIPS32-ANY: lw $[[R0:[0-9]+]], %got(x) 35*9880d681SAndroid Build Coastguard Worker; MIPS64-ANY: ld $[[R0:[0-9]+]], %got_disp(x)( 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; O0: $[[BB0:[A-Z_0-9]+]]: 38*9880d681SAndroid Build Coastguard Worker; O0: ld $[[R1:[0-9]+]] 39*9880d681SAndroid Build Coastguard Worker; O0-NEXT: ll $[[R2:[0-9]+]], 0($[[R1]]) 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 42*9880d681SAndroid Build Coastguard Worker; ALL: ll $[[R3:[0-9]+]], 0($[[R0]]) 43*9880d681SAndroid Build Coastguard Worker; ALL: addu $[[R4:[0-9]+]], $[[R3]], $4 44*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R4]], 0($[[R0]]) 45*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R4]], $[[BB0]] 46*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R4]], $[[BB0]] 47*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R4]], $[[BB0]] 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine i32 @AtomicLoadNand32(i32 signext %incr) nounwind { 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw nand i32* @x, i32 %incr monotonic 53*9880d681SAndroid Build Coastguard Worker ret i32 %0 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: AtomicLoadNand32: 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; MIPS32-ANY: lw $[[R0:[0-9]+]], %got(x) 58*9880d681SAndroid Build Coastguard Worker; MIPS64-ANY: ld $[[R0:[0-9]+]], %got_disp(x)( 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 63*9880d681SAndroid Build Coastguard Worker; ALL: ll $[[R1:[0-9]+]], 0($[[R0]]) 64*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R3:[0-9]+]], $[[R1]], $4 65*9880d681SAndroid Build Coastguard Worker; ALL: nor $[[R2:[0-9]+]], $zero, $[[R3]] 66*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R2]], 0($[[R0]]) 67*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R2]], $[[BB0]] 68*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R2]], $[[BB0]] 69*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R2]], $[[BB0]] 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine i32 @AtomicSwap32(i32 signext %newval) nounwind { 73*9880d681SAndroid Build Coastguard Workerentry: 74*9880d681SAndroid Build Coastguard Worker %newval.addr = alloca i32, align 4 75*9880d681SAndroid Build Coastguard Worker store i32 %newval, i32* %newval.addr, align 4 76*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %newval.addr, align 4 77*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw xchg i32* @x, i32 %tmp monotonic 78*9880d681SAndroid Build Coastguard Worker ret i32 %0 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: AtomicSwap32: 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; MIPS32-ANY: lw $[[R0:[0-9]+]], %got(x) 83*9880d681SAndroid Build Coastguard Worker; MIPS64-ANY: ld $[[R0:[0-9]+]], %got_disp(x) 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 86*9880d681SAndroid Build Coastguard Worker; ALL: ll ${{[0-9]+}}, 0($[[R0]]) 87*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R2:[0-9]+]], 0($[[R0]]) 88*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R2]], $[[BB0]] 89*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R2]], $[[BB0]] 90*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R2]], $[[BB0]] 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i32 @AtomicCmpSwap32(i32 signext %oldval, i32 signext %newval) nounwind { 94*9880d681SAndroid Build Coastguard Workerentry: 95*9880d681SAndroid Build Coastguard Worker %newval.addr = alloca i32, align 4 96*9880d681SAndroid Build Coastguard Worker store i32 %newval, i32* %newval.addr, align 4 97*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %newval.addr, align 4 98*9880d681SAndroid Build Coastguard Worker %0 = cmpxchg i32* @x, i32 %oldval, i32 %tmp monotonic monotonic 99*9880d681SAndroid Build Coastguard Worker %1 = extractvalue { i32, i1 } %0, 0 100*9880d681SAndroid Build Coastguard Worker ret i32 %1 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: AtomicCmpSwap32: 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; MIPS32-ANY: lw $[[R0:[0-9]+]], %got(x) 105*9880d681SAndroid Build Coastguard Worker; MIPS64-ANY: ld $[[R0:[0-9]+]], %got_disp(x)( 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 108*9880d681SAndroid Build Coastguard Worker; ALL: ll $2, 0($[[R0]]) 109*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: bne $2, $4, $[[BB1:[A-Z_0-9]+]] 110*9880d681SAndroid Build Coastguard Worker; MICROMIPS: bne $2, $4, $[[BB1:[A-Z_0-9]+]] 111*9880d681SAndroid Build Coastguard Worker; MIPSR6: bnec $2, $4, $[[BB1:[A-Z_0-9]+]] 112*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R2:[0-9]+]], 0($[[R0]]) 113*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R2]], $[[BB0]] 114*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R2]], $[[BB0]] 115*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R2]], $[[BB0]] 116*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB1]]: 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker@y = common global i8 0, align 1 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind { 124*9880d681SAndroid Build Coastguard Workerentry: 125*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i8* @y, i8 %incr monotonic 126*9880d681SAndroid Build Coastguard Worker ret i8 %0 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: AtomicLoadAdd8: 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; MIPS32-ANY: lw $[[R0:[0-9]+]], %got(y) 131*9880d681SAndroid Build Coastguard Worker; MIPS64-ANY: ld $[[R0:[0-9]+]], %got_disp(y)( 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker; ALL: addiu $[[R1:[0-9]+]], $zero, -4 134*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R2:[0-9]+]], $[[R0]], $[[R1]] 135*9880d681SAndroid Build Coastguard Worker; ALL: andi $[[R3:[0-9]+]], $[[R0]], 3 136*9880d681SAndroid Build Coastguard Worker; CHECK-EB: xori $[[R4:[0-9]+]], $[[R3]], 3 137*9880d681SAndroid Build Coastguard Worker; CHECK-EB: sll $[[R5:[0-9]+]], $[[R4]], 3 138*9880d681SAndroid Build Coastguard Worker; CHECK-EL: sll $[[R5:[0-9]+]], $[[R3]], 3 139*9880d681SAndroid Build Coastguard Worker; ALL: ori $[[R6:[0-9]+]], $zero, 255 140*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R7:[0-9]+]], $[[R6]], $[[R5]] 141*9880d681SAndroid Build Coastguard Worker; ALL: nor $[[R8:[0-9]+]], $zero, $[[R7]] 142*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R9:[0-9]+]], $4, $[[R5]] 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; O0: $[[BB0:[A-Z_0-9]+]]: 145*9880d681SAndroid Build Coastguard Worker; O0: ld $[[R10:[0-9]+]] 146*9880d681SAndroid Build Coastguard Worker; O0-NEXT: ll $[[R11:[0-9]+]], 0($[[R10]]) 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 149*9880d681SAndroid Build Coastguard Worker; ALL: ll $[[R12:[0-9]+]], 0($[[R2]]) 150*9880d681SAndroid Build Coastguard Worker; ALL: addu $[[R13:[0-9]+]], $[[R12]], $[[R9]] 151*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R14:[0-9]+]], $[[R13]], $[[R7]] 152*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R15:[0-9]+]], $[[R12]], $[[R8]] 153*9880d681SAndroid Build Coastguard Worker; ALL: or $[[R16:[0-9]+]], $[[R15]], $[[R14]] 154*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R16]], 0($[[R2]]) 155*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R16]], $[[BB0]] 156*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R16]], $[[BB0]] 157*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R16]], $[[BB0]] 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R17:[0-9]+]], $[[R12]], $[[R7]] 160*9880d681SAndroid Build Coastguard Worker; ALL: srlv $[[R18:[0-9]+]], $[[R17]], $[[R5]] 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sll $[[R19:[0-9]+]], $[[R18]], 24 163*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sra $2, $[[R19]], 24 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker; HAS-SEB-SEH: seb $2, $[[R18]] 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerdefine signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind { 169*9880d681SAndroid Build Coastguard Workerentry: 170*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw sub i8* @y, i8 %incr monotonic 171*9880d681SAndroid Build Coastguard Worker ret i8 %0 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: AtomicLoadSub8: 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker; MIPS32-ANY: lw $[[R0:[0-9]+]], %got(y) 176*9880d681SAndroid Build Coastguard Worker; MIPS64-ANY: ld $[[R0:[0-9]+]], %got_disp(y)( 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker; ALL: addiu $[[R1:[0-9]+]], $zero, -4 179*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R2:[0-9]+]], $[[R0]], $[[R1]] 180*9880d681SAndroid Build Coastguard Worker; ALL: andi $[[R3:[0-9]+]], $[[R0]], 3 181*9880d681SAndroid Build Coastguard Worker; CHECK-EL: sll $[[R5:[0-9]+]], $[[R3]], 3 182*9880d681SAndroid Build Coastguard Worker; CHECK-EB: xori $[[R4:[0-9]+]], $[[R3]], 3 183*9880d681SAndroid Build Coastguard Worker; CHECK-EB: sll $[[R5:[0-9]+]], $[[R4]], 3 184*9880d681SAndroid Build Coastguard Worker; ALL: ori $[[R6:[0-9]+]], $zero, 255 185*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R7:[0-9]+]], $[[R6]], $[[R5]] 186*9880d681SAndroid Build Coastguard Worker; ALL: nor $[[R8:[0-9]+]], $zero, $[[R7]] 187*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R9:[0-9]+]], $4, $[[R5]] 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker; O0: $[[BB0:[A-Z_0-9]+]]: 190*9880d681SAndroid Build Coastguard Worker; O0: ld $[[R10:[0-9]+]] 191*9880d681SAndroid Build Coastguard Worker; O0-NEXT: ll $[[R11:[0-9]+]], 0($[[R10]]) 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 194*9880d681SAndroid Build Coastguard Worker; ALL: ll $[[R12:[0-9]+]], 0($[[R2]]) 195*9880d681SAndroid Build Coastguard Worker; ALL: subu $[[R13:[0-9]+]], $[[R12]], $[[R9]] 196*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R14:[0-9]+]], $[[R13]], $[[R7]] 197*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R15:[0-9]+]], $[[R12]], $[[R8]] 198*9880d681SAndroid Build Coastguard Worker; ALL: or $[[R16:[0-9]+]], $[[R15]], $[[R14]] 199*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R16]], 0($[[R2]]) 200*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R16]], $[[BB0]] 201*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R16]], $[[BB0]] 202*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R16]], $[[BB0]] 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R17:[0-9]+]], $[[R12]], $[[R7]] 205*9880d681SAndroid Build Coastguard Worker; ALL: srlv $[[R18:[0-9]+]], $[[R17]], $[[R5]] 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sll $[[R19:[0-9]+]], $[[R18]], 24 208*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sra $2, $[[R19]], 24 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Worker; HAS-SEB-SEH:seb $2, $[[R18]] 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdefine signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind { 214*9880d681SAndroid Build Coastguard Workerentry: 215*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw nand i8* @y, i8 %incr monotonic 216*9880d681SAndroid Build Coastguard Worker ret i8 %0 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: AtomicLoadNand8: 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Worker; MIPS32-ANY: lw $[[R0:[0-9]+]], %got(y) 221*9880d681SAndroid Build Coastguard Worker; MIPS64-ANY: ld $[[R0:[0-9]+]], %got_disp(y)( 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker; ALL: addiu $[[R1:[0-9]+]], $zero, -4 224*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R2:[0-9]+]], $[[R0]], $[[R1]] 225*9880d681SAndroid Build Coastguard Worker; ALL: andi $[[R3:[0-9]+]], $[[R0]], 3 226*9880d681SAndroid Build Coastguard Worker; CHECK-EL: sll $[[R5:[0-9]+]], $[[R3]], 3 227*9880d681SAndroid Build Coastguard Worker; CHECK-EB: xori $[[R4:[0-9]+]], $[[R3]], 3 228*9880d681SAndroid Build Coastguard Worker; CHECK-EB: sll $[[R5:[0-9]+]], $[[R4]], 3 229*9880d681SAndroid Build Coastguard Worker; ALL: ori $[[R6:[0-9]+]], $zero, 255 230*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R7:[0-9]+]], $[[R6]], $[[R5]] 231*9880d681SAndroid Build Coastguard Worker; ALL: nor $[[R8:[0-9]+]], $zero, $[[R7]] 232*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R9:[0-9]+]], $4, $[[R5]] 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker; O0: $[[BB0:[A-Z_0-9]+]]: 235*9880d681SAndroid Build Coastguard Worker; O0: ld $[[R10:[0-9]+]] 236*9880d681SAndroid Build Coastguard Worker; O0-NEXT: ll $[[R11:[0-9]+]], 0($[[R10]]) 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 239*9880d681SAndroid Build Coastguard Worker; ALL: ll $[[R12:[0-9]+]], 0($[[R2]]) 240*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R13:[0-9]+]], $[[R12]], $[[R9]] 241*9880d681SAndroid Build Coastguard Worker; ALL: nor $[[R14:[0-9]+]], $zero, $[[R13]] 242*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R15:[0-9]+]], $[[R14]], $[[R7]] 243*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R16:[0-9]+]], $[[R12]], $[[R8]] 244*9880d681SAndroid Build Coastguard Worker; ALL: or $[[R17:[0-9]+]], $[[R16]], $[[R15]] 245*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R17]], 0($[[R2]]) 246*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R17]], $[[BB0]] 247*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R17]], $[[BB0]] 248*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R17]], $[[BB0]] 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R18:[0-9]+]], $[[R12]], $[[R7]] 251*9880d681SAndroid Build Coastguard Worker; ALL: srlv $[[R19:[0-9]+]], $[[R18]], $[[R5]] 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sll $[[R20:[0-9]+]], $[[R19]], 24 254*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sra $2, $[[R20]], 24 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker; HAS-SEB-SEH: seb $2, $[[R19]] 257*9880d681SAndroid Build Coastguard Worker} 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Workerdefine signext i8 @AtomicSwap8(i8 signext %newval) nounwind { 260*9880d681SAndroid Build Coastguard Workerentry: 261*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw xchg i8* @y, i8 %newval monotonic 262*9880d681SAndroid Build Coastguard Worker ret i8 %0 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: AtomicSwap8: 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Worker; MIPS32-ANY: lw $[[R0:[0-9]+]], %got(y) 267*9880d681SAndroid Build Coastguard Worker; MIPS64-ANY: ld $[[R0:[0-9]+]], %got_disp(y)( 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker; ALL: addiu $[[R1:[0-9]+]], $zero, -4 270*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R2:[0-9]+]], $[[R0]], $[[R1]] 271*9880d681SAndroid Build Coastguard Worker; ALL: andi $[[R3:[0-9]+]], $[[R0]], 3 272*9880d681SAndroid Build Coastguard Worker; CHECK-EL: sll $[[R5:[0-9]+]], $[[R3]], 3 273*9880d681SAndroid Build Coastguard Worker; CHECK-EB: xori $[[R4:[0-9]+]], $[[R3]], 3 274*9880d681SAndroid Build Coastguard Worker; CHECK-EB: sll $[[R5:[0-9]+]], $[[R4]], 3 275*9880d681SAndroid Build Coastguard Worker; ALL: ori $[[R6:[0-9]+]], $zero, 255 276*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R7:[0-9]+]], $[[R6]], $[[R5]] 277*9880d681SAndroid Build Coastguard Worker; ALL: nor $[[R8:[0-9]+]], $zero, $[[R7]] 278*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R9:[0-9]+]], $4, $[[R5]] 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 281*9880d681SAndroid Build Coastguard Worker; ALL: ll $[[R10:[0-9]+]], 0($[[R2]]) 282*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R18:[0-9]+]], $[[R9]], $[[R7]] 283*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R13:[0-9]+]], $[[R10]], $[[R8]] 284*9880d681SAndroid Build Coastguard Worker; ALL: or $[[R14:[0-9]+]], $[[R13]], $[[R18]] 285*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R14]], 0($[[R2]]) 286*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R14]], $[[BB0]] 287*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R14]], $[[BB0]] 288*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R14]], $[[BB0]] 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R15:[0-9]+]], $[[R10]], $[[R7]] 291*9880d681SAndroid Build Coastguard Worker; ALL: srlv $[[R16:[0-9]+]], $[[R15]], $[[R5]] 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sll $[[R17:[0-9]+]], $[[R16]], 24 294*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sra $2, $[[R17]], 24 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker; HAS-SEB-SEH: seb $2, $[[R16]] 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Worker} 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Workerdefine signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind { 301*9880d681SAndroid Build Coastguard Workerentry: 302*9880d681SAndroid Build Coastguard Worker %pair0 = cmpxchg i8* @y, i8 %oldval, i8 %newval monotonic monotonic 303*9880d681SAndroid Build Coastguard Worker %0 = extractvalue { i8, i1 } %pair0, 0 304*9880d681SAndroid Build Coastguard Worker ret i8 %0 305*9880d681SAndroid Build Coastguard Worker 306*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: AtomicCmpSwap8: 307*9880d681SAndroid Build Coastguard Worker 308*9880d681SAndroid Build Coastguard Worker; MIPS32-ANY: lw $[[R0:[0-9]+]], %got(y) 309*9880d681SAndroid Build Coastguard Worker; MIPS64-ANY: ld $[[R0:[0-9]+]], %got_disp(y)( 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker; ALL: addiu $[[R1:[0-9]+]], $zero, -4 312*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R2:[0-9]+]], $[[R0]], $[[R1]] 313*9880d681SAndroid Build Coastguard Worker; ALL: andi $[[R3:[0-9]+]], $[[R0]], 3 314*9880d681SAndroid Build Coastguard Worker; CHECK-EL: sll $[[R5:[0-9]+]], $[[R3]], 3 315*9880d681SAndroid Build Coastguard Worker; CHECK-EB: xori $[[R4:[0-9]+]], $[[R3]], 3 316*9880d681SAndroid Build Coastguard Worker; CHECK-EB: sll $[[R5:[0-9]+]], $[[R4]], 3 317*9880d681SAndroid Build Coastguard Worker; ALL: ori $[[R6:[0-9]+]], $zero, 255 318*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R7:[0-9]+]], $[[R6]], $[[R5]] 319*9880d681SAndroid Build Coastguard Worker; ALL: nor $[[R8:[0-9]+]], $zero, $[[R7]] 320*9880d681SAndroid Build Coastguard Worker; ALL: andi $[[R9:[0-9]+]], $4, 255 321*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R10:[0-9]+]], $[[R9]], $[[R5]] 322*9880d681SAndroid Build Coastguard Worker; ALL: andi $[[R11:[0-9]+]], $5, 255 323*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R12:[0-9]+]], $[[R11]], $[[R5]] 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 326*9880d681SAndroid Build Coastguard Worker; ALL: ll $[[R13:[0-9]+]], 0($[[R2]]) 327*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R14:[0-9]+]], $[[R13]], $[[R7]] 328*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: bne $[[R14]], $[[R10]], $[[BB1:[A-Z_0-9]+]] 329*9880d681SAndroid Build Coastguard Worker; MICROMIPS: bne $[[R14]], $[[R10]], $[[BB1:[A-Z_0-9]+]] 330*9880d681SAndroid Build Coastguard Worker; MIPSR6: bnec $[[R14]], $[[R10]], $[[BB1:[A-Z_0-9]+]] 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R15:[0-9]+]], $[[R13]], $[[R8]] 333*9880d681SAndroid Build Coastguard Worker; ALL: or $[[R16:[0-9]+]], $[[R15]], $[[R12]] 334*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R16]], 0($[[R2]]) 335*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R16]], $[[BB0]] 336*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R16]], $[[BB0]] 337*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R16]], $[[BB0]] 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB1]]: 340*9880d681SAndroid Build Coastguard Worker; ALL: srlv $[[R17:[0-9]+]], $[[R14]], $[[R5]] 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sll $[[R18:[0-9]+]], $[[R17]], 24 343*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sra $2, $[[R18]], 24 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Worker; HAS-SEB-SEH: seb $2, $[[R17]] 346*9880d681SAndroid Build Coastguard Worker} 347*9880d681SAndroid Build Coastguard Worker 348*9880d681SAndroid Build Coastguard Workerdefine i1 @AtomicCmpSwapRes8(i8* %ptr, i8 signext %oldval, i8 signext %newval) nounwind { 349*9880d681SAndroid Build Coastguard Workerentry: 350*9880d681SAndroid Build Coastguard Worker %0 = cmpxchg i8* %ptr, i8 %oldval, i8 %newval monotonic monotonic 351*9880d681SAndroid Build Coastguard Worker %1 = extractvalue { i8, i1 } %0, 1 352*9880d681SAndroid Build Coastguard Worker ret i1 %1 353*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: AtomicCmpSwapRes8 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Worker; ALL: addiu $[[R1:[0-9]+]], $zero, -4 356*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R2:[0-9]+]], $4, $[[R1]] 357*9880d681SAndroid Build Coastguard Worker; ALL: andi $[[R3:[0-9]+]], $4, 3 358*9880d681SAndroid Build Coastguard Worker; CHECK-EL: sll $[[R5:[0-9]+]], $[[R3]], 3 359*9880d681SAndroid Build Coastguard Worker; CHECK-EB: xori $[[R4:[0-9]+]], $[[R3]], 3 360*9880d681SAndroid Build Coastguard Worker; CHECK-EB: sll $[[R5:[0-9]+]], $[[R4]], 3 361*9880d681SAndroid Build Coastguard Worker; ALL: ori $[[R6:[0-9]+]], $zero, 255 362*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R7:[0-9]+]], $[[R6]], $[[R5]] 363*9880d681SAndroid Build Coastguard Worker; ALL: nor $[[R8:[0-9]+]], $zero, $[[R7]] 364*9880d681SAndroid Build Coastguard Worker; ALL: andi $[[R9:[0-9]+]], $5, 255 365*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R10:[0-9]+]], $[[R9]], $[[R5]] 366*9880d681SAndroid Build Coastguard Worker; ALL: andi $[[R11:[0-9]+]], $6, 255 367*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R12:[0-9]+]], $[[R11]], $[[R5]] 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 370*9880d681SAndroid Build Coastguard Worker; ALL: ll $[[R13:[0-9]+]], 0($[[R2]]) 371*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R14:[0-9]+]], $[[R13]], $[[R7]] 372*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: bne $[[R14]], $[[R10]], $[[BB1:[A-Z_0-9]+]] 373*9880d681SAndroid Build Coastguard Worker; MICROMIPS: bne $[[R14]], $[[R10]], $[[BB1:[A-Z_0-9]+]] 374*9880d681SAndroid Build Coastguard Worker; MIPSR6: bnec $[[R14]], $[[R10]], $[[BB1:[A-Z_0-9]+]] 375*9880d681SAndroid Build Coastguard Worker 376*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R15:[0-9]+]], $[[R13]], $[[R8]] 377*9880d681SAndroid Build Coastguard Worker; ALL: or $[[R16:[0-9]+]], $[[R15]], $[[R12]] 378*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R16]], 0($[[R2]]) 379*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R16]], $[[BB0]] 380*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R16]], $[[BB0]] 381*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R16]], $[[BB0]] 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB1]]: 384*9880d681SAndroid Build Coastguard Worker; ALL: srlv $[[R17:[0-9]+]], $[[R14]], $[[R5]] 385*9880d681SAndroid Build Coastguard Worker 386*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sll $[[R18:[0-9]+]], $[[R17]], 24 387*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sra $[[R19:[0-9]+]], $[[R18]], 24 388*9880d681SAndroid Build Coastguard Worker 389*9880d681SAndroid Build Coastguard Worker; FIXME: -march=mips produces a redundant sign extension here... 390*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sll $[[R20:[0-9]+]], $5, 24 391*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sra $[[R20]], $[[R20]], 24 392*9880d681SAndroid Build Coastguard Worker 393*9880d681SAndroid Build Coastguard Worker; HAS-SEB-SEH: seb $[[R19:[0-9]+]], $[[R17]] 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Worker; FIXME: ...Leading to this split check. 396*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: xor $[[R21:[0-9]+]], $[[R19]], $[[R20]] 397*9880d681SAndroid Build Coastguard Worker; HAS-SEB-SEH: xor $[[R21:[0-9]+]], $[[R19]], $5 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Worker; ALL: sltiu $2, $[[R21]], 1 400*9880d681SAndroid Build Coastguard Worker} 401*9880d681SAndroid Build Coastguard Worker 402*9880d681SAndroid Build Coastguard Worker; Check one i16 so that we cover the seh sign extend 403*9880d681SAndroid Build Coastguard Worker@z = common global i16 0, align 1 404*9880d681SAndroid Build Coastguard Worker 405*9880d681SAndroid Build Coastguard Workerdefine signext i16 @AtomicLoadAdd16(i16 signext %incr) nounwind { 406*9880d681SAndroid Build Coastguard Workerentry: 407*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i16* @z, i16 %incr monotonic 408*9880d681SAndroid Build Coastguard Worker ret i16 %0 409*9880d681SAndroid Build Coastguard Worker 410*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: AtomicLoadAdd16: 411*9880d681SAndroid Build Coastguard Worker 412*9880d681SAndroid Build Coastguard Worker; MIPS32-ANY: lw $[[R0:[0-9]+]], %got(z) 413*9880d681SAndroid Build Coastguard Worker; MIPS64-ANY: ld $[[R0:[0-9]+]], %got_disp(z)( 414*9880d681SAndroid Build Coastguard Worker 415*9880d681SAndroid Build Coastguard Worker; ALL: addiu $[[R1:[0-9]+]], $zero, -4 416*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R2:[0-9]+]], $[[R0]], $[[R1]] 417*9880d681SAndroid Build Coastguard Worker; ALL: andi $[[R3:[0-9]+]], $[[R0]], 3 418*9880d681SAndroid Build Coastguard Worker; CHECK-EB: xori $[[R4:[0-9]+]], $[[R3]], 2 419*9880d681SAndroid Build Coastguard Worker; CHECK-EB: sll $[[R5:[0-9]+]], $[[R4]], 3 420*9880d681SAndroid Build Coastguard Worker; CHECK-EL: sll $[[R5:[0-9]+]], $[[R3]], 3 421*9880d681SAndroid Build Coastguard Worker; ALL: ori $[[R6:[0-9]+]], $zero, 65535 422*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R7:[0-9]+]], $[[R6]], $[[R5]] 423*9880d681SAndroid Build Coastguard Worker; ALL: nor $[[R8:[0-9]+]], $zero, $[[R7]] 424*9880d681SAndroid Build Coastguard Worker; ALL: sllv $[[R9:[0-9]+]], $4, $[[R5]] 425*9880d681SAndroid Build Coastguard Worker 426*9880d681SAndroid Build Coastguard Worker; O0: $[[BB0:[A-Z_0-9]+]]: 427*9880d681SAndroid Build Coastguard Worker; O0: ld $[[R10:[0-9]+]] 428*9880d681SAndroid Build Coastguard Worker; O0-NEXT: ll $[[R11:[0-9]+]], 0($[[R10]]) 429*9880d681SAndroid Build Coastguard Worker 430*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 431*9880d681SAndroid Build Coastguard Worker; ALL: ll $[[R12:[0-9]+]], 0($[[R2]]) 432*9880d681SAndroid Build Coastguard Worker; ALL: addu $[[R13:[0-9]+]], $[[R12]], $[[R9]] 433*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R14:[0-9]+]], $[[R13]], $[[R7]] 434*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R15:[0-9]+]], $[[R12]], $[[R8]] 435*9880d681SAndroid Build Coastguard Worker; ALL: or $[[R16:[0-9]+]], $[[R15]], $[[R14]] 436*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R16]], 0($[[R2]]) 437*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R16]], $[[BB0]] 438*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R16]], $[[BB0]] 439*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R16]], $[[BB0]] 440*9880d681SAndroid Build Coastguard Worker 441*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R17:[0-9]+]], $[[R12]], $[[R7]] 442*9880d681SAndroid Build Coastguard Worker; ALL: srlv $[[R18:[0-9]+]], $[[R17]], $[[R5]] 443*9880d681SAndroid Build Coastguard Worker 444*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sll $[[R19:[0-9]+]], $[[R18]], 16 445*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sra $2, $[[R19]], 16 446*9880d681SAndroid Build Coastguard Worker 447*9880d681SAndroid Build Coastguard Worker; MIPS32R2: seh $2, $[[R18]] 448*9880d681SAndroid Build Coastguard Worker} 449*9880d681SAndroid Build Coastguard Worker 450*9880d681SAndroid Build Coastguard Worker; Test that the i16 return value from cmpxchg is recognised as signed, 451*9880d681SAndroid Build Coastguard Worker; so that setCC doesn't end up comparing an unsigned value to a signed 452*9880d681SAndroid Build Coastguard Worker; value. 453*9880d681SAndroid Build Coastguard Worker; The rest of the functions here are testing the atomic expansion, so 454*9880d681SAndroid Build Coastguard Worker; we just match the end of the function. 455*9880d681SAndroid Build Coastguard Workerdefine {i16, i1} @foo(i16* %addr, i16 %l, i16 %r, i16 %new) { 456*9880d681SAndroid Build Coastguard Worker %desired = add i16 %l, %r 457*9880d681SAndroid Build Coastguard Worker %res = cmpxchg i16* %addr, i16 %desired, i16 %new seq_cst seq_cst 458*9880d681SAndroid Build Coastguard Worker ret {i16, i1} %res 459*9880d681SAndroid Build Coastguard Worker 460*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: foo 461*9880d681SAndroid Build Coastguard Worker; MIPSR6: addu $[[R2:[0-9]+]], $[[R1:[0-9]+]], $[[R0:[0-9]+]] 462*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: addu $[[R2:[0-9]+]], $[[R1:[0-9]+]], $[[R0:[0-9]+]] 463*9880d681SAndroid Build Coastguard Worker; MICROMIPS: addu16 $[[R2:[0-9]+]], $[[R1:[0-9]+]], $[[R0:[0-9]+]] 464*9880d681SAndroid Build Coastguard Worker 465*9880d681SAndroid Build Coastguard Worker; ALL: sync 466*9880d681SAndroid Build Coastguard Worker 467*9880d681SAndroid Build Coastguard Worker; ALL: andi $[[R3:[0-9]+]], $[[R2]], 65535 468*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 469*9880d681SAndroid Build Coastguard Worker; ALL: ll $[[R4:[0-9]+]], 0($[[R5:[0-9]+]]) 470*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R6:[0-9]+]], $[[R4]], $ 471*9880d681SAndroid Build Coastguard Worker; ALL: and $[[R7:[0-9]+]], $[[R4]], $ 472*9880d681SAndroid Build Coastguard Worker; ALL: or $[[R8:[0-9]+]], $[[R7]], $ 473*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R8]], 0($[[R5]]) 474*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R8]], $[[BB0]] 475*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R8]], $[[BB0]] 476*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R8]], $[[BB0]] 477*9880d681SAndroid Build Coastguard Worker 478*9880d681SAndroid Build Coastguard Worker; ALL: srlv $[[R9:[0-9]+]], $[[R6]], $ 479*9880d681SAndroid Build Coastguard Worker 480*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sll $[[R10:[0-9]+]], $[[R9]], 16 481*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sra $[[R11:[0-9]+]], $[[R10]], 16 482*9880d681SAndroid Build Coastguard Worker 483*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sll $[[R12:[0-9]+]], $[[R2]], 16 484*9880d681SAndroid Build Coastguard Worker; NO-SEB-SEH: sra $[[R13:[0-9]+]], $[[R12]], 16 485*9880d681SAndroid Build Coastguard Worker 486*9880d681SAndroid Build Coastguard Worker; HAS-SEB-SEH: seh $[[R11:[0-9]+]], $[[R9]] 487*9880d681SAndroid Build Coastguard Worker; HAS-SEB-SEH: seh $[[R13:[0-9]+]], $[[R2]] 488*9880d681SAndroid Build Coastguard Worker 489*9880d681SAndroid Build Coastguard Worker; ALL: xor $[[R12:[0-9]+]], $[[R11]], $[[R13]] 490*9880d681SAndroid Build Coastguard Worker; ALL: sltiu $3, $[[R12]], 1 491*9880d681SAndroid Build Coastguard Worker; ALL: sync 492*9880d681SAndroid Build Coastguard Worker} 493*9880d681SAndroid Build Coastguard Worker 494*9880d681SAndroid Build Coastguard Worker@countsint = common global i32 0, align 4 495*9880d681SAndroid Build Coastguard Worker 496*9880d681SAndroid Build Coastguard Workerdefine i32 @CheckSync(i32 signext %v) nounwind noinline { 497*9880d681SAndroid Build Coastguard Workerentry: 498*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i32* @countsint, i32 %v seq_cst 499*9880d681SAndroid Build Coastguard Worker ret i32 %0 500*9880d681SAndroid Build Coastguard Worker 501*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: CheckSync: 502*9880d681SAndroid Build Coastguard Worker 503*9880d681SAndroid Build Coastguard Worker; ALL: sync 504*9880d681SAndroid Build Coastguard Worker; ALL: ll 505*9880d681SAndroid Build Coastguard Worker; ALL: sc 506*9880d681SAndroid Build Coastguard Worker; ALL: beq 507*9880d681SAndroid Build Coastguard Worker; ALL: sync 508*9880d681SAndroid Build Coastguard Worker} 509*9880d681SAndroid Build Coastguard Worker 510*9880d681SAndroid Build Coastguard Worker; make sure that this assertion in 511*9880d681SAndroid Build Coastguard Worker; TwoAddressInstructionPass::TryInstructionTransform does not fail: 512*9880d681SAndroid Build Coastguard Worker; 513*9880d681SAndroid Build Coastguard Worker; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) && 514*9880d681SAndroid Build Coastguard Worker; 515*9880d681SAndroid Build Coastguard Worker; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an 516*9880d681SAndroid Build Coastguard Worker; operand of an atomic instruction with register $zero. 517*9880d681SAndroid Build Coastguard Worker@a = external global i32 518*9880d681SAndroid Build Coastguard Worker 519*9880d681SAndroid Build Coastguard Workerdefine i32 @zeroreg() nounwind { 520*9880d681SAndroid Build Coastguard Workerentry: 521*9880d681SAndroid Build Coastguard Worker %pair0 = cmpxchg i32* @a, i32 1, i32 0 seq_cst seq_cst 522*9880d681SAndroid Build Coastguard Worker %0 = extractvalue { i32, i1 } %pair0, 0 523*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %0, 1 524*9880d681SAndroid Build Coastguard Worker %conv = zext i1 %1 to i32 525*9880d681SAndroid Build Coastguard Worker ret i32 %conv 526*9880d681SAndroid Build Coastguard Worker} 527*9880d681SAndroid Build Coastguard Worker 528*9880d681SAndroid Build Coastguard Worker; Check that MIPS32R6 has the correct offset range. 529*9880d681SAndroid Build Coastguard Worker; FIXME: At the moment, we don't seem to do addr+offset for any atomic load/store. 530*9880d681SAndroid Build Coastguard Workerdefine i32 @AtomicLoadAdd32_OffGt9Bit(i32 signext %incr) nounwind { 531*9880d681SAndroid Build Coastguard Workerentry: 532*9880d681SAndroid Build Coastguard Worker %0 = atomicrmw add i32* getelementptr(i32, i32* @x, i32 256), i32 %incr monotonic 533*9880d681SAndroid Build Coastguard Worker ret i32 %0 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: AtomicLoadAdd32_OffGt9Bit: 536*9880d681SAndroid Build Coastguard Worker 537*9880d681SAndroid Build Coastguard Worker; MIPS32-ANY: lw $[[R0:[0-9]+]], %got(x) 538*9880d681SAndroid Build Coastguard Worker; MIPS64-ANY: ld $[[R0:[0-9]+]], %got_disp(x)( 539*9880d681SAndroid Build Coastguard Worker 540*9880d681SAndroid Build Coastguard Worker; ALL: addiu $[[PTR:[0-9]+]], $[[R0]], 1024 541*9880d681SAndroid Build Coastguard Worker; ALL: $[[BB0:[A-Z_0-9]+]]: 542*9880d681SAndroid Build Coastguard Worker; ALL: ll $[[R1:[0-9]+]], 0($[[PTR]]) 543*9880d681SAndroid Build Coastguard Worker; ALL: addu $[[R2:[0-9]+]], $[[R1]], $4 544*9880d681SAndroid Build Coastguard Worker; ALL: sc $[[R2]], 0($[[PTR]]) 545*9880d681SAndroid Build Coastguard Worker; NOT-MICROMIPS: beqz $[[R2]], $[[BB0]] 546*9880d681SAndroid Build Coastguard Worker; MICROMIPS: beqzc $[[R2]], $[[BB0]] 547*9880d681SAndroid Build Coastguard Worker; MIPSR6: beqzc $[[R2]], $[[BB0]] 548*9880d681SAndroid Build Coastguard Worker} 549