xref: /aosp_15_r20/external/llvm/test/CodeGen/Mips/atomic.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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