xref: /llvm-project/llvm/test/CodeGen/Mips/atomic.ll (revision 8663926a544602932d299dda435ed1ef70a05f48)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | \
3; RUN:   FileCheck %s -check-prefix=MIPS32
4; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O0 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | \
5; RUN:   FileCheck %s -check-prefix=MIPS32O0
6; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32r2 -relocation-model=pic -verify-machineinstrs < %s | \
7; RUN:   FileCheck %s -check-prefix=MIPS32R2
8; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32r6 -relocation-model=pic -verify-machineinstrs < %s | \
9; RUN:   FileCheck %s -check-prefix=MIPS32R6
10; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O0 --disable-machine-licm -mcpu=mips32r6 -relocation-model=pic -verify-machineinstrs < %s | \
11; RUN:   FileCheck %s -check-prefix=MIPS32R6O0
12; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips4 -relocation-model=pic -verify-machineinstrs < %s | \
13; RUN:   FileCheck %s -check-prefix=MIPS4
14; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | \
15; RUN:   FileCheck %s -check-prefix=MIPS64
16; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r2 -relocation-model=pic -verify-machineinstrs < %s | \
17; RUN:   FileCheck %s -check-prefix=MIPS64R2
18; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs < %s | \
19; RUN:   FileCheck %s -check-prefix=MIPS64R6
20; RUN: llc -mtriple=mips64-unknown-linux-gnu -O0 -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs -verify-machineinstrs < %s | \
21; RUN:   FileCheck %s -check-prefix=MIPS64R6O0
22; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32r2 -mattr=micromips -relocation-model=pic -verify-machineinstrs < %s | \
23; RUN:   FileCheck %s -check-prefix=MM32
24
25; We want to verify the produced code is well formed all optimization levels, the rest of the tests which ensure correctness.
26; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O1 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O1
27; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O2 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O2
28; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O3 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O3
29
30; Keep one big-endian check so that we don't reduce testing, but don't add more
31; since endianness doesn't affect the body of the atomic operations.
32; RUN: llc -mtriple=mips-unknown-linux-gnu   --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | \
33; RUN:   FileCheck %s -check-prefix=MIPS32EB
34
35@x = common global i32 0, align 4
36
37define i32 @AtomicLoadAdd32(i32 signext %incr) nounwind {
38; MIPS32-LABEL: AtomicLoadAdd32:
39; MIPS32:       # %bb.0: # %entry
40; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
41; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
42; MIPS32-NEXT:    addu $1, $2, $25
43; MIPS32-NEXT:    lw $1, %got(x)($1)
44; MIPS32-NEXT:  $BB0_1: # %entry
45; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
46; MIPS32-NEXT:    ll $2, 0($1)
47; MIPS32-NEXT:    addu $3, $2, $4
48; MIPS32-NEXT:    sc $3, 0($1)
49; MIPS32-NEXT:    beqz $3, $BB0_1
50; MIPS32-NEXT:    nop
51; MIPS32-NEXT:  # %bb.2: # %entry
52; MIPS32-NEXT:    jr $ra
53; MIPS32-NEXT:    nop
54;
55; MIPS32O0-LABEL: AtomicLoadAdd32:
56; MIPS32O0:       # %bb.0: # %entry
57; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
58; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
59; MIPS32O0-NEXT:    addu $1, $2, $25
60; MIPS32O0-NEXT:    lw $3, %got(x)($1)
61; MIPS32O0-NEXT:  $BB0_1: # %entry
62; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
63; MIPS32O0-NEXT:    ll $2, 0($3)
64; MIPS32O0-NEXT:    addu $1, $2, $4
65; MIPS32O0-NEXT:    sc $1, 0($3)
66; MIPS32O0-NEXT:    beqz $1, $BB0_1
67; MIPS32O0-NEXT:    nop
68; MIPS32O0-NEXT:  # %bb.2: # %entry
69; MIPS32O0-NEXT:    jr $ra
70; MIPS32O0-NEXT:    nop
71;
72; MIPS32R2-LABEL: AtomicLoadAdd32:
73; MIPS32R2:       # %bb.0: # %entry
74; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
75; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
76; MIPS32R2-NEXT:    addu $1, $2, $25
77; MIPS32R2-NEXT:    lw $1, %got(x)($1)
78; MIPS32R2-NEXT:  $BB0_1: # %entry
79; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
80; MIPS32R2-NEXT:    ll $2, 0($1)
81; MIPS32R2-NEXT:    addu $3, $2, $4
82; MIPS32R2-NEXT:    sc $3, 0($1)
83; MIPS32R2-NEXT:    beqz $3, $BB0_1
84; MIPS32R2-NEXT:    nop
85; MIPS32R2-NEXT:  # %bb.2: # %entry
86; MIPS32R2-NEXT:    jr $ra
87; MIPS32R2-NEXT:    nop
88;
89; MIPS32R6-LABEL: AtomicLoadAdd32:
90; MIPS32R6:       # %bb.0: # %entry
91; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
92; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
93; MIPS32R6-NEXT:    addu $1, $2, $25
94; MIPS32R6-NEXT:    lw $1, %got(x)($1)
95; MIPS32R6-NEXT:  $BB0_1: # %entry
96; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
97; MIPS32R6-NEXT:    ll $2, 0($1)
98; MIPS32R6-NEXT:    addu $3, $2, $4
99; MIPS32R6-NEXT:    sc $3, 0($1)
100; MIPS32R6-NEXT:    beqzc $3, $BB0_1
101; MIPS32R6-NEXT:    nop
102; MIPS32R6-NEXT:  # %bb.2: # %entry
103; MIPS32R6-NEXT:    jrc $ra
104;
105; MIPS32R6O0-LABEL: AtomicLoadAdd32:
106; MIPS32R6O0:       # %bb.0: # %entry
107; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
108; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
109; MIPS32R6O0-NEXT:    addu $1, $2, $25
110; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
111; MIPS32R6O0-NEXT:  $BB0_1: # %entry
112; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
113; MIPS32R6O0-NEXT:    ll $2, 0($3)
114; MIPS32R6O0-NEXT:    addu $1, $2, $4
115; MIPS32R6O0-NEXT:    sc $1, 0($3)
116; MIPS32R6O0-NEXT:    beqzc $1, $BB0_1
117; MIPS32R6O0-NEXT:    nop
118; MIPS32R6O0-NEXT:  # %bb.2: # %entry
119; MIPS32R6O0-NEXT:    jrc $ra
120;
121; MIPS4-LABEL: AtomicLoadAdd32:
122; MIPS4:       # %bb.0: # %entry
123; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
124; MIPS4-NEXT:    daddu $1, $1, $25
125; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
126; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
127; MIPS4-NEXT:  .LBB0_1: # %entry
128; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
129; MIPS4-NEXT:    ll $2, 0($1)
130; MIPS4-NEXT:    addu $3, $2, $4
131; MIPS4-NEXT:    sc $3, 0($1)
132; MIPS4-NEXT:    beqz $3, .LBB0_1
133; MIPS4-NEXT:    nop
134; MIPS4-NEXT:  # %bb.2: # %entry
135; MIPS4-NEXT:    jr $ra
136; MIPS4-NEXT:    nop
137;
138; MIPS64-LABEL: AtomicLoadAdd32:
139; MIPS64:       # %bb.0: # %entry
140; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
141; MIPS64-NEXT:    daddu $1, $1, $25
142; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
143; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
144; MIPS64-NEXT:  .LBB0_1: # %entry
145; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
146; MIPS64-NEXT:    ll $2, 0($1)
147; MIPS64-NEXT:    addu $3, $2, $4
148; MIPS64-NEXT:    sc $3, 0($1)
149; MIPS64-NEXT:    beqz $3, .LBB0_1
150; MIPS64-NEXT:    nop
151; MIPS64-NEXT:  # %bb.2: # %entry
152; MIPS64-NEXT:    jr $ra
153; MIPS64-NEXT:    nop
154;
155; MIPS64R2-LABEL: AtomicLoadAdd32:
156; MIPS64R2:       # %bb.0: # %entry
157; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
158; MIPS64R2-NEXT:    daddu $1, $1, $25
159; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
160; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
161; MIPS64R2-NEXT:  .LBB0_1: # %entry
162; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
163; MIPS64R2-NEXT:    ll $2, 0($1)
164; MIPS64R2-NEXT:    addu $3, $2, $4
165; MIPS64R2-NEXT:    sc $3, 0($1)
166; MIPS64R2-NEXT:    beqz $3, .LBB0_1
167; MIPS64R2-NEXT:    nop
168; MIPS64R2-NEXT:  # %bb.2: # %entry
169; MIPS64R2-NEXT:    jr $ra
170; MIPS64R2-NEXT:    nop
171;
172; MIPS64R6-LABEL: AtomicLoadAdd32:
173; MIPS64R6:       # %bb.0: # %entry
174; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
175; MIPS64R6-NEXT:    daddu $1, $1, $25
176; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
177; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
178; MIPS64R6-NEXT:  .LBB0_1: # %entry
179; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
180; MIPS64R6-NEXT:    ll $2, 0($1)
181; MIPS64R6-NEXT:    addu $3, $2, $4
182; MIPS64R6-NEXT:    sc $3, 0($1)
183; MIPS64R6-NEXT:    beqzc $3, .LBB0_1
184; MIPS64R6-NEXT:    nop
185; MIPS64R6-NEXT:  # %bb.2: # %entry
186; MIPS64R6-NEXT:    jrc $ra
187;
188; MIPS64R6O0-LABEL: AtomicLoadAdd32:
189; MIPS64R6O0:       # %bb.0: # %entry
190; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
191; MIPS64R6O0-NEXT:    daddu $1, $1, $25
192; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
193; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
194; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
195; MIPS64R6O0-NEXT:  .LBB0_1: # %entry
196; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
197; MIPS64R6O0-NEXT:    ll $2, 0($3)
198; MIPS64R6O0-NEXT:    addu $1, $2, $4
199; MIPS64R6O0-NEXT:    sc $1, 0($3)
200; MIPS64R6O0-NEXT:    beqzc $1, .LBB0_1
201; MIPS64R6O0-NEXT:    nop
202; MIPS64R6O0-NEXT:  # %bb.2: # %entry
203; MIPS64R6O0-NEXT:    jrc $ra
204;
205; MM32-LABEL: AtomicLoadAdd32:
206; MM32:       # %bb.0: # %entry
207; MM32-NEXT:    lui $2, %hi(_gp_disp)
208; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
209; MM32-NEXT:    addu $2, $2, $25
210; MM32-NEXT:    lw $1, %got(x)($2)
211; MM32-NEXT:  $BB0_1: # %entry
212; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
213; MM32-NEXT:    ll $2, 0($1)
214; MM32-NEXT:    addu16 $3, $2, $4
215; MM32-NEXT:    sc $3, 0($1)
216; MM32-NEXT:    beqzc $3, $BB0_1
217; MM32-NEXT:  # %bb.2: # %entry
218; MM32-NEXT:    jrc $ra
219;
220; O1-LABEL: AtomicLoadAdd32:
221; O1:       # %bb.0: # %entry
222; O1-NEXT:    lui $2, %hi(_gp_disp)
223; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
224; O1-NEXT:    addu $1, $2, $25
225; O1-NEXT:    lw $1, %got(x)($1)
226; O1-NEXT:  $BB0_1: # %entry
227; O1-NEXT:    # =>This Inner Loop Header: Depth=1
228; O1-NEXT:    ll $2, 0($1)
229; O1-NEXT:    addu $3, $2, $4
230; O1-NEXT:    sc $3, 0($1)
231; O1-NEXT:    beqz $3, $BB0_1
232; O1-NEXT:    nop
233; O1-NEXT:  # %bb.2: # %entry
234; O1-NEXT:    jr $ra
235; O1-NEXT:    nop
236;
237; O2-LABEL: AtomicLoadAdd32:
238; O2:       # %bb.0: # %entry
239; O2-NEXT:    lui $2, %hi(_gp_disp)
240; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
241; O2-NEXT:    addu $1, $2, $25
242; O2-NEXT:    lw $1, %got(x)($1)
243; O2-NEXT:  $BB0_1: # %entry
244; O2-NEXT:    # =>This Inner Loop Header: Depth=1
245; O2-NEXT:    ll $2, 0($1)
246; O2-NEXT:    addu $3, $2, $4
247; O2-NEXT:    sc $3, 0($1)
248; O2-NEXT:    beqz $3, $BB0_1
249; O2-NEXT:    nop
250; O2-NEXT:  # %bb.2: # %entry
251; O2-NEXT:    jr $ra
252; O2-NEXT:    nop
253;
254; O3-LABEL: AtomicLoadAdd32:
255; O3:       # %bb.0: # %entry
256; O3-NEXT:    lui $2, %hi(_gp_disp)
257; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
258; O3-NEXT:    addu $1, $2, $25
259; O3-NEXT:    lw $1, %got(x)($1)
260; O3-NEXT:  $BB0_1: # %entry
261; O3-NEXT:    # =>This Inner Loop Header: Depth=1
262; O3-NEXT:    ll $2, 0($1)
263; O3-NEXT:    addu $3, $2, $4
264; O3-NEXT:    sc $3, 0($1)
265; O3-NEXT:    beqz $3, $BB0_1
266; O3-NEXT:    nop
267; O3-NEXT:  # %bb.2: # %entry
268; O3-NEXT:    jr $ra
269; O3-NEXT:    nop
270;
271; MIPS32EB-LABEL: AtomicLoadAdd32:
272; MIPS32EB:       # %bb.0: # %entry
273; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
274; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
275; MIPS32EB-NEXT:    addu $1, $2, $25
276; MIPS32EB-NEXT:    lw $1, %got(x)($1)
277; MIPS32EB-NEXT:  $BB0_1: # %entry
278; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
279; MIPS32EB-NEXT:    ll $2, 0($1)
280; MIPS32EB-NEXT:    addu $3, $2, $4
281; MIPS32EB-NEXT:    sc $3, 0($1)
282; MIPS32EB-NEXT:    beqz $3, $BB0_1
283; MIPS32EB-NEXT:    nop
284; MIPS32EB-NEXT:  # %bb.2: # %entry
285; MIPS32EB-NEXT:    jr $ra
286; MIPS32EB-NEXT:    nop
287entry:
288  %0 = atomicrmw add ptr @x, i32 %incr monotonic
289  ret i32 %0
290
291}
292
293define i32 @AtomicLoadSub32(i32 signext %incr) nounwind {
294; MIPS32-LABEL: AtomicLoadSub32:
295; MIPS32:       # %bb.0: # %entry
296; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
297; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
298; MIPS32-NEXT:    addu $1, $2, $25
299; MIPS32-NEXT:    lw $1, %got(x)($1)
300; MIPS32-NEXT:  $BB1_1: # %entry
301; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
302; MIPS32-NEXT:    ll $2, 0($1)
303; MIPS32-NEXT:    subu $3, $2, $4
304; MIPS32-NEXT:    sc $3, 0($1)
305; MIPS32-NEXT:    beqz $3, $BB1_1
306; MIPS32-NEXT:    nop
307; MIPS32-NEXT:  # %bb.2: # %entry
308; MIPS32-NEXT:    jr $ra
309; MIPS32-NEXT:    nop
310;
311; MIPS32O0-LABEL: AtomicLoadSub32:
312; MIPS32O0:       # %bb.0: # %entry
313; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
314; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
315; MIPS32O0-NEXT:    addu $1, $2, $25
316; MIPS32O0-NEXT:    lw $3, %got(x)($1)
317; MIPS32O0-NEXT:  $BB1_1: # %entry
318; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
319; MIPS32O0-NEXT:    ll $2, 0($3)
320; MIPS32O0-NEXT:    subu $1, $2, $4
321; MIPS32O0-NEXT:    sc $1, 0($3)
322; MIPS32O0-NEXT:    beqz $1, $BB1_1
323; MIPS32O0-NEXT:    nop
324; MIPS32O0-NEXT:  # %bb.2: # %entry
325; MIPS32O0-NEXT:    jr $ra
326; MIPS32O0-NEXT:    nop
327;
328; MIPS32R2-LABEL: AtomicLoadSub32:
329; MIPS32R2:       # %bb.0: # %entry
330; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
331; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
332; MIPS32R2-NEXT:    addu $1, $2, $25
333; MIPS32R2-NEXT:    lw $1, %got(x)($1)
334; MIPS32R2-NEXT:  $BB1_1: # %entry
335; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
336; MIPS32R2-NEXT:    ll $2, 0($1)
337; MIPS32R2-NEXT:    subu $3, $2, $4
338; MIPS32R2-NEXT:    sc $3, 0($1)
339; MIPS32R2-NEXT:    beqz $3, $BB1_1
340; MIPS32R2-NEXT:    nop
341; MIPS32R2-NEXT:  # %bb.2: # %entry
342; MIPS32R2-NEXT:    jr $ra
343; MIPS32R2-NEXT:    nop
344;
345; MIPS32R6-LABEL: AtomicLoadSub32:
346; MIPS32R6:       # %bb.0: # %entry
347; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
348; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
349; MIPS32R6-NEXT:    addu $1, $2, $25
350; MIPS32R6-NEXT:    lw $1, %got(x)($1)
351; MIPS32R6-NEXT:  $BB1_1: # %entry
352; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
353; MIPS32R6-NEXT:    ll $2, 0($1)
354; MIPS32R6-NEXT:    subu $3, $2, $4
355; MIPS32R6-NEXT:    sc $3, 0($1)
356; MIPS32R6-NEXT:    beqzc $3, $BB1_1
357; MIPS32R6-NEXT:    nop
358; MIPS32R6-NEXT:  # %bb.2: # %entry
359; MIPS32R6-NEXT:    jrc $ra
360;
361; MIPS32R6O0-LABEL: AtomicLoadSub32:
362; MIPS32R6O0:       # %bb.0: # %entry
363; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
364; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
365; MIPS32R6O0-NEXT:    addu $1, $2, $25
366; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
367; MIPS32R6O0-NEXT:  $BB1_1: # %entry
368; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
369; MIPS32R6O0-NEXT:    ll $2, 0($3)
370; MIPS32R6O0-NEXT:    subu $1, $2, $4
371; MIPS32R6O0-NEXT:    sc $1, 0($3)
372; MIPS32R6O0-NEXT:    beqzc $1, $BB1_1
373; MIPS32R6O0-NEXT:    nop
374; MIPS32R6O0-NEXT:  # %bb.2: # %entry
375; MIPS32R6O0-NEXT:    jrc $ra
376;
377; MIPS4-LABEL: AtomicLoadSub32:
378; MIPS4:       # %bb.0: # %entry
379; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
380; MIPS4-NEXT:    daddu $1, $1, $25
381; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
382; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
383; MIPS4-NEXT:  .LBB1_1: # %entry
384; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
385; MIPS4-NEXT:    ll $2, 0($1)
386; MIPS4-NEXT:    subu $3, $2, $4
387; MIPS4-NEXT:    sc $3, 0($1)
388; MIPS4-NEXT:    beqz $3, .LBB1_1
389; MIPS4-NEXT:    nop
390; MIPS4-NEXT:  # %bb.2: # %entry
391; MIPS4-NEXT:    jr $ra
392; MIPS4-NEXT:    nop
393;
394; MIPS64-LABEL: AtomicLoadSub32:
395; MIPS64:       # %bb.0: # %entry
396; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
397; MIPS64-NEXT:    daddu $1, $1, $25
398; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
399; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
400; MIPS64-NEXT:  .LBB1_1: # %entry
401; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
402; MIPS64-NEXT:    ll $2, 0($1)
403; MIPS64-NEXT:    subu $3, $2, $4
404; MIPS64-NEXT:    sc $3, 0($1)
405; MIPS64-NEXT:    beqz $3, .LBB1_1
406; MIPS64-NEXT:    nop
407; MIPS64-NEXT:  # %bb.2: # %entry
408; MIPS64-NEXT:    jr $ra
409; MIPS64-NEXT:    nop
410;
411; MIPS64R2-LABEL: AtomicLoadSub32:
412; MIPS64R2:       # %bb.0: # %entry
413; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
414; MIPS64R2-NEXT:    daddu $1, $1, $25
415; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
416; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
417; MIPS64R2-NEXT:  .LBB1_1: # %entry
418; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
419; MIPS64R2-NEXT:    ll $2, 0($1)
420; MIPS64R2-NEXT:    subu $3, $2, $4
421; MIPS64R2-NEXT:    sc $3, 0($1)
422; MIPS64R2-NEXT:    beqz $3, .LBB1_1
423; MIPS64R2-NEXT:    nop
424; MIPS64R2-NEXT:  # %bb.2: # %entry
425; MIPS64R2-NEXT:    jr $ra
426; MIPS64R2-NEXT:    nop
427;
428; MIPS64R6-LABEL: AtomicLoadSub32:
429; MIPS64R6:       # %bb.0: # %entry
430; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
431; MIPS64R6-NEXT:    daddu $1, $1, $25
432; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
433; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
434; MIPS64R6-NEXT:  .LBB1_1: # %entry
435; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
436; MIPS64R6-NEXT:    ll $2, 0($1)
437; MIPS64R6-NEXT:    subu $3, $2, $4
438; MIPS64R6-NEXT:    sc $3, 0($1)
439; MIPS64R6-NEXT:    beqzc $3, .LBB1_1
440; MIPS64R6-NEXT:    nop
441; MIPS64R6-NEXT:  # %bb.2: # %entry
442; MIPS64R6-NEXT:    jrc $ra
443;
444; MIPS64R6O0-LABEL: AtomicLoadSub32:
445; MIPS64R6O0:       # %bb.0: # %entry
446; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
447; MIPS64R6O0-NEXT:    daddu $1, $1, $25
448; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
449; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
450; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
451; MIPS64R6O0-NEXT:  .LBB1_1: # %entry
452; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
453; MIPS64R6O0-NEXT:    ll $2, 0($3)
454; MIPS64R6O0-NEXT:    subu $1, $2, $4
455; MIPS64R6O0-NEXT:    sc $1, 0($3)
456; MIPS64R6O0-NEXT:    beqzc $1, .LBB1_1
457; MIPS64R6O0-NEXT:    nop
458; MIPS64R6O0-NEXT:  # %bb.2: # %entry
459; MIPS64R6O0-NEXT:    jrc $ra
460;
461; MM32-LABEL: AtomicLoadSub32:
462; MM32:       # %bb.0: # %entry
463; MM32-NEXT:    lui $2, %hi(_gp_disp)
464; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
465; MM32-NEXT:    addu $2, $2, $25
466; MM32-NEXT:    lw $1, %got(x)($2)
467; MM32-NEXT:  $BB1_1: # %entry
468; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
469; MM32-NEXT:    ll $2, 0($1)
470; MM32-NEXT:    subu16 $3, $2, $4
471; MM32-NEXT:    sc $3, 0($1)
472; MM32-NEXT:    beqzc $3, $BB1_1
473; MM32-NEXT:  # %bb.2: # %entry
474; MM32-NEXT:    jrc $ra
475;
476; O1-LABEL: AtomicLoadSub32:
477; O1:       # %bb.0: # %entry
478; O1-NEXT:    lui $2, %hi(_gp_disp)
479; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
480; O1-NEXT:    addu $1, $2, $25
481; O1-NEXT:    lw $1, %got(x)($1)
482; O1-NEXT:  $BB1_1: # %entry
483; O1-NEXT:    # =>This Inner Loop Header: Depth=1
484; O1-NEXT:    ll $2, 0($1)
485; O1-NEXT:    subu $3, $2, $4
486; O1-NEXT:    sc $3, 0($1)
487; O1-NEXT:    beqz $3, $BB1_1
488; O1-NEXT:    nop
489; O1-NEXT:  # %bb.2: # %entry
490; O1-NEXT:    jr $ra
491; O1-NEXT:    nop
492;
493; O2-LABEL: AtomicLoadSub32:
494; O2:       # %bb.0: # %entry
495; O2-NEXT:    lui $2, %hi(_gp_disp)
496; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
497; O2-NEXT:    addu $1, $2, $25
498; O2-NEXT:    lw $1, %got(x)($1)
499; O2-NEXT:  $BB1_1: # %entry
500; O2-NEXT:    # =>This Inner Loop Header: Depth=1
501; O2-NEXT:    ll $2, 0($1)
502; O2-NEXT:    subu $3, $2, $4
503; O2-NEXT:    sc $3, 0($1)
504; O2-NEXT:    beqz $3, $BB1_1
505; O2-NEXT:    nop
506; O2-NEXT:  # %bb.2: # %entry
507; O2-NEXT:    jr $ra
508; O2-NEXT:    nop
509;
510; O3-LABEL: AtomicLoadSub32:
511; O3:       # %bb.0: # %entry
512; O3-NEXT:    lui $2, %hi(_gp_disp)
513; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
514; O3-NEXT:    addu $1, $2, $25
515; O3-NEXT:    lw $1, %got(x)($1)
516; O3-NEXT:  $BB1_1: # %entry
517; O3-NEXT:    # =>This Inner Loop Header: Depth=1
518; O3-NEXT:    ll $2, 0($1)
519; O3-NEXT:    subu $3, $2, $4
520; O3-NEXT:    sc $3, 0($1)
521; O3-NEXT:    beqz $3, $BB1_1
522; O3-NEXT:    nop
523; O3-NEXT:  # %bb.2: # %entry
524; O3-NEXT:    jr $ra
525; O3-NEXT:    nop
526;
527; MIPS32EB-LABEL: AtomicLoadSub32:
528; MIPS32EB:       # %bb.0: # %entry
529; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
530; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
531; MIPS32EB-NEXT:    addu $1, $2, $25
532; MIPS32EB-NEXT:    lw $1, %got(x)($1)
533; MIPS32EB-NEXT:  $BB1_1: # %entry
534; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
535; MIPS32EB-NEXT:    ll $2, 0($1)
536; MIPS32EB-NEXT:    subu $3, $2, $4
537; MIPS32EB-NEXT:    sc $3, 0($1)
538; MIPS32EB-NEXT:    beqz $3, $BB1_1
539; MIPS32EB-NEXT:    nop
540; MIPS32EB-NEXT:  # %bb.2: # %entry
541; MIPS32EB-NEXT:    jr $ra
542; MIPS32EB-NEXT:    nop
543entry:
544  %0 = atomicrmw sub ptr @x, i32 %incr monotonic
545  ret i32 %0
546
547}
548
549define i32 @AtomicLoadXor32(i32 signext %incr) nounwind {
550; MIPS32-LABEL: AtomicLoadXor32:
551; MIPS32:       # %bb.0: # %entry
552; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
553; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
554; MIPS32-NEXT:    addu $1, $2, $25
555; MIPS32-NEXT:    lw $1, %got(x)($1)
556; MIPS32-NEXT:  $BB2_1: # %entry
557; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
558; MIPS32-NEXT:    ll $2, 0($1)
559; MIPS32-NEXT:    xor $3, $2, $4
560; MIPS32-NEXT:    sc $3, 0($1)
561; MIPS32-NEXT:    beqz $3, $BB2_1
562; MIPS32-NEXT:    nop
563; MIPS32-NEXT:  # %bb.2: # %entry
564; MIPS32-NEXT:    jr $ra
565; MIPS32-NEXT:    nop
566;
567; MIPS32O0-LABEL: AtomicLoadXor32:
568; MIPS32O0:       # %bb.0: # %entry
569; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
570; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
571; MIPS32O0-NEXT:    addu $1, $2, $25
572; MIPS32O0-NEXT:    lw $3, %got(x)($1)
573; MIPS32O0-NEXT:  $BB2_1: # %entry
574; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
575; MIPS32O0-NEXT:    ll $2, 0($3)
576; MIPS32O0-NEXT:    xor $1, $2, $4
577; MIPS32O0-NEXT:    sc $1, 0($3)
578; MIPS32O0-NEXT:    beqz $1, $BB2_1
579; MIPS32O0-NEXT:    nop
580; MIPS32O0-NEXT:  # %bb.2: # %entry
581; MIPS32O0-NEXT:    jr $ra
582; MIPS32O0-NEXT:    nop
583;
584; MIPS32R2-LABEL: AtomicLoadXor32:
585; MIPS32R2:       # %bb.0: # %entry
586; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
587; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
588; MIPS32R2-NEXT:    addu $1, $2, $25
589; MIPS32R2-NEXT:    lw $1, %got(x)($1)
590; MIPS32R2-NEXT:  $BB2_1: # %entry
591; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
592; MIPS32R2-NEXT:    ll $2, 0($1)
593; MIPS32R2-NEXT:    xor $3, $2, $4
594; MIPS32R2-NEXT:    sc $3, 0($1)
595; MIPS32R2-NEXT:    beqz $3, $BB2_1
596; MIPS32R2-NEXT:    nop
597; MIPS32R2-NEXT:  # %bb.2: # %entry
598; MIPS32R2-NEXT:    jr $ra
599; MIPS32R2-NEXT:    nop
600;
601; MIPS32R6-LABEL: AtomicLoadXor32:
602; MIPS32R6:       # %bb.0: # %entry
603; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
604; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
605; MIPS32R6-NEXT:    addu $1, $2, $25
606; MIPS32R6-NEXT:    lw $1, %got(x)($1)
607; MIPS32R6-NEXT:  $BB2_1: # %entry
608; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
609; MIPS32R6-NEXT:    ll $2, 0($1)
610; MIPS32R6-NEXT:    xor $3, $2, $4
611; MIPS32R6-NEXT:    sc $3, 0($1)
612; MIPS32R6-NEXT:    beqzc $3, $BB2_1
613; MIPS32R6-NEXT:    nop
614; MIPS32R6-NEXT:  # %bb.2: # %entry
615; MIPS32R6-NEXT:    jrc $ra
616;
617; MIPS32R6O0-LABEL: AtomicLoadXor32:
618; MIPS32R6O0:       # %bb.0: # %entry
619; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
620; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
621; MIPS32R6O0-NEXT:    addu $1, $2, $25
622; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
623; MIPS32R6O0-NEXT:  $BB2_1: # %entry
624; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
625; MIPS32R6O0-NEXT:    ll $2, 0($3)
626; MIPS32R6O0-NEXT:    xor $1, $2, $4
627; MIPS32R6O0-NEXT:    sc $1, 0($3)
628; MIPS32R6O0-NEXT:    beqzc $1, $BB2_1
629; MIPS32R6O0-NEXT:    nop
630; MIPS32R6O0-NEXT:  # %bb.2: # %entry
631; MIPS32R6O0-NEXT:    jrc $ra
632;
633; MIPS4-LABEL: AtomicLoadXor32:
634; MIPS4:       # %bb.0: # %entry
635; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
636; MIPS4-NEXT:    daddu $1, $1, $25
637; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
638; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
639; MIPS4-NEXT:  .LBB2_1: # %entry
640; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
641; MIPS4-NEXT:    ll $2, 0($1)
642; MIPS4-NEXT:    xor $3, $2, $4
643; MIPS4-NEXT:    sc $3, 0($1)
644; MIPS4-NEXT:    beqz $3, .LBB2_1
645; MIPS4-NEXT:    nop
646; MIPS4-NEXT:  # %bb.2: # %entry
647; MIPS4-NEXT:    jr $ra
648; MIPS4-NEXT:    nop
649;
650; MIPS64-LABEL: AtomicLoadXor32:
651; MIPS64:       # %bb.0: # %entry
652; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
653; MIPS64-NEXT:    daddu $1, $1, $25
654; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
655; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
656; MIPS64-NEXT:  .LBB2_1: # %entry
657; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
658; MIPS64-NEXT:    ll $2, 0($1)
659; MIPS64-NEXT:    xor $3, $2, $4
660; MIPS64-NEXT:    sc $3, 0($1)
661; MIPS64-NEXT:    beqz $3, .LBB2_1
662; MIPS64-NEXT:    nop
663; MIPS64-NEXT:  # %bb.2: # %entry
664; MIPS64-NEXT:    jr $ra
665; MIPS64-NEXT:    nop
666;
667; MIPS64R2-LABEL: AtomicLoadXor32:
668; MIPS64R2:       # %bb.0: # %entry
669; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
670; MIPS64R2-NEXT:    daddu $1, $1, $25
671; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
672; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
673; MIPS64R2-NEXT:  .LBB2_1: # %entry
674; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
675; MIPS64R2-NEXT:    ll $2, 0($1)
676; MIPS64R2-NEXT:    xor $3, $2, $4
677; MIPS64R2-NEXT:    sc $3, 0($1)
678; MIPS64R2-NEXT:    beqz $3, .LBB2_1
679; MIPS64R2-NEXT:    nop
680; MIPS64R2-NEXT:  # %bb.2: # %entry
681; MIPS64R2-NEXT:    jr $ra
682; MIPS64R2-NEXT:    nop
683;
684; MIPS64R6-LABEL: AtomicLoadXor32:
685; MIPS64R6:       # %bb.0: # %entry
686; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
687; MIPS64R6-NEXT:    daddu $1, $1, $25
688; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
689; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
690; MIPS64R6-NEXT:  .LBB2_1: # %entry
691; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
692; MIPS64R6-NEXT:    ll $2, 0($1)
693; MIPS64R6-NEXT:    xor $3, $2, $4
694; MIPS64R6-NEXT:    sc $3, 0($1)
695; MIPS64R6-NEXT:    beqzc $3, .LBB2_1
696; MIPS64R6-NEXT:    nop
697; MIPS64R6-NEXT:  # %bb.2: # %entry
698; MIPS64R6-NEXT:    jrc $ra
699;
700; MIPS64R6O0-LABEL: AtomicLoadXor32:
701; MIPS64R6O0:       # %bb.0: # %entry
702; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
703; MIPS64R6O0-NEXT:    daddu $1, $1, $25
704; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
705; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
706; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
707; MIPS64R6O0-NEXT:  .LBB2_1: # %entry
708; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
709; MIPS64R6O0-NEXT:    ll $2, 0($3)
710; MIPS64R6O0-NEXT:    xor $1, $2, $4
711; MIPS64R6O0-NEXT:    sc $1, 0($3)
712; MIPS64R6O0-NEXT:    beqzc $1, .LBB2_1
713; MIPS64R6O0-NEXT:    nop
714; MIPS64R6O0-NEXT:  # %bb.2: # %entry
715; MIPS64R6O0-NEXT:    jrc $ra
716;
717; MM32-LABEL: AtomicLoadXor32:
718; MM32:       # %bb.0: # %entry
719; MM32-NEXT:    lui $2, %hi(_gp_disp)
720; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
721; MM32-NEXT:    addu $2, $2, $25
722; MM32-NEXT:    lw $1, %got(x)($2)
723; MM32-NEXT:  $BB2_1: # %entry
724; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
725; MM32-NEXT:    ll $2, 0($1)
726; MM32-NEXT:    xor $3, $2, $4
727; MM32-NEXT:    sc $3, 0($1)
728; MM32-NEXT:    beqzc $3, $BB2_1
729; MM32-NEXT:  # %bb.2: # %entry
730; MM32-NEXT:    jrc $ra
731;
732; O1-LABEL: AtomicLoadXor32:
733; O1:       # %bb.0: # %entry
734; O1-NEXT:    lui $2, %hi(_gp_disp)
735; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
736; O1-NEXT:    addu $1, $2, $25
737; O1-NEXT:    lw $1, %got(x)($1)
738; O1-NEXT:  $BB2_1: # %entry
739; O1-NEXT:    # =>This Inner Loop Header: Depth=1
740; O1-NEXT:    ll $2, 0($1)
741; O1-NEXT:    xor $3, $2, $4
742; O1-NEXT:    sc $3, 0($1)
743; O1-NEXT:    beqz $3, $BB2_1
744; O1-NEXT:    nop
745; O1-NEXT:  # %bb.2: # %entry
746; O1-NEXT:    jr $ra
747; O1-NEXT:    nop
748;
749; O2-LABEL: AtomicLoadXor32:
750; O2:       # %bb.0: # %entry
751; O2-NEXT:    lui $2, %hi(_gp_disp)
752; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
753; O2-NEXT:    addu $1, $2, $25
754; O2-NEXT:    lw $1, %got(x)($1)
755; O2-NEXT:  $BB2_1: # %entry
756; O2-NEXT:    # =>This Inner Loop Header: Depth=1
757; O2-NEXT:    ll $2, 0($1)
758; O2-NEXT:    xor $3, $2, $4
759; O2-NEXT:    sc $3, 0($1)
760; O2-NEXT:    beqz $3, $BB2_1
761; O2-NEXT:    nop
762; O2-NEXT:  # %bb.2: # %entry
763; O2-NEXT:    jr $ra
764; O2-NEXT:    nop
765;
766; O3-LABEL: AtomicLoadXor32:
767; O3:       # %bb.0: # %entry
768; O3-NEXT:    lui $2, %hi(_gp_disp)
769; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
770; O3-NEXT:    addu $1, $2, $25
771; O3-NEXT:    lw $1, %got(x)($1)
772; O3-NEXT:  $BB2_1: # %entry
773; O3-NEXT:    # =>This Inner Loop Header: Depth=1
774; O3-NEXT:    ll $2, 0($1)
775; O3-NEXT:    xor $3, $2, $4
776; O3-NEXT:    sc $3, 0($1)
777; O3-NEXT:    beqz $3, $BB2_1
778; O3-NEXT:    nop
779; O3-NEXT:  # %bb.2: # %entry
780; O3-NEXT:    jr $ra
781; O3-NEXT:    nop
782;
783; MIPS32EB-LABEL: AtomicLoadXor32:
784; MIPS32EB:       # %bb.0: # %entry
785; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
786; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
787; MIPS32EB-NEXT:    addu $1, $2, $25
788; MIPS32EB-NEXT:    lw $1, %got(x)($1)
789; MIPS32EB-NEXT:  $BB2_1: # %entry
790; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
791; MIPS32EB-NEXT:    ll $2, 0($1)
792; MIPS32EB-NEXT:    xor $3, $2, $4
793; MIPS32EB-NEXT:    sc $3, 0($1)
794; MIPS32EB-NEXT:    beqz $3, $BB2_1
795; MIPS32EB-NEXT:    nop
796; MIPS32EB-NEXT:  # %bb.2: # %entry
797; MIPS32EB-NEXT:    jr $ra
798; MIPS32EB-NEXT:    nop
799entry:
800  %0 = atomicrmw xor ptr @x, i32 %incr monotonic
801  ret i32 %0
802}
803
804define i32 @AtomicLoadOr32(i32 signext %incr) nounwind {
805; MIPS32-LABEL: AtomicLoadOr32:
806; MIPS32:       # %bb.0: # %entry
807; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
808; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
809; MIPS32-NEXT:    addu $1, $2, $25
810; MIPS32-NEXT:    lw $1, %got(x)($1)
811; MIPS32-NEXT:  $BB3_1: # %entry
812; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
813; MIPS32-NEXT:    ll $2, 0($1)
814; MIPS32-NEXT:    or $3, $2, $4
815; MIPS32-NEXT:    sc $3, 0($1)
816; MIPS32-NEXT:    beqz $3, $BB3_1
817; MIPS32-NEXT:    nop
818; MIPS32-NEXT:  # %bb.2: # %entry
819; MIPS32-NEXT:    jr $ra
820; MIPS32-NEXT:    nop
821;
822; MIPS32O0-LABEL: AtomicLoadOr32:
823; MIPS32O0:       # %bb.0: # %entry
824; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
825; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
826; MIPS32O0-NEXT:    addu $1, $2, $25
827; MIPS32O0-NEXT:    lw $3, %got(x)($1)
828; MIPS32O0-NEXT:  $BB3_1: # %entry
829; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
830; MIPS32O0-NEXT:    ll $2, 0($3)
831; MIPS32O0-NEXT:    or $1, $2, $4
832; MIPS32O0-NEXT:    sc $1, 0($3)
833; MIPS32O0-NEXT:    beqz $1, $BB3_1
834; MIPS32O0-NEXT:    nop
835; MIPS32O0-NEXT:  # %bb.2: # %entry
836; MIPS32O0-NEXT:    jr $ra
837; MIPS32O0-NEXT:    nop
838;
839; MIPS32R2-LABEL: AtomicLoadOr32:
840; MIPS32R2:       # %bb.0: # %entry
841; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
842; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
843; MIPS32R2-NEXT:    addu $1, $2, $25
844; MIPS32R2-NEXT:    lw $1, %got(x)($1)
845; MIPS32R2-NEXT:  $BB3_1: # %entry
846; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
847; MIPS32R2-NEXT:    ll $2, 0($1)
848; MIPS32R2-NEXT:    or $3, $2, $4
849; MIPS32R2-NEXT:    sc $3, 0($1)
850; MIPS32R2-NEXT:    beqz $3, $BB3_1
851; MIPS32R2-NEXT:    nop
852; MIPS32R2-NEXT:  # %bb.2: # %entry
853; MIPS32R2-NEXT:    jr $ra
854; MIPS32R2-NEXT:    nop
855;
856; MIPS32R6-LABEL: AtomicLoadOr32:
857; MIPS32R6:       # %bb.0: # %entry
858; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
859; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
860; MIPS32R6-NEXT:    addu $1, $2, $25
861; MIPS32R6-NEXT:    lw $1, %got(x)($1)
862; MIPS32R6-NEXT:  $BB3_1: # %entry
863; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
864; MIPS32R6-NEXT:    ll $2, 0($1)
865; MIPS32R6-NEXT:    or $3, $2, $4
866; MIPS32R6-NEXT:    sc $3, 0($1)
867; MIPS32R6-NEXT:    beqzc $3, $BB3_1
868; MIPS32R6-NEXT:    nop
869; MIPS32R6-NEXT:  # %bb.2: # %entry
870; MIPS32R6-NEXT:    jrc $ra
871;
872; MIPS32R6O0-LABEL: AtomicLoadOr32:
873; MIPS32R6O0:       # %bb.0: # %entry
874; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
875; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
876; MIPS32R6O0-NEXT:    addu $1, $2, $25
877; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
878; MIPS32R6O0-NEXT:  $BB3_1: # %entry
879; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
880; MIPS32R6O0-NEXT:    ll $2, 0($3)
881; MIPS32R6O0-NEXT:    or $1, $2, $4
882; MIPS32R6O0-NEXT:    sc $1, 0($3)
883; MIPS32R6O0-NEXT:    beqzc $1, $BB3_1
884; MIPS32R6O0-NEXT:    nop
885; MIPS32R6O0-NEXT:  # %bb.2: # %entry
886; MIPS32R6O0-NEXT:    jrc $ra
887;
888; MIPS4-LABEL: AtomicLoadOr32:
889; MIPS4:       # %bb.0: # %entry
890; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
891; MIPS4-NEXT:    daddu $1, $1, $25
892; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
893; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
894; MIPS4-NEXT:  .LBB3_1: # %entry
895; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
896; MIPS4-NEXT:    ll $2, 0($1)
897; MIPS4-NEXT:    or $3, $2, $4
898; MIPS4-NEXT:    sc $3, 0($1)
899; MIPS4-NEXT:    beqz $3, .LBB3_1
900; MIPS4-NEXT:    nop
901; MIPS4-NEXT:  # %bb.2: # %entry
902; MIPS4-NEXT:    jr $ra
903; MIPS4-NEXT:    nop
904;
905; MIPS64-LABEL: AtomicLoadOr32:
906; MIPS64:       # %bb.0: # %entry
907; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
908; MIPS64-NEXT:    daddu $1, $1, $25
909; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
910; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
911; MIPS64-NEXT:  .LBB3_1: # %entry
912; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
913; MIPS64-NEXT:    ll $2, 0($1)
914; MIPS64-NEXT:    or $3, $2, $4
915; MIPS64-NEXT:    sc $3, 0($1)
916; MIPS64-NEXT:    beqz $3, .LBB3_1
917; MIPS64-NEXT:    nop
918; MIPS64-NEXT:  # %bb.2: # %entry
919; MIPS64-NEXT:    jr $ra
920; MIPS64-NEXT:    nop
921;
922; MIPS64R2-LABEL: AtomicLoadOr32:
923; MIPS64R2:       # %bb.0: # %entry
924; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
925; MIPS64R2-NEXT:    daddu $1, $1, $25
926; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
927; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
928; MIPS64R2-NEXT:  .LBB3_1: # %entry
929; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
930; MIPS64R2-NEXT:    ll $2, 0($1)
931; MIPS64R2-NEXT:    or $3, $2, $4
932; MIPS64R2-NEXT:    sc $3, 0($1)
933; MIPS64R2-NEXT:    beqz $3, .LBB3_1
934; MIPS64R2-NEXT:    nop
935; MIPS64R2-NEXT:  # %bb.2: # %entry
936; MIPS64R2-NEXT:    jr $ra
937; MIPS64R2-NEXT:    nop
938;
939; MIPS64R6-LABEL: AtomicLoadOr32:
940; MIPS64R6:       # %bb.0: # %entry
941; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
942; MIPS64R6-NEXT:    daddu $1, $1, $25
943; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
944; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
945; MIPS64R6-NEXT:  .LBB3_1: # %entry
946; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
947; MIPS64R6-NEXT:    ll $2, 0($1)
948; MIPS64R6-NEXT:    or $3, $2, $4
949; MIPS64R6-NEXT:    sc $3, 0($1)
950; MIPS64R6-NEXT:    beqzc $3, .LBB3_1
951; MIPS64R6-NEXT:    nop
952; MIPS64R6-NEXT:  # %bb.2: # %entry
953; MIPS64R6-NEXT:    jrc $ra
954;
955; MIPS64R6O0-LABEL: AtomicLoadOr32:
956; MIPS64R6O0:       # %bb.0: # %entry
957; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
958; MIPS64R6O0-NEXT:    daddu $1, $1, $25
959; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
960; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
961; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
962; MIPS64R6O0-NEXT:  .LBB3_1: # %entry
963; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
964; MIPS64R6O0-NEXT:    ll $2, 0($3)
965; MIPS64R6O0-NEXT:    or $1, $2, $4
966; MIPS64R6O0-NEXT:    sc $1, 0($3)
967; MIPS64R6O0-NEXT:    beqzc $1, .LBB3_1
968; MIPS64R6O0-NEXT:    nop
969; MIPS64R6O0-NEXT:  # %bb.2: # %entry
970; MIPS64R6O0-NEXT:    jrc $ra
971;
972; MM32-LABEL: AtomicLoadOr32:
973; MM32:       # %bb.0: # %entry
974; MM32-NEXT:    lui $2, %hi(_gp_disp)
975; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
976; MM32-NEXT:    addu $2, $2, $25
977; MM32-NEXT:    lw $1, %got(x)($2)
978; MM32-NEXT:  $BB3_1: # %entry
979; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
980; MM32-NEXT:    ll $2, 0($1)
981; MM32-NEXT:    or $3, $2, $4
982; MM32-NEXT:    sc $3, 0($1)
983; MM32-NEXT:    beqzc $3, $BB3_1
984; MM32-NEXT:  # %bb.2: # %entry
985; MM32-NEXT:    jrc $ra
986;
987; O1-LABEL: AtomicLoadOr32:
988; O1:       # %bb.0: # %entry
989; O1-NEXT:    lui $2, %hi(_gp_disp)
990; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
991; O1-NEXT:    addu $1, $2, $25
992; O1-NEXT:    lw $1, %got(x)($1)
993; O1-NEXT:  $BB3_1: # %entry
994; O1-NEXT:    # =>This Inner Loop Header: Depth=1
995; O1-NEXT:    ll $2, 0($1)
996; O1-NEXT:    or $3, $2, $4
997; O1-NEXT:    sc $3, 0($1)
998; O1-NEXT:    beqz $3, $BB3_1
999; O1-NEXT:    nop
1000; O1-NEXT:  # %bb.2: # %entry
1001; O1-NEXT:    jr $ra
1002; O1-NEXT:    nop
1003;
1004; O2-LABEL: AtomicLoadOr32:
1005; O2:       # %bb.0: # %entry
1006; O2-NEXT:    lui $2, %hi(_gp_disp)
1007; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1008; O2-NEXT:    addu $1, $2, $25
1009; O2-NEXT:    lw $1, %got(x)($1)
1010; O2-NEXT:  $BB3_1: # %entry
1011; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1012; O2-NEXT:    ll $2, 0($1)
1013; O2-NEXT:    or $3, $2, $4
1014; O2-NEXT:    sc $3, 0($1)
1015; O2-NEXT:    beqz $3, $BB3_1
1016; O2-NEXT:    nop
1017; O2-NEXT:  # %bb.2: # %entry
1018; O2-NEXT:    jr $ra
1019; O2-NEXT:    nop
1020;
1021; O3-LABEL: AtomicLoadOr32:
1022; O3:       # %bb.0: # %entry
1023; O3-NEXT:    lui $2, %hi(_gp_disp)
1024; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1025; O3-NEXT:    addu $1, $2, $25
1026; O3-NEXT:    lw $1, %got(x)($1)
1027; O3-NEXT:  $BB3_1: # %entry
1028; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1029; O3-NEXT:    ll $2, 0($1)
1030; O3-NEXT:    or $3, $2, $4
1031; O3-NEXT:    sc $3, 0($1)
1032; O3-NEXT:    beqz $3, $BB3_1
1033; O3-NEXT:    nop
1034; O3-NEXT:  # %bb.2: # %entry
1035; O3-NEXT:    jr $ra
1036; O3-NEXT:    nop
1037;
1038; MIPS32EB-LABEL: AtomicLoadOr32:
1039; MIPS32EB:       # %bb.0: # %entry
1040; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1041; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1042; MIPS32EB-NEXT:    addu $1, $2, $25
1043; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1044; MIPS32EB-NEXT:  $BB3_1: # %entry
1045; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1046; MIPS32EB-NEXT:    ll $2, 0($1)
1047; MIPS32EB-NEXT:    or $3, $2, $4
1048; MIPS32EB-NEXT:    sc $3, 0($1)
1049; MIPS32EB-NEXT:    beqz $3, $BB3_1
1050; MIPS32EB-NEXT:    nop
1051; MIPS32EB-NEXT:  # %bb.2: # %entry
1052; MIPS32EB-NEXT:    jr $ra
1053; MIPS32EB-NEXT:    nop
1054entry:
1055  %0 = atomicrmw or ptr @x, i32 %incr monotonic
1056  ret i32 %0
1057}
1058
1059define i32 @AtomicLoadAnd32(i32 signext %incr) nounwind {
1060; MIPS32-LABEL: AtomicLoadAnd32:
1061; MIPS32:       # %bb.0: # %entry
1062; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1063; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1064; MIPS32-NEXT:    addu $1, $2, $25
1065; MIPS32-NEXT:    lw $1, %got(x)($1)
1066; MIPS32-NEXT:  $BB4_1: # %entry
1067; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1068; MIPS32-NEXT:    ll $2, 0($1)
1069; MIPS32-NEXT:    and $3, $2, $4
1070; MIPS32-NEXT:    sc $3, 0($1)
1071; MIPS32-NEXT:    beqz $3, $BB4_1
1072; MIPS32-NEXT:    nop
1073; MIPS32-NEXT:  # %bb.2: # %entry
1074; MIPS32-NEXT:    jr $ra
1075; MIPS32-NEXT:    nop
1076;
1077; MIPS32O0-LABEL: AtomicLoadAnd32:
1078; MIPS32O0:       # %bb.0: # %entry
1079; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1080; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1081; MIPS32O0-NEXT:    addu $1, $2, $25
1082; MIPS32O0-NEXT:    lw $3, %got(x)($1)
1083; MIPS32O0-NEXT:  $BB4_1: # %entry
1084; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1085; MIPS32O0-NEXT:    ll $2, 0($3)
1086; MIPS32O0-NEXT:    and $1, $2, $4
1087; MIPS32O0-NEXT:    sc $1, 0($3)
1088; MIPS32O0-NEXT:    beqz $1, $BB4_1
1089; MIPS32O0-NEXT:    nop
1090; MIPS32O0-NEXT:  # %bb.2: # %entry
1091; MIPS32O0-NEXT:    jr $ra
1092; MIPS32O0-NEXT:    nop
1093;
1094; MIPS32R2-LABEL: AtomicLoadAnd32:
1095; MIPS32R2:       # %bb.0: # %entry
1096; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1097; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1098; MIPS32R2-NEXT:    addu $1, $2, $25
1099; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1100; MIPS32R2-NEXT:  $BB4_1: # %entry
1101; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1102; MIPS32R2-NEXT:    ll $2, 0($1)
1103; MIPS32R2-NEXT:    and $3, $2, $4
1104; MIPS32R2-NEXT:    sc $3, 0($1)
1105; MIPS32R2-NEXT:    beqz $3, $BB4_1
1106; MIPS32R2-NEXT:    nop
1107; MIPS32R2-NEXT:  # %bb.2: # %entry
1108; MIPS32R2-NEXT:    jr $ra
1109; MIPS32R2-NEXT:    nop
1110;
1111; MIPS32R6-LABEL: AtomicLoadAnd32:
1112; MIPS32R6:       # %bb.0: # %entry
1113; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1114; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1115; MIPS32R6-NEXT:    addu $1, $2, $25
1116; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1117; MIPS32R6-NEXT:  $BB4_1: # %entry
1118; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1119; MIPS32R6-NEXT:    ll $2, 0($1)
1120; MIPS32R6-NEXT:    and $3, $2, $4
1121; MIPS32R6-NEXT:    sc $3, 0($1)
1122; MIPS32R6-NEXT:    beqzc $3, $BB4_1
1123; MIPS32R6-NEXT:    nop
1124; MIPS32R6-NEXT:  # %bb.2: # %entry
1125; MIPS32R6-NEXT:    jrc $ra
1126;
1127; MIPS32R6O0-LABEL: AtomicLoadAnd32:
1128; MIPS32R6O0:       # %bb.0: # %entry
1129; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1130; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1131; MIPS32R6O0-NEXT:    addu $1, $2, $25
1132; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
1133; MIPS32R6O0-NEXT:  $BB4_1: # %entry
1134; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1135; MIPS32R6O0-NEXT:    ll $2, 0($3)
1136; MIPS32R6O0-NEXT:    and $1, $2, $4
1137; MIPS32R6O0-NEXT:    sc $1, 0($3)
1138; MIPS32R6O0-NEXT:    beqzc $1, $BB4_1
1139; MIPS32R6O0-NEXT:    nop
1140; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1141; MIPS32R6O0-NEXT:    jrc $ra
1142;
1143; MIPS4-LABEL: AtomicLoadAnd32:
1144; MIPS4:       # %bb.0: # %entry
1145; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1146; MIPS4-NEXT:    daddu $1, $1, $25
1147; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1148; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1149; MIPS4-NEXT:  .LBB4_1: # %entry
1150; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1151; MIPS4-NEXT:    ll $2, 0($1)
1152; MIPS4-NEXT:    and $3, $2, $4
1153; MIPS4-NEXT:    sc $3, 0($1)
1154; MIPS4-NEXT:    beqz $3, .LBB4_1
1155; MIPS4-NEXT:    nop
1156; MIPS4-NEXT:  # %bb.2: # %entry
1157; MIPS4-NEXT:    jr $ra
1158; MIPS4-NEXT:    nop
1159;
1160; MIPS64-LABEL: AtomicLoadAnd32:
1161; MIPS64:       # %bb.0: # %entry
1162; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1163; MIPS64-NEXT:    daddu $1, $1, $25
1164; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1165; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1166; MIPS64-NEXT:  .LBB4_1: # %entry
1167; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1168; MIPS64-NEXT:    ll $2, 0($1)
1169; MIPS64-NEXT:    and $3, $2, $4
1170; MIPS64-NEXT:    sc $3, 0($1)
1171; MIPS64-NEXT:    beqz $3, .LBB4_1
1172; MIPS64-NEXT:    nop
1173; MIPS64-NEXT:  # %bb.2: # %entry
1174; MIPS64-NEXT:    jr $ra
1175; MIPS64-NEXT:    nop
1176;
1177; MIPS64R2-LABEL: AtomicLoadAnd32:
1178; MIPS64R2:       # %bb.0: # %entry
1179; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1180; MIPS64R2-NEXT:    daddu $1, $1, $25
1181; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1182; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1183; MIPS64R2-NEXT:  .LBB4_1: # %entry
1184; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1185; MIPS64R2-NEXT:    ll $2, 0($1)
1186; MIPS64R2-NEXT:    and $3, $2, $4
1187; MIPS64R2-NEXT:    sc $3, 0($1)
1188; MIPS64R2-NEXT:    beqz $3, .LBB4_1
1189; MIPS64R2-NEXT:    nop
1190; MIPS64R2-NEXT:  # %bb.2: # %entry
1191; MIPS64R2-NEXT:    jr $ra
1192; MIPS64R2-NEXT:    nop
1193;
1194; MIPS64R6-LABEL: AtomicLoadAnd32:
1195; MIPS64R6:       # %bb.0: # %entry
1196; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1197; MIPS64R6-NEXT:    daddu $1, $1, $25
1198; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1199; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1200; MIPS64R6-NEXT:  .LBB4_1: # %entry
1201; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1202; MIPS64R6-NEXT:    ll $2, 0($1)
1203; MIPS64R6-NEXT:    and $3, $2, $4
1204; MIPS64R6-NEXT:    sc $3, 0($1)
1205; MIPS64R6-NEXT:    beqzc $3, .LBB4_1
1206; MIPS64R6-NEXT:    nop
1207; MIPS64R6-NEXT:  # %bb.2: # %entry
1208; MIPS64R6-NEXT:    jrc $ra
1209;
1210; MIPS64R6O0-LABEL: AtomicLoadAnd32:
1211; MIPS64R6O0:       # %bb.0: # %entry
1212; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1213; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1214; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1215; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
1216; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
1217; MIPS64R6O0-NEXT:  .LBB4_1: # %entry
1218; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1219; MIPS64R6O0-NEXT:    ll $2, 0($3)
1220; MIPS64R6O0-NEXT:    and $1, $2, $4
1221; MIPS64R6O0-NEXT:    sc $1, 0($3)
1222; MIPS64R6O0-NEXT:    beqzc $1, .LBB4_1
1223; MIPS64R6O0-NEXT:    nop
1224; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1225; MIPS64R6O0-NEXT:    jrc $ra
1226;
1227; MM32-LABEL: AtomicLoadAnd32:
1228; MM32:       # %bb.0: # %entry
1229; MM32-NEXT:    lui $2, %hi(_gp_disp)
1230; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1231; MM32-NEXT:    addu $2, $2, $25
1232; MM32-NEXT:    lw $1, %got(x)($2)
1233; MM32-NEXT:  $BB4_1: # %entry
1234; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1235; MM32-NEXT:    ll $2, 0($1)
1236; MM32-NEXT:    and $3, $2, $4
1237; MM32-NEXT:    sc $3, 0($1)
1238; MM32-NEXT:    beqzc $3, $BB4_1
1239; MM32-NEXT:  # %bb.2: # %entry
1240; MM32-NEXT:    jrc $ra
1241;
1242; O1-LABEL: AtomicLoadAnd32:
1243; O1:       # %bb.0: # %entry
1244; O1-NEXT:    lui $2, %hi(_gp_disp)
1245; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1246; O1-NEXT:    addu $1, $2, $25
1247; O1-NEXT:    lw $1, %got(x)($1)
1248; O1-NEXT:  $BB4_1: # %entry
1249; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1250; O1-NEXT:    ll $2, 0($1)
1251; O1-NEXT:    and $3, $2, $4
1252; O1-NEXT:    sc $3, 0($1)
1253; O1-NEXT:    beqz $3, $BB4_1
1254; O1-NEXT:    nop
1255; O1-NEXT:  # %bb.2: # %entry
1256; O1-NEXT:    jr $ra
1257; O1-NEXT:    nop
1258;
1259; O2-LABEL: AtomicLoadAnd32:
1260; O2:       # %bb.0: # %entry
1261; O2-NEXT:    lui $2, %hi(_gp_disp)
1262; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1263; O2-NEXT:    addu $1, $2, $25
1264; O2-NEXT:    lw $1, %got(x)($1)
1265; O2-NEXT:  $BB4_1: # %entry
1266; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1267; O2-NEXT:    ll $2, 0($1)
1268; O2-NEXT:    and $3, $2, $4
1269; O2-NEXT:    sc $3, 0($1)
1270; O2-NEXT:    beqz $3, $BB4_1
1271; O2-NEXT:    nop
1272; O2-NEXT:  # %bb.2: # %entry
1273; O2-NEXT:    jr $ra
1274; O2-NEXT:    nop
1275;
1276; O3-LABEL: AtomicLoadAnd32:
1277; O3:       # %bb.0: # %entry
1278; O3-NEXT:    lui $2, %hi(_gp_disp)
1279; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1280; O3-NEXT:    addu $1, $2, $25
1281; O3-NEXT:    lw $1, %got(x)($1)
1282; O3-NEXT:  $BB4_1: # %entry
1283; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1284; O3-NEXT:    ll $2, 0($1)
1285; O3-NEXT:    and $3, $2, $4
1286; O3-NEXT:    sc $3, 0($1)
1287; O3-NEXT:    beqz $3, $BB4_1
1288; O3-NEXT:    nop
1289; O3-NEXT:  # %bb.2: # %entry
1290; O3-NEXT:    jr $ra
1291; O3-NEXT:    nop
1292;
1293; MIPS32EB-LABEL: AtomicLoadAnd32:
1294; MIPS32EB:       # %bb.0: # %entry
1295; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1296; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1297; MIPS32EB-NEXT:    addu $1, $2, $25
1298; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1299; MIPS32EB-NEXT:  $BB4_1: # %entry
1300; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1301; MIPS32EB-NEXT:    ll $2, 0($1)
1302; MIPS32EB-NEXT:    and $3, $2, $4
1303; MIPS32EB-NEXT:    sc $3, 0($1)
1304; MIPS32EB-NEXT:    beqz $3, $BB4_1
1305; MIPS32EB-NEXT:    nop
1306; MIPS32EB-NEXT:  # %bb.2: # %entry
1307; MIPS32EB-NEXT:    jr $ra
1308; MIPS32EB-NEXT:    nop
1309entry:
1310  %0 = atomicrmw and ptr @x, i32 %incr monotonic
1311  ret i32 %0
1312}
1313
1314define i32 @AtomicLoadNand32(i32 signext %incr) nounwind {
1315; MIPS32-LABEL: AtomicLoadNand32:
1316; MIPS32:       # %bb.0: # %entry
1317; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1318; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1319; MIPS32-NEXT:    addu $1, $2, $25
1320; MIPS32-NEXT:    lw $1, %got(x)($1)
1321; MIPS32-NEXT:  $BB5_1: # %entry
1322; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1323; MIPS32-NEXT:    ll $2, 0($1)
1324; MIPS32-NEXT:    and $3, $2, $4
1325; MIPS32-NEXT:    nor $3, $zero, $3
1326; MIPS32-NEXT:    sc $3, 0($1)
1327; MIPS32-NEXT:    beqz $3, $BB5_1
1328; MIPS32-NEXT:    nop
1329; MIPS32-NEXT:  # %bb.2: # %entry
1330; MIPS32-NEXT:    jr $ra
1331; MIPS32-NEXT:    nop
1332;
1333; MIPS32O0-LABEL: AtomicLoadNand32:
1334; MIPS32O0:       # %bb.0: # %entry
1335; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1336; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1337; MIPS32O0-NEXT:    addu $1, $2, $25
1338; MIPS32O0-NEXT:    lw $3, %got(x)($1)
1339; MIPS32O0-NEXT:  $BB5_1: # %entry
1340; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1341; MIPS32O0-NEXT:    ll $2, 0($3)
1342; MIPS32O0-NEXT:    and $1, $2, $4
1343; MIPS32O0-NEXT:    nor $1, $zero, $1
1344; MIPS32O0-NEXT:    sc $1, 0($3)
1345; MIPS32O0-NEXT:    beqz $1, $BB5_1
1346; MIPS32O0-NEXT:    nop
1347; MIPS32O0-NEXT:  # %bb.2: # %entry
1348; MIPS32O0-NEXT:    jr $ra
1349; MIPS32O0-NEXT:    nop
1350;
1351; MIPS32R2-LABEL: AtomicLoadNand32:
1352; MIPS32R2:       # %bb.0: # %entry
1353; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1354; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1355; MIPS32R2-NEXT:    addu $1, $2, $25
1356; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1357; MIPS32R2-NEXT:  $BB5_1: # %entry
1358; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1359; MIPS32R2-NEXT:    ll $2, 0($1)
1360; MIPS32R2-NEXT:    and $3, $2, $4
1361; MIPS32R2-NEXT:    nor $3, $zero, $3
1362; MIPS32R2-NEXT:    sc $3, 0($1)
1363; MIPS32R2-NEXT:    beqz $3, $BB5_1
1364; MIPS32R2-NEXT:    nop
1365; MIPS32R2-NEXT:  # %bb.2: # %entry
1366; MIPS32R2-NEXT:    jr $ra
1367; MIPS32R2-NEXT:    nop
1368;
1369; MIPS32R6-LABEL: AtomicLoadNand32:
1370; MIPS32R6:       # %bb.0: # %entry
1371; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1372; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1373; MIPS32R6-NEXT:    addu $1, $2, $25
1374; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1375; MIPS32R6-NEXT:  $BB5_1: # %entry
1376; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1377; MIPS32R6-NEXT:    ll $2, 0($1)
1378; MIPS32R6-NEXT:    and $3, $2, $4
1379; MIPS32R6-NEXT:    nor $3, $zero, $3
1380; MIPS32R6-NEXT:    sc $3, 0($1)
1381; MIPS32R6-NEXT:    beqzc $3, $BB5_1
1382; MIPS32R6-NEXT:    nop
1383; MIPS32R6-NEXT:  # %bb.2: # %entry
1384; MIPS32R6-NEXT:    jrc $ra
1385;
1386; MIPS32R6O0-LABEL: AtomicLoadNand32:
1387; MIPS32R6O0:       # %bb.0: # %entry
1388; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1389; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1390; MIPS32R6O0-NEXT:    addu $1, $2, $25
1391; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
1392; MIPS32R6O0-NEXT:  $BB5_1: # %entry
1393; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1394; MIPS32R6O0-NEXT:    ll $2, 0($3)
1395; MIPS32R6O0-NEXT:    and $1, $2, $4
1396; MIPS32R6O0-NEXT:    nor $1, $zero, $1
1397; MIPS32R6O0-NEXT:    sc $1, 0($3)
1398; MIPS32R6O0-NEXT:    beqzc $1, $BB5_1
1399; MIPS32R6O0-NEXT:    nop
1400; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1401; MIPS32R6O0-NEXT:    jrc $ra
1402;
1403; MIPS4-LABEL: AtomicLoadNand32:
1404; MIPS4:       # %bb.0: # %entry
1405; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1406; MIPS4-NEXT:    daddu $1, $1, $25
1407; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1408; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1409; MIPS4-NEXT:  .LBB5_1: # %entry
1410; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1411; MIPS4-NEXT:    ll $2, 0($1)
1412; MIPS4-NEXT:    and $3, $2, $4
1413; MIPS4-NEXT:    nor $3, $zero, $3
1414; MIPS4-NEXT:    sc $3, 0($1)
1415; MIPS4-NEXT:    beqz $3, .LBB5_1
1416; MIPS4-NEXT:    nop
1417; MIPS4-NEXT:  # %bb.2: # %entry
1418; MIPS4-NEXT:    jr $ra
1419; MIPS4-NEXT:    nop
1420;
1421; MIPS64-LABEL: AtomicLoadNand32:
1422; MIPS64:       # %bb.0: # %entry
1423; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1424; MIPS64-NEXT:    daddu $1, $1, $25
1425; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1426; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1427; MIPS64-NEXT:  .LBB5_1: # %entry
1428; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1429; MIPS64-NEXT:    ll $2, 0($1)
1430; MIPS64-NEXT:    and $3, $2, $4
1431; MIPS64-NEXT:    nor $3, $zero, $3
1432; MIPS64-NEXT:    sc $3, 0($1)
1433; MIPS64-NEXT:    beqz $3, .LBB5_1
1434; MIPS64-NEXT:    nop
1435; MIPS64-NEXT:  # %bb.2: # %entry
1436; MIPS64-NEXT:    jr $ra
1437; MIPS64-NEXT:    nop
1438;
1439; MIPS64R2-LABEL: AtomicLoadNand32:
1440; MIPS64R2:       # %bb.0: # %entry
1441; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1442; MIPS64R2-NEXT:    daddu $1, $1, $25
1443; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1444; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1445; MIPS64R2-NEXT:  .LBB5_1: # %entry
1446; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1447; MIPS64R2-NEXT:    ll $2, 0($1)
1448; MIPS64R2-NEXT:    and $3, $2, $4
1449; MIPS64R2-NEXT:    nor $3, $zero, $3
1450; MIPS64R2-NEXT:    sc $3, 0($1)
1451; MIPS64R2-NEXT:    beqz $3, .LBB5_1
1452; MIPS64R2-NEXT:    nop
1453; MIPS64R2-NEXT:  # %bb.2: # %entry
1454; MIPS64R2-NEXT:    jr $ra
1455; MIPS64R2-NEXT:    nop
1456;
1457; MIPS64R6-LABEL: AtomicLoadNand32:
1458; MIPS64R6:       # %bb.0: # %entry
1459; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1460; MIPS64R6-NEXT:    daddu $1, $1, $25
1461; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1462; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1463; MIPS64R6-NEXT:  .LBB5_1: # %entry
1464; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1465; MIPS64R6-NEXT:    ll $2, 0($1)
1466; MIPS64R6-NEXT:    and $3, $2, $4
1467; MIPS64R6-NEXT:    nor $3, $zero, $3
1468; MIPS64R6-NEXT:    sc $3, 0($1)
1469; MIPS64R6-NEXT:    beqzc $3, .LBB5_1
1470; MIPS64R6-NEXT:    nop
1471; MIPS64R6-NEXT:  # %bb.2: # %entry
1472; MIPS64R6-NEXT:    jrc $ra
1473;
1474; MIPS64R6O0-LABEL: AtomicLoadNand32:
1475; MIPS64R6O0:       # %bb.0: # %entry
1476; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1477; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1478; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1479; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
1480; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
1481; MIPS64R6O0-NEXT:  .LBB5_1: # %entry
1482; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1483; MIPS64R6O0-NEXT:    ll $2, 0($3)
1484; MIPS64R6O0-NEXT:    and $1, $2, $4
1485; MIPS64R6O0-NEXT:    nor $1, $zero, $1
1486; MIPS64R6O0-NEXT:    sc $1, 0($3)
1487; MIPS64R6O0-NEXT:    beqzc $1, .LBB5_1
1488; MIPS64R6O0-NEXT:    nop
1489; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1490; MIPS64R6O0-NEXT:    jrc $ra
1491;
1492; MM32-LABEL: AtomicLoadNand32:
1493; MM32:       # %bb.0: # %entry
1494; MM32-NEXT:    lui $2, %hi(_gp_disp)
1495; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1496; MM32-NEXT:    addu $2, $2, $25
1497; MM32-NEXT:    lw $1, %got(x)($2)
1498; MM32-NEXT:  $BB5_1: # %entry
1499; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1500; MM32-NEXT:    ll $2, 0($1)
1501; MM32-NEXT:    and $3, $2, $4
1502; MM32-NEXT:    nor $3, $zero, $3
1503; MM32-NEXT:    sc $3, 0($1)
1504; MM32-NEXT:    beqzc $3, $BB5_1
1505; MM32-NEXT:  # %bb.2: # %entry
1506; MM32-NEXT:    jrc $ra
1507;
1508; O1-LABEL: AtomicLoadNand32:
1509; O1:       # %bb.0: # %entry
1510; O1-NEXT:    lui $2, %hi(_gp_disp)
1511; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1512; O1-NEXT:    addu $1, $2, $25
1513; O1-NEXT:    lw $1, %got(x)($1)
1514; O1-NEXT:  $BB5_1: # %entry
1515; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1516; O1-NEXT:    ll $2, 0($1)
1517; O1-NEXT:    and $3, $2, $4
1518; O1-NEXT:    nor $3, $zero, $3
1519; O1-NEXT:    sc $3, 0($1)
1520; O1-NEXT:    beqz $3, $BB5_1
1521; O1-NEXT:    nop
1522; O1-NEXT:  # %bb.2: # %entry
1523; O1-NEXT:    jr $ra
1524; O1-NEXT:    nop
1525;
1526; O2-LABEL: AtomicLoadNand32:
1527; O2:       # %bb.0: # %entry
1528; O2-NEXT:    lui $2, %hi(_gp_disp)
1529; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1530; O2-NEXT:    addu $1, $2, $25
1531; O2-NEXT:    lw $1, %got(x)($1)
1532; O2-NEXT:  $BB5_1: # %entry
1533; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1534; O2-NEXT:    ll $2, 0($1)
1535; O2-NEXT:    and $3, $2, $4
1536; O2-NEXT:    nor $3, $zero, $3
1537; O2-NEXT:    sc $3, 0($1)
1538; O2-NEXT:    beqz $3, $BB5_1
1539; O2-NEXT:    nop
1540; O2-NEXT:  # %bb.2: # %entry
1541; O2-NEXT:    jr $ra
1542; O2-NEXT:    nop
1543;
1544; O3-LABEL: AtomicLoadNand32:
1545; O3:       # %bb.0: # %entry
1546; O3-NEXT:    lui $2, %hi(_gp_disp)
1547; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1548; O3-NEXT:    addu $1, $2, $25
1549; O3-NEXT:    lw $1, %got(x)($1)
1550; O3-NEXT:  $BB5_1: # %entry
1551; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1552; O3-NEXT:    ll $2, 0($1)
1553; O3-NEXT:    and $3, $2, $4
1554; O3-NEXT:    nor $3, $zero, $3
1555; O3-NEXT:    sc $3, 0($1)
1556; O3-NEXT:    beqz $3, $BB5_1
1557; O3-NEXT:    nop
1558; O3-NEXT:  # %bb.2: # %entry
1559; O3-NEXT:    jr $ra
1560; O3-NEXT:    nop
1561;
1562; MIPS32EB-LABEL: AtomicLoadNand32:
1563; MIPS32EB:       # %bb.0: # %entry
1564; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1565; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1566; MIPS32EB-NEXT:    addu $1, $2, $25
1567; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1568; MIPS32EB-NEXT:  $BB5_1: # %entry
1569; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1570; MIPS32EB-NEXT:    ll $2, 0($1)
1571; MIPS32EB-NEXT:    and $3, $2, $4
1572; MIPS32EB-NEXT:    nor $3, $zero, $3
1573; MIPS32EB-NEXT:    sc $3, 0($1)
1574; MIPS32EB-NEXT:    beqz $3, $BB5_1
1575; MIPS32EB-NEXT:    nop
1576; MIPS32EB-NEXT:  # %bb.2: # %entry
1577; MIPS32EB-NEXT:    jr $ra
1578; MIPS32EB-NEXT:    nop
1579entry:
1580  %0 = atomicrmw nand ptr @x, i32 %incr monotonic
1581  ret i32 %0
1582
1583}
1584
1585define i32 @AtomicSwap32(i32 signext %newval) nounwind {
1586; MIPS32-LABEL: AtomicSwap32:
1587; MIPS32:       # %bb.0: # %entry
1588; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1589; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1590; MIPS32-NEXT:    addiu $sp, $sp, -8
1591; MIPS32-NEXT:    addu $1, $2, $25
1592; MIPS32-NEXT:    sw $4, 4($sp)
1593; MIPS32-NEXT:    lw $1, %got(x)($1)
1594; MIPS32-NEXT:  $BB6_1: # %entry
1595; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1596; MIPS32-NEXT:    ll $2, 0($1)
1597; MIPS32-NEXT:    move $3, $4
1598; MIPS32-NEXT:    sc $3, 0($1)
1599; MIPS32-NEXT:    beqz $3, $BB6_1
1600; MIPS32-NEXT:    nop
1601; MIPS32-NEXT:  # %bb.2: # %entry
1602; MIPS32-NEXT:    jr $ra
1603; MIPS32-NEXT:    addiu $sp, $sp, 8
1604;
1605; MIPS32O0-LABEL: AtomicSwap32:
1606; MIPS32O0:       # %bb.0: # %entry
1607; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1608; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1609; MIPS32O0-NEXT:    addiu $sp, $sp, -8
1610; MIPS32O0-NEXT:    addu $1, $2, $25
1611; MIPS32O0-NEXT:    sw $4, 4($sp)
1612; MIPS32O0-NEXT:    lw $4, 4($sp)
1613; MIPS32O0-NEXT:    lw $3, %got(x)($1)
1614; MIPS32O0-NEXT:  $BB6_1: # %entry
1615; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1616; MIPS32O0-NEXT:    ll $2, 0($3)
1617; MIPS32O0-NEXT:    move $1, $4
1618; MIPS32O0-NEXT:    sc $1, 0($3)
1619; MIPS32O0-NEXT:    beqz $1, $BB6_1
1620; MIPS32O0-NEXT:    nop
1621; MIPS32O0-NEXT:  # %bb.2: # %entry
1622; MIPS32O0-NEXT:    addiu $sp, $sp, 8
1623; MIPS32O0-NEXT:    jr $ra
1624; MIPS32O0-NEXT:    nop
1625;
1626; MIPS32R2-LABEL: AtomicSwap32:
1627; MIPS32R2:       # %bb.0: # %entry
1628; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1629; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1630; MIPS32R2-NEXT:    addiu $sp, $sp, -8
1631; MIPS32R2-NEXT:    addu $1, $2, $25
1632; MIPS32R2-NEXT:    sw $4, 4($sp)
1633; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1634; MIPS32R2-NEXT:  $BB6_1: # %entry
1635; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1636; MIPS32R2-NEXT:    ll $2, 0($1)
1637; MIPS32R2-NEXT:    move $3, $4
1638; MIPS32R2-NEXT:    sc $3, 0($1)
1639; MIPS32R2-NEXT:    beqz $3, $BB6_1
1640; MIPS32R2-NEXT:    nop
1641; MIPS32R2-NEXT:  # %bb.2: # %entry
1642; MIPS32R2-NEXT:    jr $ra
1643; MIPS32R2-NEXT:    addiu $sp, $sp, 8
1644;
1645; MIPS32R6-LABEL: AtomicSwap32:
1646; MIPS32R6:       # %bb.0: # %entry
1647; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1648; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1649; MIPS32R6-NEXT:    addiu $sp, $sp, -8
1650; MIPS32R6-NEXT:    addu $1, $2, $25
1651; MIPS32R6-NEXT:    sw $4, 4($sp)
1652; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1653; MIPS32R6-NEXT:  $BB6_1: # %entry
1654; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1655; MIPS32R6-NEXT:    ll $2, 0($1)
1656; MIPS32R6-NEXT:    move $3, $4
1657; MIPS32R6-NEXT:    sc $3, 0($1)
1658; MIPS32R6-NEXT:    beqzc $3, $BB6_1
1659; MIPS32R6-NEXT:    nop
1660; MIPS32R6-NEXT:  # %bb.2: # %entry
1661; MIPS32R6-NEXT:    jr $ra
1662; MIPS32R6-NEXT:    addiu $sp, $sp, 8
1663;
1664; MIPS32R6O0-LABEL: AtomicSwap32:
1665; MIPS32R6O0:       # %bb.0: # %entry
1666; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1667; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1668; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
1669; MIPS32R6O0-NEXT:    addu $1, $2, $25
1670; MIPS32R6O0-NEXT:    sw $4, 4($sp)
1671; MIPS32R6O0-NEXT:    lw $4, 4($sp)
1672; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
1673; MIPS32R6O0-NEXT:  $BB6_1: # %entry
1674; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1675; MIPS32R6O0-NEXT:    ll $2, 0($3)
1676; MIPS32R6O0-NEXT:    move $1, $4
1677; MIPS32R6O0-NEXT:    sc $1, 0($3)
1678; MIPS32R6O0-NEXT:    beqzc $1, $BB6_1
1679; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1680; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
1681; MIPS32R6O0-NEXT:    jrc $ra
1682;
1683; MIPS4-LABEL: AtomicSwap32:
1684; MIPS4:       # %bb.0: # %entry
1685; MIPS4-NEXT:    daddiu $sp, $sp, -16
1686; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1687; MIPS4-NEXT:    daddu $1, $1, $25
1688; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1689; MIPS4-NEXT:    sw $4, 12($sp)
1690; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1691; MIPS4-NEXT:  .LBB6_1: # %entry
1692; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1693; MIPS4-NEXT:    ll $2, 0($1)
1694; MIPS4-NEXT:    move $3, $4
1695; MIPS4-NEXT:    sc $3, 0($1)
1696; MIPS4-NEXT:    beqz $3, .LBB6_1
1697; MIPS4-NEXT:    nop
1698; MIPS4-NEXT:  # %bb.2: # %entry
1699; MIPS4-NEXT:    jr $ra
1700; MIPS4-NEXT:    daddiu $sp, $sp, 16
1701;
1702; MIPS64-LABEL: AtomicSwap32:
1703; MIPS64:       # %bb.0: # %entry
1704; MIPS64-NEXT:    daddiu $sp, $sp, -16
1705; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1706; MIPS64-NEXT:    daddu $1, $1, $25
1707; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1708; MIPS64-NEXT:    sw $4, 12($sp)
1709; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1710; MIPS64-NEXT:  .LBB6_1: # %entry
1711; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1712; MIPS64-NEXT:    ll $2, 0($1)
1713; MIPS64-NEXT:    move $3, $4
1714; MIPS64-NEXT:    sc $3, 0($1)
1715; MIPS64-NEXT:    beqz $3, .LBB6_1
1716; MIPS64-NEXT:    nop
1717; MIPS64-NEXT:  # %bb.2: # %entry
1718; MIPS64-NEXT:    jr $ra
1719; MIPS64-NEXT:    daddiu $sp, $sp, 16
1720;
1721; MIPS64R2-LABEL: AtomicSwap32:
1722; MIPS64R2:       # %bb.0: # %entry
1723; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
1724; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1725; MIPS64R2-NEXT:    daddu $1, $1, $25
1726; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1727; MIPS64R2-NEXT:    sw $4, 12($sp)
1728; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1729; MIPS64R2-NEXT:  .LBB6_1: # %entry
1730; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1731; MIPS64R2-NEXT:    ll $2, 0($1)
1732; MIPS64R2-NEXT:    move $3, $4
1733; MIPS64R2-NEXT:    sc $3, 0($1)
1734; MIPS64R2-NEXT:    beqz $3, .LBB6_1
1735; MIPS64R2-NEXT:    nop
1736; MIPS64R2-NEXT:  # %bb.2: # %entry
1737; MIPS64R2-NEXT:    jr $ra
1738; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
1739;
1740; MIPS64R6-LABEL: AtomicSwap32:
1741; MIPS64R6:       # %bb.0: # %entry
1742; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
1743; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1744; MIPS64R6-NEXT:    daddu $1, $1, $25
1745; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1746; MIPS64R6-NEXT:    sw $4, 12($sp)
1747; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1748; MIPS64R6-NEXT:  .LBB6_1: # %entry
1749; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1750; MIPS64R6-NEXT:    ll $2, 0($1)
1751; MIPS64R6-NEXT:    move $3, $4
1752; MIPS64R6-NEXT:    sc $3, 0($1)
1753; MIPS64R6-NEXT:    beqzc $3, .LBB6_1
1754; MIPS64R6-NEXT:    nop
1755; MIPS64R6-NEXT:  # %bb.2: # %entry
1756; MIPS64R6-NEXT:    jr $ra
1757; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
1758;
1759; MIPS64R6O0-LABEL: AtomicSwap32:
1760; MIPS64R6O0:       # %bb.0: # %entry
1761; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
1762; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1763; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1764; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1765; MIPS64R6O0-NEXT:    move $2, $4
1766; MIPS64R6O0-NEXT:    sw $2, 12($sp)
1767; MIPS64R6O0-NEXT:    lw $4, 12($sp)
1768; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
1769; MIPS64R6O0-NEXT:  .LBB6_1: # %entry
1770; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1771; MIPS64R6O0-NEXT:    ll $2, 0($3)
1772; MIPS64R6O0-NEXT:    move $1, $4
1773; MIPS64R6O0-NEXT:    sc $1, 0($3)
1774; MIPS64R6O0-NEXT:    beqzc $1, .LBB6_1
1775; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1776; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
1777; MIPS64R6O0-NEXT:    jrc $ra
1778;
1779; MM32-LABEL: AtomicSwap32:
1780; MM32:       # %bb.0: # %entry
1781; MM32-NEXT:    lui $2, %hi(_gp_disp)
1782; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1783; MM32-NEXT:    addiu $sp, $sp, -8
1784; MM32-NEXT:    addu $2, $2, $25
1785; MM32-NEXT:    sw $4, 4($sp)
1786; MM32-NEXT:    lw $1, %got(x)($2)
1787; MM32-NEXT:  $BB6_1: # %entry
1788; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1789; MM32-NEXT:    ll $2, 0($1)
1790; MM32-NEXT:    or $3, $4, $zero
1791; MM32-NEXT:    sc $3, 0($1)
1792; MM32-NEXT:    beqzc $3, $BB6_1
1793; MM32-NEXT:  # %bb.2: # %entry
1794; MM32-NEXT:    addiusp 8
1795; MM32-NEXT:    jrc $ra
1796;
1797; O1-LABEL: AtomicSwap32:
1798; O1:       # %bb.0: # %entry
1799; O1-NEXT:    lui $2, %hi(_gp_disp)
1800; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1801; O1-NEXT:    addiu $sp, $sp, -8
1802; O1-NEXT:    addu $1, $2, $25
1803; O1-NEXT:    sw $4, 4($sp)
1804; O1-NEXT:    lw $1, %got(x)($1)
1805; O1-NEXT:  $BB6_1: # %entry
1806; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1807; O1-NEXT:    ll $2, 0($1)
1808; O1-NEXT:    move $3, $4
1809; O1-NEXT:    sc $3, 0($1)
1810; O1-NEXT:    beqz $3, $BB6_1
1811; O1-NEXT:    nop
1812; O1-NEXT:  # %bb.2: # %entry
1813; O1-NEXT:    jr $ra
1814; O1-NEXT:    addiu $sp, $sp, 8
1815;
1816; O2-LABEL: AtomicSwap32:
1817; O2:       # %bb.0: # %entry
1818; O2-NEXT:    lui $2, %hi(_gp_disp)
1819; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1820; O2-NEXT:    addiu $sp, $sp, -8
1821; O2-NEXT:    addu $1, $2, $25
1822; O2-NEXT:    sw $4, 4($sp)
1823; O2-NEXT:    lw $1, %got(x)($1)
1824; O2-NEXT:  $BB6_1: # %entry
1825; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1826; O2-NEXT:    ll $2, 0($1)
1827; O2-NEXT:    move $3, $4
1828; O2-NEXT:    sc $3, 0($1)
1829; O2-NEXT:    beqz $3, $BB6_1
1830; O2-NEXT:    nop
1831; O2-NEXT:  # %bb.2: # %entry
1832; O2-NEXT:    jr $ra
1833; O2-NEXT:    addiu $sp, $sp, 8
1834;
1835; O3-LABEL: AtomicSwap32:
1836; O3:       # %bb.0: # %entry
1837; O3-NEXT:    lui $2, %hi(_gp_disp)
1838; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1839; O3-NEXT:    addiu $sp, $sp, -8
1840; O3-NEXT:    addu $1, $2, $25
1841; O3-NEXT:    sw $4, 4($sp)
1842; O3-NEXT:    lw $1, %got(x)($1)
1843; O3-NEXT:  $BB6_1: # %entry
1844; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1845; O3-NEXT:    ll $2, 0($1)
1846; O3-NEXT:    move $3, $4
1847; O3-NEXT:    sc $3, 0($1)
1848; O3-NEXT:    beqz $3, $BB6_1
1849; O3-NEXT:    nop
1850; O3-NEXT:  # %bb.2: # %entry
1851; O3-NEXT:    jr $ra
1852; O3-NEXT:    addiu $sp, $sp, 8
1853;
1854; MIPS32EB-LABEL: AtomicSwap32:
1855; MIPS32EB:       # %bb.0: # %entry
1856; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1857; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1858; MIPS32EB-NEXT:    addiu $sp, $sp, -8
1859; MIPS32EB-NEXT:    addu $1, $2, $25
1860; MIPS32EB-NEXT:    sw $4, 4($sp)
1861; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1862; MIPS32EB-NEXT:  $BB6_1: # %entry
1863; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1864; MIPS32EB-NEXT:    ll $2, 0($1)
1865; MIPS32EB-NEXT:    move $3, $4
1866; MIPS32EB-NEXT:    sc $3, 0($1)
1867; MIPS32EB-NEXT:    beqz $3, $BB6_1
1868; MIPS32EB-NEXT:    nop
1869; MIPS32EB-NEXT:  # %bb.2: # %entry
1870; MIPS32EB-NEXT:    jr $ra
1871; MIPS32EB-NEXT:    addiu $sp, $sp, 8
1872entry:
1873  %newval.addr = alloca i32, align 4
1874  store i32 %newval, ptr %newval.addr, align 4
1875  %tmp = load i32, ptr %newval.addr, align 4
1876  %0 = atomicrmw xchg ptr @x, i32 %tmp monotonic
1877  ret i32 %0
1878
1879}
1880
1881define i32 @AtomicCmpSwap32(i32 signext %oldval, i32 signext %newval) nounwind {
1882; MIPS32-LABEL: AtomicCmpSwap32:
1883; MIPS32:       # %bb.0: # %entry
1884; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1885; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1886; MIPS32-NEXT:    addiu $sp, $sp, -8
1887; MIPS32-NEXT:    addu $1, $2, $25
1888; MIPS32-NEXT:    sw $5, 4($sp)
1889; MIPS32-NEXT:    lw $1, %got(x)($1)
1890; MIPS32-NEXT:  $BB7_1: # %entry
1891; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1892; MIPS32-NEXT:    ll $2, 0($1)
1893; MIPS32-NEXT:    bne $2, $4, $BB7_3
1894; MIPS32-NEXT:    nop
1895; MIPS32-NEXT:  # %bb.2: # %entry
1896; MIPS32-NEXT:    # in Loop: Header=BB7_1 Depth=1
1897; MIPS32-NEXT:    move $3, $5
1898; MIPS32-NEXT:    sc $3, 0($1)
1899; MIPS32-NEXT:    beqz $3, $BB7_1
1900; MIPS32-NEXT:    nop
1901; MIPS32-NEXT:  $BB7_3: # %entry
1902; MIPS32-NEXT:    jr $ra
1903; MIPS32-NEXT:    addiu $sp, $sp, 8
1904;
1905; MIPS32O0-LABEL: AtomicCmpSwap32:
1906; MIPS32O0:       # %bb.0: # %entry
1907; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1908; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1909; MIPS32O0-NEXT:    addiu $sp, $sp, -8
1910; MIPS32O0-NEXT:    addu $1, $2, $25
1911; MIPS32O0-NEXT:    sw $5, 4($sp)
1912; MIPS32O0-NEXT:    lw $6, 4($sp)
1913; MIPS32O0-NEXT:    lw $3, %got(x)($1)
1914; MIPS32O0-NEXT:    move $5, $4
1915; MIPS32O0-NEXT:  $BB7_1: # %entry
1916; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1917; MIPS32O0-NEXT:    ll $2, 0($3)
1918; MIPS32O0-NEXT:    bne $2, $5, $BB7_3
1919; MIPS32O0-NEXT:    nop
1920; MIPS32O0-NEXT:  # %bb.2: # %entry
1921; MIPS32O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
1922; MIPS32O0-NEXT:    move $1, $6
1923; MIPS32O0-NEXT:    sc $1, 0($3)
1924; MIPS32O0-NEXT:    beqz $1, $BB7_1
1925; MIPS32O0-NEXT:    nop
1926; MIPS32O0-NEXT:  $BB7_3: # %entry
1927; MIPS32O0-NEXT:    xor $1, $2, $4
1928; MIPS32O0-NEXT:    sltiu $1, $1, 1
1929; MIPS32O0-NEXT:    addiu $sp, $sp, 8
1930; MIPS32O0-NEXT:    jr $ra
1931; MIPS32O0-NEXT:    nop
1932;
1933; MIPS32R2-LABEL: AtomicCmpSwap32:
1934; MIPS32R2:       # %bb.0: # %entry
1935; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1936; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1937; MIPS32R2-NEXT:    addiu $sp, $sp, -8
1938; MIPS32R2-NEXT:    addu $1, $2, $25
1939; MIPS32R2-NEXT:    sw $5, 4($sp)
1940; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1941; MIPS32R2-NEXT:  $BB7_1: # %entry
1942; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1943; MIPS32R2-NEXT:    ll $2, 0($1)
1944; MIPS32R2-NEXT:    bne $2, $4, $BB7_3
1945; MIPS32R2-NEXT:    nop
1946; MIPS32R2-NEXT:  # %bb.2: # %entry
1947; MIPS32R2-NEXT:    # in Loop: Header=BB7_1 Depth=1
1948; MIPS32R2-NEXT:    move $3, $5
1949; MIPS32R2-NEXT:    sc $3, 0($1)
1950; MIPS32R2-NEXT:    beqz $3, $BB7_1
1951; MIPS32R2-NEXT:    nop
1952; MIPS32R2-NEXT:  $BB7_3: # %entry
1953; MIPS32R2-NEXT:    jr $ra
1954; MIPS32R2-NEXT:    addiu $sp, $sp, 8
1955;
1956; MIPS32R6-LABEL: AtomicCmpSwap32:
1957; MIPS32R6:       # %bb.0: # %entry
1958; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1959; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1960; MIPS32R6-NEXT:    addiu $sp, $sp, -8
1961; MIPS32R6-NEXT:    addu $1, $2, $25
1962; MIPS32R6-NEXT:    sw $5, 4($sp)
1963; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1964; MIPS32R6-NEXT:  $BB7_1: # %entry
1965; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1966; MIPS32R6-NEXT:    ll $2, 0($1)
1967; MIPS32R6-NEXT:    bnec $2, $4, $BB7_3
1968; MIPS32R6-NEXT:  # %bb.2: # %entry
1969; MIPS32R6-NEXT:    # in Loop: Header=BB7_1 Depth=1
1970; MIPS32R6-NEXT:    move $3, $5
1971; MIPS32R6-NEXT:    sc $3, 0($1)
1972; MIPS32R6-NEXT:    beqzc $3, $BB7_1
1973; MIPS32R6-NEXT:    nop
1974; MIPS32R6-NEXT:  $BB7_3: # %entry
1975; MIPS32R6-NEXT:    jr $ra
1976; MIPS32R6-NEXT:    addiu $sp, $sp, 8
1977;
1978; MIPS32R6O0-LABEL: AtomicCmpSwap32:
1979; MIPS32R6O0:       # %bb.0: # %entry
1980; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1981; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1982; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
1983; MIPS32R6O0-NEXT:    addu $1, $2, $25
1984; MIPS32R6O0-NEXT:    sw $5, 4($sp)
1985; MIPS32R6O0-NEXT:    lw $5, 4($sp)
1986; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
1987; MIPS32R6O0-NEXT:  $BB7_1: # %entry
1988; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1989; MIPS32R6O0-NEXT:    ll $2, 0($3)
1990; MIPS32R6O0-NEXT:    bnec $2, $4, $BB7_3
1991; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1992; MIPS32R6O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
1993; MIPS32R6O0-NEXT:    move $1, $5
1994; MIPS32R6O0-NEXT:    sc $1, 0($3)
1995; MIPS32R6O0-NEXT:    beqzc $1, $BB7_1
1996; MIPS32R6O0-NEXT:  $BB7_3: # %entry
1997; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
1998; MIPS32R6O0-NEXT:    jrc $ra
1999;
2000; MIPS4-LABEL: AtomicCmpSwap32:
2001; MIPS4:       # %bb.0: # %entry
2002; MIPS4-NEXT:    daddiu $sp, $sp, -16
2003; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2004; MIPS4-NEXT:    daddu $1, $1, $25
2005; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2006; MIPS4-NEXT:    sw $5, 12($sp)
2007; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
2008; MIPS4-NEXT:  .LBB7_1: # %entry
2009; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2010; MIPS4-NEXT:    ll $2, 0($1)
2011; MIPS4-NEXT:    bne $2, $4, .LBB7_3
2012; MIPS4-NEXT:    nop
2013; MIPS4-NEXT:  # %bb.2: # %entry
2014; MIPS4-NEXT:    # in Loop: Header=BB7_1 Depth=1
2015; MIPS4-NEXT:    move $3, $5
2016; MIPS4-NEXT:    sc $3, 0($1)
2017; MIPS4-NEXT:    beqz $3, .LBB7_1
2018; MIPS4-NEXT:    nop
2019; MIPS4-NEXT:  .LBB7_3: # %entry
2020; MIPS4-NEXT:    jr $ra
2021; MIPS4-NEXT:    daddiu $sp, $sp, 16
2022;
2023; MIPS64-LABEL: AtomicCmpSwap32:
2024; MIPS64:       # %bb.0: # %entry
2025; MIPS64-NEXT:    daddiu $sp, $sp, -16
2026; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2027; MIPS64-NEXT:    daddu $1, $1, $25
2028; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2029; MIPS64-NEXT:    sw $5, 12($sp)
2030; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
2031; MIPS64-NEXT:  .LBB7_1: # %entry
2032; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2033; MIPS64-NEXT:    ll $2, 0($1)
2034; MIPS64-NEXT:    bne $2, $4, .LBB7_3
2035; MIPS64-NEXT:    nop
2036; MIPS64-NEXT:  # %bb.2: # %entry
2037; MIPS64-NEXT:    # in Loop: Header=BB7_1 Depth=1
2038; MIPS64-NEXT:    move $3, $5
2039; MIPS64-NEXT:    sc $3, 0($1)
2040; MIPS64-NEXT:    beqz $3, .LBB7_1
2041; MIPS64-NEXT:    nop
2042; MIPS64-NEXT:  .LBB7_3: # %entry
2043; MIPS64-NEXT:    jr $ra
2044; MIPS64-NEXT:    daddiu $sp, $sp, 16
2045;
2046; MIPS64R2-LABEL: AtomicCmpSwap32:
2047; MIPS64R2:       # %bb.0: # %entry
2048; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
2049; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2050; MIPS64R2-NEXT:    daddu $1, $1, $25
2051; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2052; MIPS64R2-NEXT:    sw $5, 12($sp)
2053; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
2054; MIPS64R2-NEXT:  .LBB7_1: # %entry
2055; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
2056; MIPS64R2-NEXT:    ll $2, 0($1)
2057; MIPS64R2-NEXT:    bne $2, $4, .LBB7_3
2058; MIPS64R2-NEXT:    nop
2059; MIPS64R2-NEXT:  # %bb.2: # %entry
2060; MIPS64R2-NEXT:    # in Loop: Header=BB7_1 Depth=1
2061; MIPS64R2-NEXT:    move $3, $5
2062; MIPS64R2-NEXT:    sc $3, 0($1)
2063; MIPS64R2-NEXT:    beqz $3, .LBB7_1
2064; MIPS64R2-NEXT:    nop
2065; MIPS64R2-NEXT:  .LBB7_3: # %entry
2066; MIPS64R2-NEXT:    jr $ra
2067; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
2068;
2069; MIPS64R6-LABEL: AtomicCmpSwap32:
2070; MIPS64R6:       # %bb.0: # %entry
2071; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
2072; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2073; MIPS64R6-NEXT:    daddu $1, $1, $25
2074; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2075; MIPS64R6-NEXT:    sw $5, 12($sp)
2076; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
2077; MIPS64R6-NEXT:  .LBB7_1: # %entry
2078; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
2079; MIPS64R6-NEXT:    ll $2, 0($1)
2080; MIPS64R6-NEXT:    bnec $2, $4, .LBB7_3
2081; MIPS64R6-NEXT:  # %bb.2: # %entry
2082; MIPS64R6-NEXT:    # in Loop: Header=BB7_1 Depth=1
2083; MIPS64R6-NEXT:    move $3, $5
2084; MIPS64R6-NEXT:    sc $3, 0($1)
2085; MIPS64R6-NEXT:    beqzc $3, .LBB7_1
2086; MIPS64R6-NEXT:    nop
2087; MIPS64R6-NEXT:  .LBB7_3: # %entry
2088; MIPS64R6-NEXT:    jr $ra
2089; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
2090;
2091; MIPS64R6O0-LABEL: AtomicCmpSwap32:
2092; MIPS64R6O0:       # %bb.0: # %entry
2093; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
2094; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2095; MIPS64R6O0-NEXT:    daddu $1, $1, $25
2096; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2097; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
2098; MIPS64R6O0-NEXT:    move $2, $5
2099; MIPS64R6O0-NEXT:    sw $2, 12($sp)
2100; MIPS64R6O0-NEXT:    lw $5, 12($sp)
2101; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
2102; MIPS64R6O0-NEXT:  .LBB7_1: # %entry
2103; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2104; MIPS64R6O0-NEXT:    ll $2, 0($3)
2105; MIPS64R6O0-NEXT:    bnec $2, $4, .LBB7_3
2106; MIPS64R6O0-NEXT:  # %bb.2: # %entry
2107; MIPS64R6O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
2108; MIPS64R6O0-NEXT:    move $1, $5
2109; MIPS64R6O0-NEXT:    sc $1, 0($3)
2110; MIPS64R6O0-NEXT:    beqzc $1, .LBB7_1
2111; MIPS64R6O0-NEXT:  .LBB7_3: # %entry
2112; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
2113; MIPS64R6O0-NEXT:    jrc $ra
2114;
2115; MM32-LABEL: AtomicCmpSwap32:
2116; MM32:       # %bb.0: # %entry
2117; MM32-NEXT:    lui $2, %hi(_gp_disp)
2118; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2119; MM32-NEXT:    addiu $sp, $sp, -8
2120; MM32-NEXT:    addu $2, $2, $25
2121; MM32-NEXT:    sw $5, 4($sp)
2122; MM32-NEXT:    lw $1, %got(x)($2)
2123; MM32-NEXT:  $BB7_1: # %entry
2124; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
2125; MM32-NEXT:    ll $2, 0($1)
2126; MM32-NEXT:    bne $2, $4, $BB7_3
2127; MM32-NEXT:    nop
2128; MM32-NEXT:  # %bb.2: # %entry
2129; MM32-NEXT:    # in Loop: Header=BB7_1 Depth=1
2130; MM32-NEXT:    move $3, $5
2131; MM32-NEXT:    sc $3, 0($1)
2132; MM32-NEXT:    beqzc $3, $BB7_1
2133; MM32-NEXT:  $BB7_3: # %entry
2134; MM32-NEXT:    addiusp 8
2135; MM32-NEXT:    jrc $ra
2136;
2137; O1-LABEL: AtomicCmpSwap32:
2138; O1:       # %bb.0: # %entry
2139; O1-NEXT:    lui $2, %hi(_gp_disp)
2140; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
2141; O1-NEXT:    addiu $sp, $sp, -8
2142; O1-NEXT:    addu $1, $2, $25
2143; O1-NEXT:    sw $5, 4($sp)
2144; O1-NEXT:    lw $1, %got(x)($1)
2145; O1-NEXT:  $BB7_1: # %entry
2146; O1-NEXT:    # =>This Inner Loop Header: Depth=1
2147; O1-NEXT:    ll $2, 0($1)
2148; O1-NEXT:    bne $2, $4, $BB7_3
2149; O1-NEXT:    nop
2150; O1-NEXT:  # %bb.2: # %entry
2151; O1-NEXT:    # in Loop: Header=BB7_1 Depth=1
2152; O1-NEXT:    move $3, $5
2153; O1-NEXT:    sc $3, 0($1)
2154; O1-NEXT:    beqz $3, $BB7_1
2155; O1-NEXT:    nop
2156; O1-NEXT:  $BB7_3: # %entry
2157; O1-NEXT:    jr $ra
2158; O1-NEXT:    addiu $sp, $sp, 8
2159;
2160; O2-LABEL: AtomicCmpSwap32:
2161; O2:       # %bb.0: # %entry
2162; O2-NEXT:    lui $2, %hi(_gp_disp)
2163; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2164; O2-NEXT:    addiu $sp, $sp, -8
2165; O2-NEXT:    addu $1, $2, $25
2166; O2-NEXT:    sw $5, 4($sp)
2167; O2-NEXT:    lw $1, %got(x)($1)
2168; O2-NEXT:  $BB7_1: # %entry
2169; O2-NEXT:    # =>This Inner Loop Header: Depth=1
2170; O2-NEXT:    ll $2, 0($1)
2171; O2-NEXT:    bne $2, $4, $BB7_3
2172; O2-NEXT:    nop
2173; O2-NEXT:  # %bb.2: # %entry
2174; O2-NEXT:    # in Loop: Header=BB7_1 Depth=1
2175; O2-NEXT:    move $3, $5
2176; O2-NEXT:    sc $3, 0($1)
2177; O2-NEXT:    beqz $3, $BB7_1
2178; O2-NEXT:    nop
2179; O2-NEXT:  $BB7_3: # %entry
2180; O2-NEXT:    jr $ra
2181; O2-NEXT:    addiu $sp, $sp, 8
2182;
2183; O3-LABEL: AtomicCmpSwap32:
2184; O3:       # %bb.0: # %entry
2185; O3-NEXT:    lui $2, %hi(_gp_disp)
2186; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
2187; O3-NEXT:    addiu $sp, $sp, -8
2188; O3-NEXT:    addu $1, $2, $25
2189; O3-NEXT:    sw $5, 4($sp)
2190; O3-NEXT:    lw $1, %got(x)($1)
2191; O3-NEXT:  $BB7_1: # %entry
2192; O3-NEXT:    # =>This Inner Loop Header: Depth=1
2193; O3-NEXT:    ll $2, 0($1)
2194; O3-NEXT:    bne $2, $4, $BB7_3
2195; O3-NEXT:    nop
2196; O3-NEXT:  # %bb.2: # %entry
2197; O3-NEXT:    # in Loop: Header=BB7_1 Depth=1
2198; O3-NEXT:    move $3, $5
2199; O3-NEXT:    sc $3, 0($1)
2200; O3-NEXT:    beqz $3, $BB7_1
2201; O3-NEXT:    nop
2202; O3-NEXT:  $BB7_3: # %entry
2203; O3-NEXT:    jr $ra
2204; O3-NEXT:    addiu $sp, $sp, 8
2205;
2206; MIPS32EB-LABEL: AtomicCmpSwap32:
2207; MIPS32EB:       # %bb.0: # %entry
2208; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
2209; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
2210; MIPS32EB-NEXT:    addiu $sp, $sp, -8
2211; MIPS32EB-NEXT:    addu $1, $2, $25
2212; MIPS32EB-NEXT:    sw $5, 4($sp)
2213; MIPS32EB-NEXT:    lw $1, %got(x)($1)
2214; MIPS32EB-NEXT:  $BB7_1: # %entry
2215; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
2216; MIPS32EB-NEXT:    ll $2, 0($1)
2217; MIPS32EB-NEXT:    bne $2, $4, $BB7_3
2218; MIPS32EB-NEXT:    nop
2219; MIPS32EB-NEXT:  # %bb.2: # %entry
2220; MIPS32EB-NEXT:    # in Loop: Header=BB7_1 Depth=1
2221; MIPS32EB-NEXT:    move $3, $5
2222; MIPS32EB-NEXT:    sc $3, 0($1)
2223; MIPS32EB-NEXT:    beqz $3, $BB7_1
2224; MIPS32EB-NEXT:    nop
2225; MIPS32EB-NEXT:  $BB7_3: # %entry
2226; MIPS32EB-NEXT:    jr $ra
2227; MIPS32EB-NEXT:    addiu $sp, $sp, 8
2228entry:
2229  %newval.addr = alloca i32, align 4
2230  store i32 %newval, ptr %newval.addr, align 4
2231  %tmp = load i32, ptr %newval.addr, align 4
2232  %0 = cmpxchg ptr @x, i32 %oldval, i32 %tmp monotonic monotonic
2233  %1 = extractvalue { i32, i1 } %0, 0
2234  ret i32 %1
2235
2236}
2237
2238@y = common global i8 0, align 1
2239
2240define signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind {
2241; MIPS32-LABEL: AtomicLoadAdd8:
2242; MIPS32:       # %bb.0: # %entry
2243; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
2244; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2245; MIPS32-NEXT:    addu $1, $2, $25
2246; MIPS32-NEXT:    lw $1, %got(y)($1)
2247; MIPS32-NEXT:    addiu $2, $zero, -4
2248; MIPS32-NEXT:    and $3, $1, $2
2249; MIPS32-NEXT:    andi $1, $1, 3
2250; MIPS32-NEXT:    sll $1, $1, 3
2251; MIPS32-NEXT:    ori $2, $zero, 255
2252; MIPS32-NEXT:    sllv $5, $2, $1
2253; MIPS32-NEXT:    nor $6, $zero, $5
2254; MIPS32-NEXT:    sllv $4, $4, $1
2255; MIPS32-NEXT:  $BB8_1: # %entry
2256; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
2257; MIPS32-NEXT:    ll $7, 0($3)
2258; MIPS32-NEXT:    addu $8, $7, $4
2259; MIPS32-NEXT:    and $8, $8, $5
2260; MIPS32-NEXT:    and $9, $7, $6
2261; MIPS32-NEXT:    or $9, $9, $8
2262; MIPS32-NEXT:    sc $9, 0($3)
2263; MIPS32-NEXT:    beqz $9, $BB8_1
2264; MIPS32-NEXT:    nop
2265; MIPS32-NEXT:  # %bb.2: # %entry
2266; MIPS32-NEXT:    and $2, $7, $5
2267; MIPS32-NEXT:    srlv $2, $2, $1
2268; MIPS32-NEXT:    sll $2, $2, 24
2269; MIPS32-NEXT:    sra $2, $2, 24
2270; MIPS32-NEXT:  # %bb.3: # %entry
2271; MIPS32-NEXT:    jr $ra
2272; MIPS32-NEXT:    nop
2273;
2274; MIPS32O0-LABEL: AtomicLoadAdd8:
2275; MIPS32O0:       # %bb.0: # %entry
2276; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
2277; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2278; MIPS32O0-NEXT:    addiu $sp, $sp, -8
2279; MIPS32O0-NEXT:    addu $1, $2, $25
2280; MIPS32O0-NEXT:    lw $1, %got(y)($1)
2281; MIPS32O0-NEXT:    addiu $2, $zero, -4
2282; MIPS32O0-NEXT:    and $5, $1, $2
2283; MIPS32O0-NEXT:    andi $1, $1, 3
2284; MIPS32O0-NEXT:    sll $9, $1, 3
2285; MIPS32O0-NEXT:    ori $1, $zero, 255
2286; MIPS32O0-NEXT:    sllv $7, $1, $9
2287; MIPS32O0-NEXT:    nor $8, $zero, $7
2288; MIPS32O0-NEXT:    sllv $6, $4, $9
2289; MIPS32O0-NEXT:  $BB8_1: # %entry
2290; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
2291; MIPS32O0-NEXT:    ll $2, 0($5)
2292; MIPS32O0-NEXT:    addu $3, $2, $6
2293; MIPS32O0-NEXT:    and $3, $3, $7
2294; MIPS32O0-NEXT:    and $4, $2, $8
2295; MIPS32O0-NEXT:    or $4, $4, $3
2296; MIPS32O0-NEXT:    sc $4, 0($5)
2297; MIPS32O0-NEXT:    beqz $4, $BB8_1
2298; MIPS32O0-NEXT:    nop
2299; MIPS32O0-NEXT:  # %bb.2: # %entry
2300; MIPS32O0-NEXT:    and $1, $2, $7
2301; MIPS32O0-NEXT:    srlv $1, $1, $9
2302; MIPS32O0-NEXT:    sll $1, $1, 24
2303; MIPS32O0-NEXT:    sra $1, $1, 24
2304; MIPS32O0-NEXT:  # %bb.3: # %entry
2305; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
2306; MIPS32O0-NEXT:  # %bb.4: # %entry
2307; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2308; MIPS32O0-NEXT:    sll $1, $1, 24
2309; MIPS32O0-NEXT:    sra $2, $1, 24
2310; MIPS32O0-NEXT:    addiu $sp, $sp, 8
2311; MIPS32O0-NEXT:    jr $ra
2312; MIPS32O0-NEXT:    nop
2313;
2314; MIPS32R2-LABEL: AtomicLoadAdd8:
2315; MIPS32R2:       # %bb.0: # %entry
2316; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
2317; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2318; MIPS32R2-NEXT:    addu $1, $2, $25
2319; MIPS32R2-NEXT:    lw $1, %got(y)($1)
2320; MIPS32R2-NEXT:    addiu $2, $zero, -4
2321; MIPS32R2-NEXT:    and $3, $1, $2
2322; MIPS32R2-NEXT:    andi $1, $1, 3
2323; MIPS32R2-NEXT:    sll $1, $1, 3
2324; MIPS32R2-NEXT:    ori $2, $zero, 255
2325; MIPS32R2-NEXT:    sllv $5, $2, $1
2326; MIPS32R2-NEXT:    nor $6, $zero, $5
2327; MIPS32R2-NEXT:    sllv $4, $4, $1
2328; MIPS32R2-NEXT:  $BB8_1: # %entry
2329; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
2330; MIPS32R2-NEXT:    ll $7, 0($3)
2331; MIPS32R2-NEXT:    addu $8, $7, $4
2332; MIPS32R2-NEXT:    and $8, $8, $5
2333; MIPS32R2-NEXT:    and $9, $7, $6
2334; MIPS32R2-NEXT:    or $9, $9, $8
2335; MIPS32R2-NEXT:    sc $9, 0($3)
2336; MIPS32R2-NEXT:    beqz $9, $BB8_1
2337; MIPS32R2-NEXT:    nop
2338; MIPS32R2-NEXT:  # %bb.2: # %entry
2339; MIPS32R2-NEXT:    and $2, $7, $5
2340; MIPS32R2-NEXT:    srlv $2, $2, $1
2341; MIPS32R2-NEXT:    seb $2, $2
2342; MIPS32R2-NEXT:  # %bb.3: # %entry
2343; MIPS32R2-NEXT:    jr $ra
2344; MIPS32R2-NEXT:    nop
2345;
2346; MIPS32R6-LABEL: AtomicLoadAdd8:
2347; MIPS32R6:       # %bb.0: # %entry
2348; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
2349; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
2350; MIPS32R6-NEXT:    addu $1, $2, $25
2351; MIPS32R6-NEXT:    lw $1, %got(y)($1)
2352; MIPS32R6-NEXT:    addiu $2, $zero, -4
2353; MIPS32R6-NEXT:    and $3, $1, $2
2354; MIPS32R6-NEXT:    andi $1, $1, 3
2355; MIPS32R6-NEXT:    sll $1, $1, 3
2356; MIPS32R6-NEXT:    ori $2, $zero, 255
2357; MIPS32R6-NEXT:    sllv $5, $2, $1
2358; MIPS32R6-NEXT:    nor $6, $zero, $5
2359; MIPS32R6-NEXT:    sllv $4, $4, $1
2360; MIPS32R6-NEXT:  $BB8_1: # %entry
2361; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
2362; MIPS32R6-NEXT:    ll $7, 0($3)
2363; MIPS32R6-NEXT:    addu $8, $7, $4
2364; MIPS32R6-NEXT:    and $8, $8, $5
2365; MIPS32R6-NEXT:    and $9, $7, $6
2366; MIPS32R6-NEXT:    or $9, $9, $8
2367; MIPS32R6-NEXT:    sc $9, 0($3)
2368; MIPS32R6-NEXT:    beqzc $9, $BB8_1
2369; MIPS32R6-NEXT:  # %bb.2: # %entry
2370; MIPS32R6-NEXT:    and $2, $7, $5
2371; MIPS32R6-NEXT:    srlv $2, $2, $1
2372; MIPS32R6-NEXT:    seb $2, $2
2373; MIPS32R6-NEXT:  # %bb.3: # %entry
2374; MIPS32R6-NEXT:    jrc $ra
2375;
2376; MIPS32R6O0-LABEL: AtomicLoadAdd8:
2377; MIPS32R6O0:       # %bb.0: # %entry
2378; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
2379; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2380; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
2381; MIPS32R6O0-NEXT:    addu $1, $2, $25
2382; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a0
2383; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
2384; MIPS32R6O0-NEXT:    addiu $2, $zero, -4
2385; MIPS32R6O0-NEXT:    and $5, $1, $2
2386; MIPS32R6O0-NEXT:    andi $1, $1, 3
2387; MIPS32R6O0-NEXT:    sll $9, $1, 3
2388; MIPS32R6O0-NEXT:    ori $1, $zero, 255
2389; MIPS32R6O0-NEXT:    sllv $7, $1, $9
2390; MIPS32R6O0-NEXT:    nor $8, $zero, $7
2391; MIPS32R6O0-NEXT:    sllv $6, $4, $9
2392; MIPS32R6O0-NEXT:  $BB8_1: # %entry
2393; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2394; MIPS32R6O0-NEXT:    ll $2, 0($5)
2395; MIPS32R6O0-NEXT:    addu $3, $2, $6
2396; MIPS32R6O0-NEXT:    and $3, $3, $7
2397; MIPS32R6O0-NEXT:    and $4, $2, $8
2398; MIPS32R6O0-NEXT:    or $4, $4, $3
2399; MIPS32R6O0-NEXT:    sc $4, 0($5)
2400; MIPS32R6O0-NEXT:    beqzc $4, $BB8_1
2401; MIPS32R6O0-NEXT:  # %bb.2: # %entry
2402; MIPS32R6O0-NEXT:    and $1, $2, $7
2403; MIPS32R6O0-NEXT:    srlv $1, $1, $9
2404; MIPS32R6O0-NEXT:    seb $1, $1
2405; MIPS32R6O0-NEXT:  # %bb.3: # %entry
2406; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
2407; MIPS32R6O0-NEXT:  # %bb.4: # %entry
2408; MIPS32R6O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
2409; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
2410; MIPS32R6O0-NEXT:    jrc $ra
2411;
2412; MIPS4-LABEL: AtomicLoadAdd8:
2413; MIPS4:       # %bb.0: # %entry
2414; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2415; MIPS4-NEXT:    daddu $1, $1, $25
2416; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2417; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
2418; MIPS4-NEXT:    daddiu $2, $zero, -4
2419; MIPS4-NEXT:    and $3, $1, $2
2420; MIPS4-NEXT:    andi $1, $1, 3
2421; MIPS4-NEXT:    sll $1, $1, 3
2422; MIPS4-NEXT:    ori $2, $zero, 255
2423; MIPS4-NEXT:    sllv $5, $2, $1
2424; MIPS4-NEXT:    nor $6, $zero, $5
2425; MIPS4-NEXT:    sllv $4, $4, $1
2426; MIPS4-NEXT:  .LBB8_1: # %entry
2427; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2428; MIPS4-NEXT:    ll $7, 0($3)
2429; MIPS4-NEXT:    addu $8, $7, $4
2430; MIPS4-NEXT:    and $8, $8, $5
2431; MIPS4-NEXT:    and $9, $7, $6
2432; MIPS4-NEXT:    or $9, $9, $8
2433; MIPS4-NEXT:    sc $9, 0($3)
2434; MIPS4-NEXT:    beqz $9, .LBB8_1
2435; MIPS4-NEXT:    nop
2436; MIPS4-NEXT:  # %bb.2: # %entry
2437; MIPS4-NEXT:    and $2, $7, $5
2438; MIPS4-NEXT:    srlv $2, $2, $1
2439; MIPS4-NEXT:    sll $2, $2, 24
2440; MIPS4-NEXT:    sra $2, $2, 24
2441; MIPS4-NEXT:  # %bb.3: # %entry
2442; MIPS4-NEXT:    jr $ra
2443; MIPS4-NEXT:    nop
2444;
2445; MIPS64-LABEL: AtomicLoadAdd8:
2446; MIPS64:       # %bb.0: # %entry
2447; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2448; MIPS64-NEXT:    daddu $1, $1, $25
2449; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2450; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
2451; MIPS64-NEXT:    daddiu $2, $zero, -4
2452; MIPS64-NEXT:    and $3, $1, $2
2453; MIPS64-NEXT:    andi $1, $1, 3
2454; MIPS64-NEXT:    sll $1, $1, 3
2455; MIPS64-NEXT:    ori $2, $zero, 255
2456; MIPS64-NEXT:    sllv $5, $2, $1
2457; MIPS64-NEXT:    nor $6, $zero, $5
2458; MIPS64-NEXT:    sllv $4, $4, $1
2459; MIPS64-NEXT:  .LBB8_1: # %entry
2460; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2461; MIPS64-NEXT:    ll $7, 0($3)
2462; MIPS64-NEXT:    addu $8, $7, $4
2463; MIPS64-NEXT:    and $8, $8, $5
2464; MIPS64-NEXT:    and $9, $7, $6
2465; MIPS64-NEXT:    or $9, $9, $8
2466; MIPS64-NEXT:    sc $9, 0($3)
2467; MIPS64-NEXT:    beqz $9, .LBB8_1
2468; MIPS64-NEXT:    nop
2469; MIPS64-NEXT:  # %bb.2: # %entry
2470; MIPS64-NEXT:    and $2, $7, $5
2471; MIPS64-NEXT:    srlv $2, $2, $1
2472; MIPS64-NEXT:    sll $2, $2, 24
2473; MIPS64-NEXT:    sra $2, $2, 24
2474; MIPS64-NEXT:  # %bb.3: # %entry
2475; MIPS64-NEXT:    jr $ra
2476; MIPS64-NEXT:    nop
2477;
2478; MIPS64R2-LABEL: AtomicLoadAdd8:
2479; MIPS64R2:       # %bb.0: # %entry
2480; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2481; MIPS64R2-NEXT:    daddu $1, $1, $25
2482; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2483; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
2484; MIPS64R2-NEXT:    daddiu $2, $zero, -4
2485; MIPS64R2-NEXT:    and $3, $1, $2
2486; MIPS64R2-NEXT:    andi $1, $1, 3
2487; MIPS64R2-NEXT:    sll $1, $1, 3
2488; MIPS64R2-NEXT:    ori $2, $zero, 255
2489; MIPS64R2-NEXT:    sllv $5, $2, $1
2490; MIPS64R2-NEXT:    nor $6, $zero, $5
2491; MIPS64R2-NEXT:    sllv $4, $4, $1
2492; MIPS64R2-NEXT:  .LBB8_1: # %entry
2493; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
2494; MIPS64R2-NEXT:    ll $7, 0($3)
2495; MIPS64R2-NEXT:    addu $8, $7, $4
2496; MIPS64R2-NEXT:    and $8, $8, $5
2497; MIPS64R2-NEXT:    and $9, $7, $6
2498; MIPS64R2-NEXT:    or $9, $9, $8
2499; MIPS64R2-NEXT:    sc $9, 0($3)
2500; MIPS64R2-NEXT:    beqz $9, .LBB8_1
2501; MIPS64R2-NEXT:    nop
2502; MIPS64R2-NEXT:  # %bb.2: # %entry
2503; MIPS64R2-NEXT:    and $2, $7, $5
2504; MIPS64R2-NEXT:    srlv $2, $2, $1
2505; MIPS64R2-NEXT:    seb $2, $2
2506; MIPS64R2-NEXT:  # %bb.3: # %entry
2507; MIPS64R2-NEXT:    jr $ra
2508; MIPS64R2-NEXT:    nop
2509;
2510; MIPS64R6-LABEL: AtomicLoadAdd8:
2511; MIPS64R6:       # %bb.0: # %entry
2512; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2513; MIPS64R6-NEXT:    daddu $1, $1, $25
2514; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2515; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
2516; MIPS64R6-NEXT:    daddiu $2, $zero, -4
2517; MIPS64R6-NEXT:    and $3, $1, $2
2518; MIPS64R6-NEXT:    andi $1, $1, 3
2519; MIPS64R6-NEXT:    sll $1, $1, 3
2520; MIPS64R6-NEXT:    ori $2, $zero, 255
2521; MIPS64R6-NEXT:    sllv $5, $2, $1
2522; MIPS64R6-NEXT:    nor $6, $zero, $5
2523; MIPS64R6-NEXT:    sllv $4, $4, $1
2524; MIPS64R6-NEXT:  .LBB8_1: # %entry
2525; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
2526; MIPS64R6-NEXT:    ll $7, 0($3)
2527; MIPS64R6-NEXT:    addu $8, $7, $4
2528; MIPS64R6-NEXT:    and $8, $8, $5
2529; MIPS64R6-NEXT:    and $9, $7, $6
2530; MIPS64R6-NEXT:    or $9, $9, $8
2531; MIPS64R6-NEXT:    sc $9, 0($3)
2532; MIPS64R6-NEXT:    beqzc $9, .LBB8_1
2533; MIPS64R6-NEXT:  # %bb.2: # %entry
2534; MIPS64R6-NEXT:    and $2, $7, $5
2535; MIPS64R6-NEXT:    srlv $2, $2, $1
2536; MIPS64R6-NEXT:    seb $2, $2
2537; MIPS64R6-NEXT:  # %bb.3: # %entry
2538; MIPS64R6-NEXT:    jrc $ra
2539;
2540; MIPS64R6O0-LABEL: AtomicLoadAdd8:
2541; MIPS64R6O0:       # %bb.0: # %entry
2542; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
2543; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2544; MIPS64R6O0-NEXT:    daddu $1, $1, $25
2545; MIPS64R6O0-NEXT:    daddiu $2, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2546; MIPS64R6O0-NEXT:    move $1, $4
2547; MIPS64R6O0-NEXT:    ld $2, %got_disp(y)($2)
2548; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
2549; MIPS64R6O0-NEXT:    and $5, $2, $3
2550; MIPS64R6O0-NEXT:    andi $2, $2, 3
2551; MIPS64R6O0-NEXT:    xori $2, $2, 3
2552; MIPS64R6O0-NEXT:    sll $9, $2, 3
2553; MIPS64R6O0-NEXT:    ori $2, $zero, 255
2554; MIPS64R6O0-NEXT:    sllv $7, $2, $9
2555; MIPS64R6O0-NEXT:    nor $8, $zero, $7
2556; MIPS64R6O0-NEXT:    sllv $6, $1, $9
2557; MIPS64R6O0-NEXT:  .LBB8_1: # %entry
2558; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2559; MIPS64R6O0-NEXT:    ll $2, 0($5)
2560; MIPS64R6O0-NEXT:    addu $3, $2, $6
2561; MIPS64R6O0-NEXT:    and $3, $3, $7
2562; MIPS64R6O0-NEXT:    and $4, $2, $8
2563; MIPS64R6O0-NEXT:    or $4, $4, $3
2564; MIPS64R6O0-NEXT:    sc $4, 0($5)
2565; MIPS64R6O0-NEXT:    beqzc $4, .LBB8_1
2566; MIPS64R6O0-NEXT:  # %bb.2: # %entry
2567; MIPS64R6O0-NEXT:    and $1, $2, $7
2568; MIPS64R6O0-NEXT:    srlv $1, $1, $9
2569; MIPS64R6O0-NEXT:    seb $1, $1
2570; MIPS64R6O0-NEXT:  # %bb.3: # %entry
2571; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
2572; MIPS64R6O0-NEXT:  # %bb.4: # %entry
2573; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
2574; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
2575; MIPS64R6O0-NEXT:    jrc $ra
2576;
2577; MM32-LABEL: AtomicLoadAdd8:
2578; MM32:       # %bb.0: # %entry
2579; MM32-NEXT:    lui $2, %hi(_gp_disp)
2580; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2581; MM32-NEXT:    addu $2, $2, $25
2582; MM32-NEXT:    lw $1, %got(y)($2)
2583; MM32-NEXT:    addiu $2, $zero, -4
2584; MM32-NEXT:    and $3, $1, $2
2585; MM32-NEXT:    andi $1, $1, 3
2586; MM32-NEXT:    sll $1, $1, 3
2587; MM32-NEXT:    ori $2, $zero, 255
2588; MM32-NEXT:    sllv $5, $2, $1
2589; MM32-NEXT:    nor $6, $zero, $5
2590; MM32-NEXT:    sllv $4, $4, $1
2591; MM32-NEXT:  $BB8_1: # %entry
2592; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
2593; MM32-NEXT:    ll $7, 0($3)
2594; MM32-NEXT:    addu $8, $7, $4
2595; MM32-NEXT:    and $8, $8, $5
2596; MM32-NEXT:    and $9, $7, $6
2597; MM32-NEXT:    or $9, $9, $8
2598; MM32-NEXT:    sc $9, 0($3)
2599; MM32-NEXT:    beqzc $9, $BB8_1
2600; MM32-NEXT:  # %bb.2: # %entry
2601; MM32-NEXT:    and $2, $7, $5
2602; MM32-NEXT:    srlv $2, $2, $1
2603; MM32-NEXT:    seb $2, $2
2604; MM32-NEXT:  # %bb.3: # %entry
2605; MM32-NEXT:    jrc $ra
2606;
2607; O1-LABEL: AtomicLoadAdd8:
2608; O1:       # %bb.0: # %entry
2609; O1-NEXT:    lui $2, %hi(_gp_disp)
2610; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
2611; O1-NEXT:    addu $1, $2, $25
2612; O1-NEXT:    lw $1, %got(y)($1)
2613; O1-NEXT:    addiu $2, $zero, -4
2614; O1-NEXT:    and $3, $1, $2
2615; O1-NEXT:    andi $1, $1, 3
2616; O1-NEXT:    sll $1, $1, 3
2617; O1-NEXT:    ori $2, $zero, 255
2618; O1-NEXT:    sllv $5, $2, $1
2619; O1-NEXT:    nor $6, $zero, $5
2620; O1-NEXT:    sllv $4, $4, $1
2621; O1-NEXT:  $BB8_1: # %entry
2622; O1-NEXT:    # =>This Inner Loop Header: Depth=1
2623; O1-NEXT:    ll $7, 0($3)
2624; O1-NEXT:    addu $8, $7, $4
2625; O1-NEXT:    and $8, $8, $5
2626; O1-NEXT:    and $9, $7, $6
2627; O1-NEXT:    or $9, $9, $8
2628; O1-NEXT:    sc $9, 0($3)
2629; O1-NEXT:    beqz $9, $BB8_1
2630; O1-NEXT:    nop
2631; O1-NEXT:  # %bb.2: # %entry
2632; O1-NEXT:    and $2, $7, $5
2633; O1-NEXT:    srlv $2, $2, $1
2634; O1-NEXT:    sll $2, $2, 24
2635; O1-NEXT:    sra $2, $2, 24
2636; O1-NEXT:  # %bb.3: # %entry
2637; O1-NEXT:    jr $ra
2638; O1-NEXT:    nop
2639;
2640; O2-LABEL: AtomicLoadAdd8:
2641; O2:       # %bb.0: # %entry
2642; O2-NEXT:    lui $2, %hi(_gp_disp)
2643; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2644; O2-NEXT:    addu $1, $2, $25
2645; O2-NEXT:    lw $1, %got(y)($1)
2646; O2-NEXT:    addiu $2, $zero, -4
2647; O2-NEXT:    and $3, $1, $2
2648; O2-NEXT:    andi $1, $1, 3
2649; O2-NEXT:    sll $1, $1, 3
2650; O2-NEXT:    ori $2, $zero, 255
2651; O2-NEXT:    sllv $5, $2, $1
2652; O2-NEXT:    nor $6, $zero, $5
2653; O2-NEXT:    sllv $4, $4, $1
2654; O2-NEXT:  $BB8_1: # %entry
2655; O2-NEXT:    # =>This Inner Loop Header: Depth=1
2656; O2-NEXT:    ll $7, 0($3)
2657; O2-NEXT:    addu $8, $7, $4
2658; O2-NEXT:    and $8, $8, $5
2659; O2-NEXT:    and $9, $7, $6
2660; O2-NEXT:    or $9, $9, $8
2661; O2-NEXT:    sc $9, 0($3)
2662; O2-NEXT:    beqz $9, $BB8_1
2663; O2-NEXT:    nop
2664; O2-NEXT:  # %bb.2: # %entry
2665; O2-NEXT:    and $2, $7, $5
2666; O2-NEXT:    srlv $2, $2, $1
2667; O2-NEXT:    sll $2, $2, 24
2668; O2-NEXT:    sra $2, $2, 24
2669; O2-NEXT:  # %bb.3: # %entry
2670; O2-NEXT:    jr $ra
2671; O2-NEXT:    nop
2672;
2673; O3-LABEL: AtomicLoadAdd8:
2674; O3:       # %bb.0: # %entry
2675; O3-NEXT:    lui $2, %hi(_gp_disp)
2676; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
2677; O3-NEXT:    addu $1, $2, $25
2678; O3-NEXT:    addiu $2, $zero, -4
2679; O3-NEXT:    lw $1, %got(y)($1)
2680; O3-NEXT:    and $3, $1, $2
2681; O3-NEXT:    andi $1, $1, 3
2682; O3-NEXT:    ori $2, $zero, 255
2683; O3-NEXT:    sll $1, $1, 3
2684; O3-NEXT:    sllv $5, $2, $1
2685; O3-NEXT:    sllv $4, $4, $1
2686; O3-NEXT:    nor $6, $zero, $5
2687; O3-NEXT:  $BB8_1: # %entry
2688; O3-NEXT:    # =>This Inner Loop Header: Depth=1
2689; O3-NEXT:    ll $7, 0($3)
2690; O3-NEXT:    addu $8, $7, $4
2691; O3-NEXT:    and $8, $8, $5
2692; O3-NEXT:    and $9, $7, $6
2693; O3-NEXT:    or $9, $9, $8
2694; O3-NEXT:    sc $9, 0($3)
2695; O3-NEXT:    beqz $9, $BB8_1
2696; O3-NEXT:    nop
2697; O3-NEXT:  # %bb.2: # %entry
2698; O3-NEXT:    and $2, $7, $5
2699; O3-NEXT:    srlv $2, $2, $1
2700; O3-NEXT:    sll $2, $2, 24
2701; O3-NEXT:    sra $2, $2, 24
2702; O3-NEXT:  # %bb.3: # %entry
2703; O3-NEXT:    jr $ra
2704; O3-NEXT:    nop
2705;
2706; MIPS32EB-LABEL: AtomicLoadAdd8:
2707; MIPS32EB:       # %bb.0: # %entry
2708; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
2709; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
2710; MIPS32EB-NEXT:    addu $1, $2, $25
2711; MIPS32EB-NEXT:    lw $1, %got(y)($1)
2712; MIPS32EB-NEXT:    addiu $2, $zero, -4
2713; MIPS32EB-NEXT:    and $3, $1, $2
2714; MIPS32EB-NEXT:    andi $1, $1, 3
2715; MIPS32EB-NEXT:    xori $1, $1, 3
2716; MIPS32EB-NEXT:    sll $1, $1, 3
2717; MIPS32EB-NEXT:    ori $2, $zero, 255
2718; MIPS32EB-NEXT:    sllv $5, $2, $1
2719; MIPS32EB-NEXT:    nor $6, $zero, $5
2720; MIPS32EB-NEXT:    sllv $4, $4, $1
2721; MIPS32EB-NEXT:  $BB8_1: # %entry
2722; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
2723; MIPS32EB-NEXT:    ll $7, 0($3)
2724; MIPS32EB-NEXT:    addu $8, $7, $4
2725; MIPS32EB-NEXT:    and $8, $8, $5
2726; MIPS32EB-NEXT:    and $9, $7, $6
2727; MIPS32EB-NEXT:    or $9, $9, $8
2728; MIPS32EB-NEXT:    sc $9, 0($3)
2729; MIPS32EB-NEXT:    beqz $9, $BB8_1
2730; MIPS32EB-NEXT:    nop
2731; MIPS32EB-NEXT:  # %bb.2: # %entry
2732; MIPS32EB-NEXT:    and $2, $7, $5
2733; MIPS32EB-NEXT:    srlv $2, $2, $1
2734; MIPS32EB-NEXT:    sll $2, $2, 24
2735; MIPS32EB-NEXT:    sra $2, $2, 24
2736; MIPS32EB-NEXT:  # %bb.3: # %entry
2737; MIPS32EB-NEXT:    jr $ra
2738; MIPS32EB-NEXT:    nop
2739entry:
2740  %0 = atomicrmw add ptr @y, i8 %incr monotonic
2741  ret i8 %0
2742}
2743
2744define signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind {
2745; MIPS32-LABEL: AtomicLoadSub8:
2746; MIPS32:       # %bb.0: # %entry
2747; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
2748; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2749; MIPS32-NEXT:    addu $1, $2, $25
2750; MIPS32-NEXT:    lw $1, %got(y)($1)
2751; MIPS32-NEXT:    addiu $2, $zero, -4
2752; MIPS32-NEXT:    and $3, $1, $2
2753; MIPS32-NEXT:    andi $1, $1, 3
2754; MIPS32-NEXT:    sll $1, $1, 3
2755; MIPS32-NEXT:    ori $2, $zero, 255
2756; MIPS32-NEXT:    sllv $5, $2, $1
2757; MIPS32-NEXT:    nor $6, $zero, $5
2758; MIPS32-NEXT:    sllv $4, $4, $1
2759; MIPS32-NEXT:  $BB9_1: # %entry
2760; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
2761; MIPS32-NEXT:    ll $7, 0($3)
2762; MIPS32-NEXT:    subu $8, $7, $4
2763; MIPS32-NEXT:    and $8, $8, $5
2764; MIPS32-NEXT:    and $9, $7, $6
2765; MIPS32-NEXT:    or $9, $9, $8
2766; MIPS32-NEXT:    sc $9, 0($3)
2767; MIPS32-NEXT:    beqz $9, $BB9_1
2768; MIPS32-NEXT:    nop
2769; MIPS32-NEXT:  # %bb.2: # %entry
2770; MIPS32-NEXT:    and $2, $7, $5
2771; MIPS32-NEXT:    srlv $2, $2, $1
2772; MIPS32-NEXT:    sll $2, $2, 24
2773; MIPS32-NEXT:    sra $2, $2, 24
2774; MIPS32-NEXT:  # %bb.3: # %entry
2775; MIPS32-NEXT:    jr $ra
2776; MIPS32-NEXT:    nop
2777;
2778; MIPS32O0-LABEL: AtomicLoadSub8:
2779; MIPS32O0:       # %bb.0: # %entry
2780; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
2781; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2782; MIPS32O0-NEXT:    addiu $sp, $sp, -8
2783; MIPS32O0-NEXT:    addu $1, $2, $25
2784; MIPS32O0-NEXT:    lw $1, %got(y)($1)
2785; MIPS32O0-NEXT:    addiu $2, $zero, -4
2786; MIPS32O0-NEXT:    and $5, $1, $2
2787; MIPS32O0-NEXT:    andi $1, $1, 3
2788; MIPS32O0-NEXT:    sll $9, $1, 3
2789; MIPS32O0-NEXT:    ori $1, $zero, 255
2790; MIPS32O0-NEXT:    sllv $7, $1, $9
2791; MIPS32O0-NEXT:    nor $8, $zero, $7
2792; MIPS32O0-NEXT:    sllv $6, $4, $9
2793; MIPS32O0-NEXT:  $BB9_1: # %entry
2794; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
2795; MIPS32O0-NEXT:    ll $2, 0($5)
2796; MIPS32O0-NEXT:    subu $3, $2, $6
2797; MIPS32O0-NEXT:    and $3, $3, $7
2798; MIPS32O0-NEXT:    and $4, $2, $8
2799; MIPS32O0-NEXT:    or $4, $4, $3
2800; MIPS32O0-NEXT:    sc $4, 0($5)
2801; MIPS32O0-NEXT:    beqz $4, $BB9_1
2802; MIPS32O0-NEXT:    nop
2803; MIPS32O0-NEXT:  # %bb.2: # %entry
2804; MIPS32O0-NEXT:    and $1, $2, $7
2805; MIPS32O0-NEXT:    srlv $1, $1, $9
2806; MIPS32O0-NEXT:    sll $1, $1, 24
2807; MIPS32O0-NEXT:    sra $1, $1, 24
2808; MIPS32O0-NEXT:  # %bb.3: # %entry
2809; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
2810; MIPS32O0-NEXT:  # %bb.4: # %entry
2811; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2812; MIPS32O0-NEXT:    sll $1, $1, 24
2813; MIPS32O0-NEXT:    sra $2, $1, 24
2814; MIPS32O0-NEXT:    addiu $sp, $sp, 8
2815; MIPS32O0-NEXT:    jr $ra
2816; MIPS32O0-NEXT:    nop
2817;
2818; MIPS32R2-LABEL: AtomicLoadSub8:
2819; MIPS32R2:       # %bb.0: # %entry
2820; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
2821; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2822; MIPS32R2-NEXT:    addu $1, $2, $25
2823; MIPS32R2-NEXT:    lw $1, %got(y)($1)
2824; MIPS32R2-NEXT:    addiu $2, $zero, -4
2825; MIPS32R2-NEXT:    and $3, $1, $2
2826; MIPS32R2-NEXT:    andi $1, $1, 3
2827; MIPS32R2-NEXT:    sll $1, $1, 3
2828; MIPS32R2-NEXT:    ori $2, $zero, 255
2829; MIPS32R2-NEXT:    sllv $5, $2, $1
2830; MIPS32R2-NEXT:    nor $6, $zero, $5
2831; MIPS32R2-NEXT:    sllv $4, $4, $1
2832; MIPS32R2-NEXT:  $BB9_1: # %entry
2833; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
2834; MIPS32R2-NEXT:    ll $7, 0($3)
2835; MIPS32R2-NEXT:    subu $8, $7, $4
2836; MIPS32R2-NEXT:    and $8, $8, $5
2837; MIPS32R2-NEXT:    and $9, $7, $6
2838; MIPS32R2-NEXT:    or $9, $9, $8
2839; MIPS32R2-NEXT:    sc $9, 0($3)
2840; MIPS32R2-NEXT:    beqz $9, $BB9_1
2841; MIPS32R2-NEXT:    nop
2842; MIPS32R2-NEXT:  # %bb.2: # %entry
2843; MIPS32R2-NEXT:    and $2, $7, $5
2844; MIPS32R2-NEXT:    srlv $2, $2, $1
2845; MIPS32R2-NEXT:    seb $2, $2
2846; MIPS32R2-NEXT:  # %bb.3: # %entry
2847; MIPS32R2-NEXT:    jr $ra
2848; MIPS32R2-NEXT:    nop
2849;
2850; MIPS32R6-LABEL: AtomicLoadSub8:
2851; MIPS32R6:       # %bb.0: # %entry
2852; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
2853; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
2854; MIPS32R6-NEXT:    addu $1, $2, $25
2855; MIPS32R6-NEXT:    lw $1, %got(y)($1)
2856; MIPS32R6-NEXT:    addiu $2, $zero, -4
2857; MIPS32R6-NEXT:    and $3, $1, $2
2858; MIPS32R6-NEXT:    andi $1, $1, 3
2859; MIPS32R6-NEXT:    sll $1, $1, 3
2860; MIPS32R6-NEXT:    ori $2, $zero, 255
2861; MIPS32R6-NEXT:    sllv $5, $2, $1
2862; MIPS32R6-NEXT:    nor $6, $zero, $5
2863; MIPS32R6-NEXT:    sllv $4, $4, $1
2864; MIPS32R6-NEXT:  $BB9_1: # %entry
2865; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
2866; MIPS32R6-NEXT:    ll $7, 0($3)
2867; MIPS32R6-NEXT:    subu $8, $7, $4
2868; MIPS32R6-NEXT:    and $8, $8, $5
2869; MIPS32R6-NEXT:    and $9, $7, $6
2870; MIPS32R6-NEXT:    or $9, $9, $8
2871; MIPS32R6-NEXT:    sc $9, 0($3)
2872; MIPS32R6-NEXT:    beqzc $9, $BB9_1
2873; MIPS32R6-NEXT:  # %bb.2: # %entry
2874; MIPS32R6-NEXT:    and $2, $7, $5
2875; MIPS32R6-NEXT:    srlv $2, $2, $1
2876; MIPS32R6-NEXT:    seb $2, $2
2877; MIPS32R6-NEXT:  # %bb.3: # %entry
2878; MIPS32R6-NEXT:    jrc $ra
2879;
2880; MIPS32R6O0-LABEL: AtomicLoadSub8:
2881; MIPS32R6O0:       # %bb.0: # %entry
2882; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
2883; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2884; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
2885; MIPS32R6O0-NEXT:    addu $1, $2, $25
2886; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a0
2887; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
2888; MIPS32R6O0-NEXT:    addiu $2, $zero, -4
2889; MIPS32R6O0-NEXT:    and $5, $1, $2
2890; MIPS32R6O0-NEXT:    andi $1, $1, 3
2891; MIPS32R6O0-NEXT:    sll $9, $1, 3
2892; MIPS32R6O0-NEXT:    ori $1, $zero, 255
2893; MIPS32R6O0-NEXT:    sllv $7, $1, $9
2894; MIPS32R6O0-NEXT:    nor $8, $zero, $7
2895; MIPS32R6O0-NEXT:    sllv $6, $4, $9
2896; MIPS32R6O0-NEXT:  $BB9_1: # %entry
2897; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2898; MIPS32R6O0-NEXT:    ll $2, 0($5)
2899; MIPS32R6O0-NEXT:    subu $3, $2, $6
2900; MIPS32R6O0-NEXT:    and $3, $3, $7
2901; MIPS32R6O0-NEXT:    and $4, $2, $8
2902; MIPS32R6O0-NEXT:    or $4, $4, $3
2903; MIPS32R6O0-NEXT:    sc $4, 0($5)
2904; MIPS32R6O0-NEXT:    beqzc $4, $BB9_1
2905; MIPS32R6O0-NEXT:  # %bb.2: # %entry
2906; MIPS32R6O0-NEXT:    and $1, $2, $7
2907; MIPS32R6O0-NEXT:    srlv $1, $1, $9
2908; MIPS32R6O0-NEXT:    seb $1, $1
2909; MIPS32R6O0-NEXT:  # %bb.3: # %entry
2910; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
2911; MIPS32R6O0-NEXT:  # %bb.4: # %entry
2912; MIPS32R6O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
2913; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
2914; MIPS32R6O0-NEXT:    jrc $ra
2915;
2916; MIPS4-LABEL: AtomicLoadSub8:
2917; MIPS4:       # %bb.0: # %entry
2918; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
2919; MIPS4-NEXT:    daddu $1, $1, $25
2920; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
2921; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
2922; MIPS4-NEXT:    daddiu $2, $zero, -4
2923; MIPS4-NEXT:    and $3, $1, $2
2924; MIPS4-NEXT:    andi $1, $1, 3
2925; MIPS4-NEXT:    sll $1, $1, 3
2926; MIPS4-NEXT:    ori $2, $zero, 255
2927; MIPS4-NEXT:    sllv $5, $2, $1
2928; MIPS4-NEXT:    nor $6, $zero, $5
2929; MIPS4-NEXT:    sllv $4, $4, $1
2930; MIPS4-NEXT:  .LBB9_1: # %entry
2931; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2932; MIPS4-NEXT:    ll $7, 0($3)
2933; MIPS4-NEXT:    subu $8, $7, $4
2934; MIPS4-NEXT:    and $8, $8, $5
2935; MIPS4-NEXT:    and $9, $7, $6
2936; MIPS4-NEXT:    or $9, $9, $8
2937; MIPS4-NEXT:    sc $9, 0($3)
2938; MIPS4-NEXT:    beqz $9, .LBB9_1
2939; MIPS4-NEXT:    nop
2940; MIPS4-NEXT:  # %bb.2: # %entry
2941; MIPS4-NEXT:    and $2, $7, $5
2942; MIPS4-NEXT:    srlv $2, $2, $1
2943; MIPS4-NEXT:    sll $2, $2, 24
2944; MIPS4-NEXT:    sra $2, $2, 24
2945; MIPS4-NEXT:  # %bb.3: # %entry
2946; MIPS4-NEXT:    jr $ra
2947; MIPS4-NEXT:    nop
2948;
2949; MIPS64-LABEL: AtomicLoadSub8:
2950; MIPS64:       # %bb.0: # %entry
2951; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
2952; MIPS64-NEXT:    daddu $1, $1, $25
2953; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
2954; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
2955; MIPS64-NEXT:    daddiu $2, $zero, -4
2956; MIPS64-NEXT:    and $3, $1, $2
2957; MIPS64-NEXT:    andi $1, $1, 3
2958; MIPS64-NEXT:    sll $1, $1, 3
2959; MIPS64-NEXT:    ori $2, $zero, 255
2960; MIPS64-NEXT:    sllv $5, $2, $1
2961; MIPS64-NEXT:    nor $6, $zero, $5
2962; MIPS64-NEXT:    sllv $4, $4, $1
2963; MIPS64-NEXT:  .LBB9_1: # %entry
2964; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2965; MIPS64-NEXT:    ll $7, 0($3)
2966; MIPS64-NEXT:    subu $8, $7, $4
2967; MIPS64-NEXT:    and $8, $8, $5
2968; MIPS64-NEXT:    and $9, $7, $6
2969; MIPS64-NEXT:    or $9, $9, $8
2970; MIPS64-NEXT:    sc $9, 0($3)
2971; MIPS64-NEXT:    beqz $9, .LBB9_1
2972; MIPS64-NEXT:    nop
2973; MIPS64-NEXT:  # %bb.2: # %entry
2974; MIPS64-NEXT:    and $2, $7, $5
2975; MIPS64-NEXT:    srlv $2, $2, $1
2976; MIPS64-NEXT:    sll $2, $2, 24
2977; MIPS64-NEXT:    sra $2, $2, 24
2978; MIPS64-NEXT:  # %bb.3: # %entry
2979; MIPS64-NEXT:    jr $ra
2980; MIPS64-NEXT:    nop
2981;
2982; MIPS64R2-LABEL: AtomicLoadSub8:
2983; MIPS64R2:       # %bb.0: # %entry
2984; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
2985; MIPS64R2-NEXT:    daddu $1, $1, $25
2986; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
2987; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
2988; MIPS64R2-NEXT:    daddiu $2, $zero, -4
2989; MIPS64R2-NEXT:    and $3, $1, $2
2990; MIPS64R2-NEXT:    andi $1, $1, 3
2991; MIPS64R2-NEXT:    sll $1, $1, 3
2992; MIPS64R2-NEXT:    ori $2, $zero, 255
2993; MIPS64R2-NEXT:    sllv $5, $2, $1
2994; MIPS64R2-NEXT:    nor $6, $zero, $5
2995; MIPS64R2-NEXT:    sllv $4, $4, $1
2996; MIPS64R2-NEXT:  .LBB9_1: # %entry
2997; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
2998; MIPS64R2-NEXT:    ll $7, 0($3)
2999; MIPS64R2-NEXT:    subu $8, $7, $4
3000; MIPS64R2-NEXT:    and $8, $8, $5
3001; MIPS64R2-NEXT:    and $9, $7, $6
3002; MIPS64R2-NEXT:    or $9, $9, $8
3003; MIPS64R2-NEXT:    sc $9, 0($3)
3004; MIPS64R2-NEXT:    beqz $9, .LBB9_1
3005; MIPS64R2-NEXT:    nop
3006; MIPS64R2-NEXT:  # %bb.2: # %entry
3007; MIPS64R2-NEXT:    and $2, $7, $5
3008; MIPS64R2-NEXT:    srlv $2, $2, $1
3009; MIPS64R2-NEXT:    seb $2, $2
3010; MIPS64R2-NEXT:  # %bb.3: # %entry
3011; MIPS64R2-NEXT:    jr $ra
3012; MIPS64R2-NEXT:    nop
3013;
3014; MIPS64R6-LABEL: AtomicLoadSub8:
3015; MIPS64R6:       # %bb.0: # %entry
3016; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3017; MIPS64R6-NEXT:    daddu $1, $1, $25
3018; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3019; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
3020; MIPS64R6-NEXT:    daddiu $2, $zero, -4
3021; MIPS64R6-NEXT:    and $3, $1, $2
3022; MIPS64R6-NEXT:    andi $1, $1, 3
3023; MIPS64R6-NEXT:    sll $1, $1, 3
3024; MIPS64R6-NEXT:    ori $2, $zero, 255
3025; MIPS64R6-NEXT:    sllv $5, $2, $1
3026; MIPS64R6-NEXT:    nor $6, $zero, $5
3027; MIPS64R6-NEXT:    sllv $4, $4, $1
3028; MIPS64R6-NEXT:  .LBB9_1: # %entry
3029; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
3030; MIPS64R6-NEXT:    ll $7, 0($3)
3031; MIPS64R6-NEXT:    subu $8, $7, $4
3032; MIPS64R6-NEXT:    and $8, $8, $5
3033; MIPS64R6-NEXT:    and $9, $7, $6
3034; MIPS64R6-NEXT:    or $9, $9, $8
3035; MIPS64R6-NEXT:    sc $9, 0($3)
3036; MIPS64R6-NEXT:    beqzc $9, .LBB9_1
3037; MIPS64R6-NEXT:  # %bb.2: # %entry
3038; MIPS64R6-NEXT:    and $2, $7, $5
3039; MIPS64R6-NEXT:    srlv $2, $2, $1
3040; MIPS64R6-NEXT:    seb $2, $2
3041; MIPS64R6-NEXT:  # %bb.3: # %entry
3042; MIPS64R6-NEXT:    jrc $ra
3043;
3044; MIPS64R6O0-LABEL: AtomicLoadSub8:
3045; MIPS64R6O0:       # %bb.0: # %entry
3046; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
3047; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3048; MIPS64R6O0-NEXT:    daddu $1, $1, $25
3049; MIPS64R6O0-NEXT:    daddiu $2, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3050; MIPS64R6O0-NEXT:    move $1, $4
3051; MIPS64R6O0-NEXT:    ld $2, %got_disp(y)($2)
3052; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
3053; MIPS64R6O0-NEXT:    and $5, $2, $3
3054; MIPS64R6O0-NEXT:    andi $2, $2, 3
3055; MIPS64R6O0-NEXT:    xori $2, $2, 3
3056; MIPS64R6O0-NEXT:    sll $9, $2, 3
3057; MIPS64R6O0-NEXT:    ori $2, $zero, 255
3058; MIPS64R6O0-NEXT:    sllv $7, $2, $9
3059; MIPS64R6O0-NEXT:    nor $8, $zero, $7
3060; MIPS64R6O0-NEXT:    sllv $6, $1, $9
3061; MIPS64R6O0-NEXT:  .LBB9_1: # %entry
3062; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3063; MIPS64R6O0-NEXT:    ll $2, 0($5)
3064; MIPS64R6O0-NEXT:    subu $3, $2, $6
3065; MIPS64R6O0-NEXT:    and $3, $3, $7
3066; MIPS64R6O0-NEXT:    and $4, $2, $8
3067; MIPS64R6O0-NEXT:    or $4, $4, $3
3068; MIPS64R6O0-NEXT:    sc $4, 0($5)
3069; MIPS64R6O0-NEXT:    beqzc $4, .LBB9_1
3070; MIPS64R6O0-NEXT:  # %bb.2: # %entry
3071; MIPS64R6O0-NEXT:    and $1, $2, $7
3072; MIPS64R6O0-NEXT:    srlv $1, $1, $9
3073; MIPS64R6O0-NEXT:    seb $1, $1
3074; MIPS64R6O0-NEXT:  # %bb.3: # %entry
3075; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
3076; MIPS64R6O0-NEXT:  # %bb.4: # %entry
3077; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
3078; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
3079; MIPS64R6O0-NEXT:    jrc $ra
3080;
3081; MM32-LABEL: AtomicLoadSub8:
3082; MM32:       # %bb.0: # %entry
3083; MM32-NEXT:    lui $2, %hi(_gp_disp)
3084; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3085; MM32-NEXT:    addu $2, $2, $25
3086; MM32-NEXT:    lw $1, %got(y)($2)
3087; MM32-NEXT:    addiu $2, $zero, -4
3088; MM32-NEXT:    and $3, $1, $2
3089; MM32-NEXT:    andi $1, $1, 3
3090; MM32-NEXT:    sll $1, $1, 3
3091; MM32-NEXT:    ori $2, $zero, 255
3092; MM32-NEXT:    sllv $5, $2, $1
3093; MM32-NEXT:    nor $6, $zero, $5
3094; MM32-NEXT:    sllv $4, $4, $1
3095; MM32-NEXT:  $BB9_1: # %entry
3096; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
3097; MM32-NEXT:    ll $7, 0($3)
3098; MM32-NEXT:    subu $8, $7, $4
3099; MM32-NEXT:    and $8, $8, $5
3100; MM32-NEXT:    and $9, $7, $6
3101; MM32-NEXT:    or $9, $9, $8
3102; MM32-NEXT:    sc $9, 0($3)
3103; MM32-NEXT:    beqzc $9, $BB9_1
3104; MM32-NEXT:  # %bb.2: # %entry
3105; MM32-NEXT:    and $2, $7, $5
3106; MM32-NEXT:    srlv $2, $2, $1
3107; MM32-NEXT:    seb $2, $2
3108; MM32-NEXT:  # %bb.3: # %entry
3109; MM32-NEXT:    jrc $ra
3110;
3111; O1-LABEL: AtomicLoadSub8:
3112; O1:       # %bb.0: # %entry
3113; O1-NEXT:    lui $2, %hi(_gp_disp)
3114; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
3115; O1-NEXT:    addu $1, $2, $25
3116; O1-NEXT:    lw $1, %got(y)($1)
3117; O1-NEXT:    addiu $2, $zero, -4
3118; O1-NEXT:    and $3, $1, $2
3119; O1-NEXT:    andi $1, $1, 3
3120; O1-NEXT:    sll $1, $1, 3
3121; O1-NEXT:    ori $2, $zero, 255
3122; O1-NEXT:    sllv $5, $2, $1
3123; O1-NEXT:    nor $6, $zero, $5
3124; O1-NEXT:    sllv $4, $4, $1
3125; O1-NEXT:  $BB9_1: # %entry
3126; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3127; O1-NEXT:    ll $7, 0($3)
3128; O1-NEXT:    subu $8, $7, $4
3129; O1-NEXT:    and $8, $8, $5
3130; O1-NEXT:    and $9, $7, $6
3131; O1-NEXT:    or $9, $9, $8
3132; O1-NEXT:    sc $9, 0($3)
3133; O1-NEXT:    beqz $9, $BB9_1
3134; O1-NEXT:    nop
3135; O1-NEXT:  # %bb.2: # %entry
3136; O1-NEXT:    and $2, $7, $5
3137; O1-NEXT:    srlv $2, $2, $1
3138; O1-NEXT:    sll $2, $2, 24
3139; O1-NEXT:    sra $2, $2, 24
3140; O1-NEXT:  # %bb.3: # %entry
3141; O1-NEXT:    jr $ra
3142; O1-NEXT:    nop
3143;
3144; O2-LABEL: AtomicLoadSub8:
3145; O2:       # %bb.0: # %entry
3146; O2-NEXT:    lui $2, %hi(_gp_disp)
3147; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3148; O2-NEXT:    addu $1, $2, $25
3149; O2-NEXT:    lw $1, %got(y)($1)
3150; O2-NEXT:    addiu $2, $zero, -4
3151; O2-NEXT:    and $3, $1, $2
3152; O2-NEXT:    andi $1, $1, 3
3153; O2-NEXT:    sll $1, $1, 3
3154; O2-NEXT:    ori $2, $zero, 255
3155; O2-NEXT:    sllv $5, $2, $1
3156; O2-NEXT:    nor $6, $zero, $5
3157; O2-NEXT:    sllv $4, $4, $1
3158; O2-NEXT:  $BB9_1: # %entry
3159; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3160; O2-NEXT:    ll $7, 0($3)
3161; O2-NEXT:    subu $8, $7, $4
3162; O2-NEXT:    and $8, $8, $5
3163; O2-NEXT:    and $9, $7, $6
3164; O2-NEXT:    or $9, $9, $8
3165; O2-NEXT:    sc $9, 0($3)
3166; O2-NEXT:    beqz $9, $BB9_1
3167; O2-NEXT:    nop
3168; O2-NEXT:  # %bb.2: # %entry
3169; O2-NEXT:    and $2, $7, $5
3170; O2-NEXT:    srlv $2, $2, $1
3171; O2-NEXT:    sll $2, $2, 24
3172; O2-NEXT:    sra $2, $2, 24
3173; O2-NEXT:  # %bb.3: # %entry
3174; O2-NEXT:    jr $ra
3175; O2-NEXT:    nop
3176;
3177; O3-LABEL: AtomicLoadSub8:
3178; O3:       # %bb.0: # %entry
3179; O3-NEXT:    lui $2, %hi(_gp_disp)
3180; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
3181; O3-NEXT:    addu $1, $2, $25
3182; O3-NEXT:    addiu $2, $zero, -4
3183; O3-NEXT:    lw $1, %got(y)($1)
3184; O3-NEXT:    and $3, $1, $2
3185; O3-NEXT:    andi $1, $1, 3
3186; O3-NEXT:    ori $2, $zero, 255
3187; O3-NEXT:    sll $1, $1, 3
3188; O3-NEXT:    sllv $5, $2, $1
3189; O3-NEXT:    sllv $4, $4, $1
3190; O3-NEXT:    nor $6, $zero, $5
3191; O3-NEXT:  $BB9_1: # %entry
3192; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3193; O3-NEXT:    ll $7, 0($3)
3194; O3-NEXT:    subu $8, $7, $4
3195; O3-NEXT:    and $8, $8, $5
3196; O3-NEXT:    and $9, $7, $6
3197; O3-NEXT:    or $9, $9, $8
3198; O3-NEXT:    sc $9, 0($3)
3199; O3-NEXT:    beqz $9, $BB9_1
3200; O3-NEXT:    nop
3201; O3-NEXT:  # %bb.2: # %entry
3202; O3-NEXT:    and $2, $7, $5
3203; O3-NEXT:    srlv $2, $2, $1
3204; O3-NEXT:    sll $2, $2, 24
3205; O3-NEXT:    sra $2, $2, 24
3206; O3-NEXT:  # %bb.3: # %entry
3207; O3-NEXT:    jr $ra
3208; O3-NEXT:    nop
3209;
3210; MIPS32EB-LABEL: AtomicLoadSub8:
3211; MIPS32EB:       # %bb.0: # %entry
3212; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
3213; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
3214; MIPS32EB-NEXT:    addu $1, $2, $25
3215; MIPS32EB-NEXT:    lw $1, %got(y)($1)
3216; MIPS32EB-NEXT:    addiu $2, $zero, -4
3217; MIPS32EB-NEXT:    and $3, $1, $2
3218; MIPS32EB-NEXT:    andi $1, $1, 3
3219; MIPS32EB-NEXT:    xori $1, $1, 3
3220; MIPS32EB-NEXT:    sll $1, $1, 3
3221; MIPS32EB-NEXT:    ori $2, $zero, 255
3222; MIPS32EB-NEXT:    sllv $5, $2, $1
3223; MIPS32EB-NEXT:    nor $6, $zero, $5
3224; MIPS32EB-NEXT:    sllv $4, $4, $1
3225; MIPS32EB-NEXT:  $BB9_1: # %entry
3226; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
3227; MIPS32EB-NEXT:    ll $7, 0($3)
3228; MIPS32EB-NEXT:    subu $8, $7, $4
3229; MIPS32EB-NEXT:    and $8, $8, $5
3230; MIPS32EB-NEXT:    and $9, $7, $6
3231; MIPS32EB-NEXT:    or $9, $9, $8
3232; MIPS32EB-NEXT:    sc $9, 0($3)
3233; MIPS32EB-NEXT:    beqz $9, $BB9_1
3234; MIPS32EB-NEXT:    nop
3235; MIPS32EB-NEXT:  # %bb.2: # %entry
3236; MIPS32EB-NEXT:    and $2, $7, $5
3237; MIPS32EB-NEXT:    srlv $2, $2, $1
3238; MIPS32EB-NEXT:    sll $2, $2, 24
3239; MIPS32EB-NEXT:    sra $2, $2, 24
3240; MIPS32EB-NEXT:  # %bb.3: # %entry
3241; MIPS32EB-NEXT:    jr $ra
3242; MIPS32EB-NEXT:    nop
3243entry:
3244  %0 = atomicrmw sub ptr @y, i8 %incr monotonic
3245  ret i8 %0
3246
3247}
3248
3249define signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind {
3250; MIPS32-LABEL: AtomicLoadNand8:
3251; MIPS32:       # %bb.0: # %entry
3252; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
3253; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3254; MIPS32-NEXT:    addu $1, $2, $25
3255; MIPS32-NEXT:    lw $1, %got(y)($1)
3256; MIPS32-NEXT:    addiu $2, $zero, -4
3257; MIPS32-NEXT:    and $3, $1, $2
3258; MIPS32-NEXT:    andi $1, $1, 3
3259; MIPS32-NEXT:    sll $1, $1, 3
3260; MIPS32-NEXT:    ori $2, $zero, 255
3261; MIPS32-NEXT:    sllv $5, $2, $1
3262; MIPS32-NEXT:    nor $6, $zero, $5
3263; MIPS32-NEXT:    sllv $4, $4, $1
3264; MIPS32-NEXT:  $BB10_1: # %entry
3265; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
3266; MIPS32-NEXT:    ll $7, 0($3)
3267; MIPS32-NEXT:    and $8, $7, $4
3268; MIPS32-NEXT:    nor $8, $zero, $8
3269; MIPS32-NEXT:    and $8, $8, $5
3270; MIPS32-NEXT:    and $9, $7, $6
3271; MIPS32-NEXT:    or $9, $9, $8
3272; MIPS32-NEXT:    sc $9, 0($3)
3273; MIPS32-NEXT:    beqz $9, $BB10_1
3274; MIPS32-NEXT:    nop
3275; MIPS32-NEXT:  # %bb.2: # %entry
3276; MIPS32-NEXT:    and $2, $7, $5
3277; MIPS32-NEXT:    srlv $2, $2, $1
3278; MIPS32-NEXT:    sll $2, $2, 24
3279; MIPS32-NEXT:    sra $2, $2, 24
3280; MIPS32-NEXT:  # %bb.3: # %entry
3281; MIPS32-NEXT:    jr $ra
3282; MIPS32-NEXT:    nop
3283;
3284; MIPS32O0-LABEL: AtomicLoadNand8:
3285; MIPS32O0:       # %bb.0: # %entry
3286; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
3287; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3288; MIPS32O0-NEXT:    addiu $sp, $sp, -8
3289; MIPS32O0-NEXT:    addu $1, $2, $25
3290; MIPS32O0-NEXT:    lw $1, %got(y)($1)
3291; MIPS32O0-NEXT:    addiu $2, $zero, -4
3292; MIPS32O0-NEXT:    and $5, $1, $2
3293; MIPS32O0-NEXT:    andi $1, $1, 3
3294; MIPS32O0-NEXT:    sll $9, $1, 3
3295; MIPS32O0-NEXT:    ori $1, $zero, 255
3296; MIPS32O0-NEXT:    sllv $7, $1, $9
3297; MIPS32O0-NEXT:    nor $8, $zero, $7
3298; MIPS32O0-NEXT:    sllv $6, $4, $9
3299; MIPS32O0-NEXT:  $BB10_1: # %entry
3300; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
3301; MIPS32O0-NEXT:    ll $2, 0($5)
3302; MIPS32O0-NEXT:    and $3, $2, $6
3303; MIPS32O0-NEXT:    nor $3, $zero, $3
3304; MIPS32O0-NEXT:    and $3, $3, $7
3305; MIPS32O0-NEXT:    and $4, $2, $8
3306; MIPS32O0-NEXT:    or $4, $4, $3
3307; MIPS32O0-NEXT:    sc $4, 0($5)
3308; MIPS32O0-NEXT:    beqz $4, $BB10_1
3309; MIPS32O0-NEXT:    nop
3310; MIPS32O0-NEXT:  # %bb.2: # %entry
3311; MIPS32O0-NEXT:    and $1, $2, $7
3312; MIPS32O0-NEXT:    srlv $1, $1, $9
3313; MIPS32O0-NEXT:    sll $1, $1, 24
3314; MIPS32O0-NEXT:    sra $1, $1, 24
3315; MIPS32O0-NEXT:  # %bb.3: # %entry
3316; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
3317; MIPS32O0-NEXT:  # %bb.4: # %entry
3318; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3319; MIPS32O0-NEXT:    sll $1, $1, 24
3320; MIPS32O0-NEXT:    sra $2, $1, 24
3321; MIPS32O0-NEXT:    addiu $sp, $sp, 8
3322; MIPS32O0-NEXT:    jr $ra
3323; MIPS32O0-NEXT:    nop
3324;
3325; MIPS32R2-LABEL: AtomicLoadNand8:
3326; MIPS32R2:       # %bb.0: # %entry
3327; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
3328; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3329; MIPS32R2-NEXT:    addu $1, $2, $25
3330; MIPS32R2-NEXT:    lw $1, %got(y)($1)
3331; MIPS32R2-NEXT:    addiu $2, $zero, -4
3332; MIPS32R2-NEXT:    and $3, $1, $2
3333; MIPS32R2-NEXT:    andi $1, $1, 3
3334; MIPS32R2-NEXT:    sll $1, $1, 3
3335; MIPS32R2-NEXT:    ori $2, $zero, 255
3336; MIPS32R2-NEXT:    sllv $5, $2, $1
3337; MIPS32R2-NEXT:    nor $6, $zero, $5
3338; MIPS32R2-NEXT:    sllv $4, $4, $1
3339; MIPS32R2-NEXT:  $BB10_1: # %entry
3340; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
3341; MIPS32R2-NEXT:    ll $7, 0($3)
3342; MIPS32R2-NEXT:    and $8, $7, $4
3343; MIPS32R2-NEXT:    nor $8, $zero, $8
3344; MIPS32R2-NEXT:    and $8, $8, $5
3345; MIPS32R2-NEXT:    and $9, $7, $6
3346; MIPS32R2-NEXT:    or $9, $9, $8
3347; MIPS32R2-NEXT:    sc $9, 0($3)
3348; MIPS32R2-NEXT:    beqz $9, $BB10_1
3349; MIPS32R2-NEXT:    nop
3350; MIPS32R2-NEXT:  # %bb.2: # %entry
3351; MIPS32R2-NEXT:    and $2, $7, $5
3352; MIPS32R2-NEXT:    srlv $2, $2, $1
3353; MIPS32R2-NEXT:    seb $2, $2
3354; MIPS32R2-NEXT:  # %bb.3: # %entry
3355; MIPS32R2-NEXT:    jr $ra
3356; MIPS32R2-NEXT:    nop
3357;
3358; MIPS32R6-LABEL: AtomicLoadNand8:
3359; MIPS32R6:       # %bb.0: # %entry
3360; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
3361; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
3362; MIPS32R6-NEXT:    addu $1, $2, $25
3363; MIPS32R6-NEXT:    lw $1, %got(y)($1)
3364; MIPS32R6-NEXT:    addiu $2, $zero, -4
3365; MIPS32R6-NEXT:    and $3, $1, $2
3366; MIPS32R6-NEXT:    andi $1, $1, 3
3367; MIPS32R6-NEXT:    sll $1, $1, 3
3368; MIPS32R6-NEXT:    ori $2, $zero, 255
3369; MIPS32R6-NEXT:    sllv $5, $2, $1
3370; MIPS32R6-NEXT:    nor $6, $zero, $5
3371; MIPS32R6-NEXT:    sllv $4, $4, $1
3372; MIPS32R6-NEXT:  $BB10_1: # %entry
3373; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
3374; MIPS32R6-NEXT:    ll $7, 0($3)
3375; MIPS32R6-NEXT:    and $8, $7, $4
3376; MIPS32R6-NEXT:    nor $8, $zero, $8
3377; MIPS32R6-NEXT:    and $8, $8, $5
3378; MIPS32R6-NEXT:    and $9, $7, $6
3379; MIPS32R6-NEXT:    or $9, $9, $8
3380; MIPS32R6-NEXT:    sc $9, 0($3)
3381; MIPS32R6-NEXT:    beqzc $9, $BB10_1
3382; MIPS32R6-NEXT:  # %bb.2: # %entry
3383; MIPS32R6-NEXT:    and $2, $7, $5
3384; MIPS32R6-NEXT:    srlv $2, $2, $1
3385; MIPS32R6-NEXT:    seb $2, $2
3386; MIPS32R6-NEXT:  # %bb.3: # %entry
3387; MIPS32R6-NEXT:    jrc $ra
3388;
3389; MIPS32R6O0-LABEL: AtomicLoadNand8:
3390; MIPS32R6O0:       # %bb.0: # %entry
3391; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
3392; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3393; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
3394; MIPS32R6O0-NEXT:    addu $1, $2, $25
3395; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a0
3396; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
3397; MIPS32R6O0-NEXT:    addiu $2, $zero, -4
3398; MIPS32R6O0-NEXT:    and $5, $1, $2
3399; MIPS32R6O0-NEXT:    andi $1, $1, 3
3400; MIPS32R6O0-NEXT:    sll $9, $1, 3
3401; MIPS32R6O0-NEXT:    ori $1, $zero, 255
3402; MIPS32R6O0-NEXT:    sllv $7, $1, $9
3403; MIPS32R6O0-NEXT:    nor $8, $zero, $7
3404; MIPS32R6O0-NEXT:    sllv $6, $4, $9
3405; MIPS32R6O0-NEXT:  $BB10_1: # %entry
3406; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3407; MIPS32R6O0-NEXT:    ll $2, 0($5)
3408; MIPS32R6O0-NEXT:    and $3, $2, $6
3409; MIPS32R6O0-NEXT:    nor $3, $zero, $3
3410; MIPS32R6O0-NEXT:    and $3, $3, $7
3411; MIPS32R6O0-NEXT:    and $4, $2, $8
3412; MIPS32R6O0-NEXT:    or $4, $4, $3
3413; MIPS32R6O0-NEXT:    sc $4, 0($5)
3414; MIPS32R6O0-NEXT:    beqzc $4, $BB10_1
3415; MIPS32R6O0-NEXT:  # %bb.2: # %entry
3416; MIPS32R6O0-NEXT:    and $1, $2, $7
3417; MIPS32R6O0-NEXT:    srlv $1, $1, $9
3418; MIPS32R6O0-NEXT:    seb $1, $1
3419; MIPS32R6O0-NEXT:  # %bb.3: # %entry
3420; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
3421; MIPS32R6O0-NEXT:  # %bb.4: # %entry
3422; MIPS32R6O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
3423; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
3424; MIPS32R6O0-NEXT:    jrc $ra
3425;
3426; MIPS4-LABEL: AtomicLoadNand8:
3427; MIPS4:       # %bb.0: # %entry
3428; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3429; MIPS4-NEXT:    daddu $1, $1, $25
3430; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3431; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
3432; MIPS4-NEXT:    daddiu $2, $zero, -4
3433; MIPS4-NEXT:    and $3, $1, $2
3434; MIPS4-NEXT:    andi $1, $1, 3
3435; MIPS4-NEXT:    sll $1, $1, 3
3436; MIPS4-NEXT:    ori $2, $zero, 255
3437; MIPS4-NEXT:    sllv $5, $2, $1
3438; MIPS4-NEXT:    nor $6, $zero, $5
3439; MIPS4-NEXT:    sllv $4, $4, $1
3440; MIPS4-NEXT:  .LBB10_1: # %entry
3441; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
3442; MIPS4-NEXT:    ll $7, 0($3)
3443; MIPS4-NEXT:    and $8, $7, $4
3444; MIPS4-NEXT:    nor $8, $zero, $8
3445; MIPS4-NEXT:    and $8, $8, $5
3446; MIPS4-NEXT:    and $9, $7, $6
3447; MIPS4-NEXT:    or $9, $9, $8
3448; MIPS4-NEXT:    sc $9, 0($3)
3449; MIPS4-NEXT:    beqz $9, .LBB10_1
3450; MIPS4-NEXT:    nop
3451; MIPS4-NEXT:  # %bb.2: # %entry
3452; MIPS4-NEXT:    and $2, $7, $5
3453; MIPS4-NEXT:    srlv $2, $2, $1
3454; MIPS4-NEXT:    sll $2, $2, 24
3455; MIPS4-NEXT:    sra $2, $2, 24
3456; MIPS4-NEXT:  # %bb.3: # %entry
3457; MIPS4-NEXT:    jr $ra
3458; MIPS4-NEXT:    nop
3459;
3460; MIPS64-LABEL: AtomicLoadNand8:
3461; MIPS64:       # %bb.0: # %entry
3462; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3463; MIPS64-NEXT:    daddu $1, $1, $25
3464; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3465; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
3466; MIPS64-NEXT:    daddiu $2, $zero, -4
3467; MIPS64-NEXT:    and $3, $1, $2
3468; MIPS64-NEXT:    andi $1, $1, 3
3469; MIPS64-NEXT:    sll $1, $1, 3
3470; MIPS64-NEXT:    ori $2, $zero, 255
3471; MIPS64-NEXT:    sllv $5, $2, $1
3472; MIPS64-NEXT:    nor $6, $zero, $5
3473; MIPS64-NEXT:    sllv $4, $4, $1
3474; MIPS64-NEXT:  .LBB10_1: # %entry
3475; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
3476; MIPS64-NEXT:    ll $7, 0($3)
3477; MIPS64-NEXT:    and $8, $7, $4
3478; MIPS64-NEXT:    nor $8, $zero, $8
3479; MIPS64-NEXT:    and $8, $8, $5
3480; MIPS64-NEXT:    and $9, $7, $6
3481; MIPS64-NEXT:    or $9, $9, $8
3482; MIPS64-NEXT:    sc $9, 0($3)
3483; MIPS64-NEXT:    beqz $9, .LBB10_1
3484; MIPS64-NEXT:    nop
3485; MIPS64-NEXT:  # %bb.2: # %entry
3486; MIPS64-NEXT:    and $2, $7, $5
3487; MIPS64-NEXT:    srlv $2, $2, $1
3488; MIPS64-NEXT:    sll $2, $2, 24
3489; MIPS64-NEXT:    sra $2, $2, 24
3490; MIPS64-NEXT:  # %bb.3: # %entry
3491; MIPS64-NEXT:    jr $ra
3492; MIPS64-NEXT:    nop
3493;
3494; MIPS64R2-LABEL: AtomicLoadNand8:
3495; MIPS64R2:       # %bb.0: # %entry
3496; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3497; MIPS64R2-NEXT:    daddu $1, $1, $25
3498; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3499; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
3500; MIPS64R2-NEXT:    daddiu $2, $zero, -4
3501; MIPS64R2-NEXT:    and $3, $1, $2
3502; MIPS64R2-NEXT:    andi $1, $1, 3
3503; MIPS64R2-NEXT:    sll $1, $1, 3
3504; MIPS64R2-NEXT:    ori $2, $zero, 255
3505; MIPS64R2-NEXT:    sllv $5, $2, $1
3506; MIPS64R2-NEXT:    nor $6, $zero, $5
3507; MIPS64R2-NEXT:    sllv $4, $4, $1
3508; MIPS64R2-NEXT:  .LBB10_1: # %entry
3509; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
3510; MIPS64R2-NEXT:    ll $7, 0($3)
3511; MIPS64R2-NEXT:    and $8, $7, $4
3512; MIPS64R2-NEXT:    nor $8, $zero, $8
3513; MIPS64R2-NEXT:    and $8, $8, $5
3514; MIPS64R2-NEXT:    and $9, $7, $6
3515; MIPS64R2-NEXT:    or $9, $9, $8
3516; MIPS64R2-NEXT:    sc $9, 0($3)
3517; MIPS64R2-NEXT:    beqz $9, .LBB10_1
3518; MIPS64R2-NEXT:    nop
3519; MIPS64R2-NEXT:  # %bb.2: # %entry
3520; MIPS64R2-NEXT:    and $2, $7, $5
3521; MIPS64R2-NEXT:    srlv $2, $2, $1
3522; MIPS64R2-NEXT:    seb $2, $2
3523; MIPS64R2-NEXT:  # %bb.3: # %entry
3524; MIPS64R2-NEXT:    jr $ra
3525; MIPS64R2-NEXT:    nop
3526;
3527; MIPS64R6-LABEL: AtomicLoadNand8:
3528; MIPS64R6:       # %bb.0: # %entry
3529; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3530; MIPS64R6-NEXT:    daddu $1, $1, $25
3531; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3532; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
3533; MIPS64R6-NEXT:    daddiu $2, $zero, -4
3534; MIPS64R6-NEXT:    and $3, $1, $2
3535; MIPS64R6-NEXT:    andi $1, $1, 3
3536; MIPS64R6-NEXT:    sll $1, $1, 3
3537; MIPS64R6-NEXT:    ori $2, $zero, 255
3538; MIPS64R6-NEXT:    sllv $5, $2, $1
3539; MIPS64R6-NEXT:    nor $6, $zero, $5
3540; MIPS64R6-NEXT:    sllv $4, $4, $1
3541; MIPS64R6-NEXT:  .LBB10_1: # %entry
3542; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
3543; MIPS64R6-NEXT:    ll $7, 0($3)
3544; MIPS64R6-NEXT:    and $8, $7, $4
3545; MIPS64R6-NEXT:    nor $8, $zero, $8
3546; MIPS64R6-NEXT:    and $8, $8, $5
3547; MIPS64R6-NEXT:    and $9, $7, $6
3548; MIPS64R6-NEXT:    or $9, $9, $8
3549; MIPS64R6-NEXT:    sc $9, 0($3)
3550; MIPS64R6-NEXT:    beqzc $9, .LBB10_1
3551; MIPS64R6-NEXT:  # %bb.2: # %entry
3552; MIPS64R6-NEXT:    and $2, $7, $5
3553; MIPS64R6-NEXT:    srlv $2, $2, $1
3554; MIPS64R6-NEXT:    seb $2, $2
3555; MIPS64R6-NEXT:  # %bb.3: # %entry
3556; MIPS64R6-NEXT:    jrc $ra
3557;
3558; MIPS64R6O0-LABEL: AtomicLoadNand8:
3559; MIPS64R6O0:       # %bb.0: # %entry
3560; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
3561; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3562; MIPS64R6O0-NEXT:    daddu $1, $1, $25
3563; MIPS64R6O0-NEXT:    daddiu $2, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3564; MIPS64R6O0-NEXT:    move $1, $4
3565; MIPS64R6O0-NEXT:    ld $2, %got_disp(y)($2)
3566; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
3567; MIPS64R6O0-NEXT:    and $5, $2, $3
3568; MIPS64R6O0-NEXT:    andi $2, $2, 3
3569; MIPS64R6O0-NEXT:    xori $2, $2, 3
3570; MIPS64R6O0-NEXT:    sll $9, $2, 3
3571; MIPS64R6O0-NEXT:    ori $2, $zero, 255
3572; MIPS64R6O0-NEXT:    sllv $7, $2, $9
3573; MIPS64R6O0-NEXT:    nor $8, $zero, $7
3574; MIPS64R6O0-NEXT:    sllv $6, $1, $9
3575; MIPS64R6O0-NEXT:  .LBB10_1: # %entry
3576; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3577; MIPS64R6O0-NEXT:    ll $2, 0($5)
3578; MIPS64R6O0-NEXT:    and $3, $2, $6
3579; MIPS64R6O0-NEXT:    nor $3, $zero, $3
3580; MIPS64R6O0-NEXT:    and $3, $3, $7
3581; MIPS64R6O0-NEXT:    and $4, $2, $8
3582; MIPS64R6O0-NEXT:    or $4, $4, $3
3583; MIPS64R6O0-NEXT:    sc $4, 0($5)
3584; MIPS64R6O0-NEXT:    beqzc $4, .LBB10_1
3585; MIPS64R6O0-NEXT:  # %bb.2: # %entry
3586; MIPS64R6O0-NEXT:    and $1, $2, $7
3587; MIPS64R6O0-NEXT:    srlv $1, $1, $9
3588; MIPS64R6O0-NEXT:    seb $1, $1
3589; MIPS64R6O0-NEXT:  # %bb.3: # %entry
3590; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
3591; MIPS64R6O0-NEXT:  # %bb.4: # %entry
3592; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
3593; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
3594; MIPS64R6O0-NEXT:    jrc $ra
3595;
3596; MM32-LABEL: AtomicLoadNand8:
3597; MM32:       # %bb.0: # %entry
3598; MM32-NEXT:    lui $2, %hi(_gp_disp)
3599; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3600; MM32-NEXT:    addu $2, $2, $25
3601; MM32-NEXT:    lw $1, %got(y)($2)
3602; MM32-NEXT:    addiu $2, $zero, -4
3603; MM32-NEXT:    and $3, $1, $2
3604; MM32-NEXT:    andi $1, $1, 3
3605; MM32-NEXT:    sll $1, $1, 3
3606; MM32-NEXT:    ori $2, $zero, 255
3607; MM32-NEXT:    sllv $5, $2, $1
3608; MM32-NEXT:    nor $6, $zero, $5
3609; MM32-NEXT:    sllv $4, $4, $1
3610; MM32-NEXT:  $BB10_1: # %entry
3611; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
3612; MM32-NEXT:    ll $7, 0($3)
3613; MM32-NEXT:    and $8, $7, $4
3614; MM32-NEXT:    nor $8, $zero, $8
3615; MM32-NEXT:    and $8, $8, $5
3616; MM32-NEXT:    and $9, $7, $6
3617; MM32-NEXT:    or $9, $9, $8
3618; MM32-NEXT:    sc $9, 0($3)
3619; MM32-NEXT:    beqzc $9, $BB10_1
3620; MM32-NEXT:  # %bb.2: # %entry
3621; MM32-NEXT:    and $2, $7, $5
3622; MM32-NEXT:    srlv $2, $2, $1
3623; MM32-NEXT:    seb $2, $2
3624; MM32-NEXT:  # %bb.3: # %entry
3625; MM32-NEXT:    jrc $ra
3626;
3627; O1-LABEL: AtomicLoadNand8:
3628; O1:       # %bb.0: # %entry
3629; O1-NEXT:    lui $2, %hi(_gp_disp)
3630; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
3631; O1-NEXT:    addu $1, $2, $25
3632; O1-NEXT:    lw $1, %got(y)($1)
3633; O1-NEXT:    addiu $2, $zero, -4
3634; O1-NEXT:    and $3, $1, $2
3635; O1-NEXT:    andi $1, $1, 3
3636; O1-NEXT:    sll $1, $1, 3
3637; O1-NEXT:    ori $2, $zero, 255
3638; O1-NEXT:    sllv $5, $2, $1
3639; O1-NEXT:    nor $6, $zero, $5
3640; O1-NEXT:    sllv $4, $4, $1
3641; O1-NEXT:  $BB10_1: # %entry
3642; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3643; O1-NEXT:    ll $7, 0($3)
3644; O1-NEXT:    and $8, $7, $4
3645; O1-NEXT:    nor $8, $zero, $8
3646; O1-NEXT:    and $8, $8, $5
3647; O1-NEXT:    and $9, $7, $6
3648; O1-NEXT:    or $9, $9, $8
3649; O1-NEXT:    sc $9, 0($3)
3650; O1-NEXT:    beqz $9, $BB10_1
3651; O1-NEXT:    nop
3652; O1-NEXT:  # %bb.2: # %entry
3653; O1-NEXT:    and $2, $7, $5
3654; O1-NEXT:    srlv $2, $2, $1
3655; O1-NEXT:    sll $2, $2, 24
3656; O1-NEXT:    sra $2, $2, 24
3657; O1-NEXT:  # %bb.3: # %entry
3658; O1-NEXT:    jr $ra
3659; O1-NEXT:    nop
3660;
3661; O2-LABEL: AtomicLoadNand8:
3662; O2:       # %bb.0: # %entry
3663; O2-NEXT:    lui $2, %hi(_gp_disp)
3664; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3665; O2-NEXT:    addu $1, $2, $25
3666; O2-NEXT:    lw $1, %got(y)($1)
3667; O2-NEXT:    addiu $2, $zero, -4
3668; O2-NEXT:    and $3, $1, $2
3669; O2-NEXT:    andi $1, $1, 3
3670; O2-NEXT:    sll $1, $1, 3
3671; O2-NEXT:    ori $2, $zero, 255
3672; O2-NEXT:    sllv $5, $2, $1
3673; O2-NEXT:    nor $6, $zero, $5
3674; O2-NEXT:    sllv $4, $4, $1
3675; O2-NEXT:  $BB10_1: # %entry
3676; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3677; O2-NEXT:    ll $7, 0($3)
3678; O2-NEXT:    and $8, $7, $4
3679; O2-NEXT:    nor $8, $zero, $8
3680; O2-NEXT:    and $8, $8, $5
3681; O2-NEXT:    and $9, $7, $6
3682; O2-NEXT:    or $9, $9, $8
3683; O2-NEXT:    sc $9, 0($3)
3684; O2-NEXT:    beqz $9, $BB10_1
3685; O2-NEXT:    nop
3686; O2-NEXT:  # %bb.2: # %entry
3687; O2-NEXT:    and $2, $7, $5
3688; O2-NEXT:    srlv $2, $2, $1
3689; O2-NEXT:    sll $2, $2, 24
3690; O2-NEXT:    sra $2, $2, 24
3691; O2-NEXT:  # %bb.3: # %entry
3692; O2-NEXT:    jr $ra
3693; O2-NEXT:    nop
3694;
3695; O3-LABEL: AtomicLoadNand8:
3696; O3:       # %bb.0: # %entry
3697; O3-NEXT:    lui $2, %hi(_gp_disp)
3698; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
3699; O3-NEXT:    addu $1, $2, $25
3700; O3-NEXT:    addiu $2, $zero, -4
3701; O3-NEXT:    lw $1, %got(y)($1)
3702; O3-NEXT:    and $3, $1, $2
3703; O3-NEXT:    andi $1, $1, 3
3704; O3-NEXT:    ori $2, $zero, 255
3705; O3-NEXT:    sll $1, $1, 3
3706; O3-NEXT:    sllv $5, $2, $1
3707; O3-NEXT:    sllv $4, $4, $1
3708; O3-NEXT:    nor $6, $zero, $5
3709; O3-NEXT:  $BB10_1: # %entry
3710; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3711; O3-NEXT:    ll $7, 0($3)
3712; O3-NEXT:    and $8, $7, $4
3713; O3-NEXT:    nor $8, $zero, $8
3714; O3-NEXT:    and $8, $8, $5
3715; O3-NEXT:    and $9, $7, $6
3716; O3-NEXT:    or $9, $9, $8
3717; O3-NEXT:    sc $9, 0($3)
3718; O3-NEXT:    beqz $9, $BB10_1
3719; O3-NEXT:    nop
3720; O3-NEXT:  # %bb.2: # %entry
3721; O3-NEXT:    and $2, $7, $5
3722; O3-NEXT:    srlv $2, $2, $1
3723; O3-NEXT:    sll $2, $2, 24
3724; O3-NEXT:    sra $2, $2, 24
3725; O3-NEXT:  # %bb.3: # %entry
3726; O3-NEXT:    jr $ra
3727; O3-NEXT:    nop
3728;
3729; MIPS32EB-LABEL: AtomicLoadNand8:
3730; MIPS32EB:       # %bb.0: # %entry
3731; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
3732; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
3733; MIPS32EB-NEXT:    addu $1, $2, $25
3734; MIPS32EB-NEXT:    lw $1, %got(y)($1)
3735; MIPS32EB-NEXT:    addiu $2, $zero, -4
3736; MIPS32EB-NEXT:    and $3, $1, $2
3737; MIPS32EB-NEXT:    andi $1, $1, 3
3738; MIPS32EB-NEXT:    xori $1, $1, 3
3739; MIPS32EB-NEXT:    sll $1, $1, 3
3740; MIPS32EB-NEXT:    ori $2, $zero, 255
3741; MIPS32EB-NEXT:    sllv $5, $2, $1
3742; MIPS32EB-NEXT:    nor $6, $zero, $5
3743; MIPS32EB-NEXT:    sllv $4, $4, $1
3744; MIPS32EB-NEXT:  $BB10_1: # %entry
3745; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
3746; MIPS32EB-NEXT:    ll $7, 0($3)
3747; MIPS32EB-NEXT:    and $8, $7, $4
3748; MIPS32EB-NEXT:    nor $8, $zero, $8
3749; MIPS32EB-NEXT:    and $8, $8, $5
3750; MIPS32EB-NEXT:    and $9, $7, $6
3751; MIPS32EB-NEXT:    or $9, $9, $8
3752; MIPS32EB-NEXT:    sc $9, 0($3)
3753; MIPS32EB-NEXT:    beqz $9, $BB10_1
3754; MIPS32EB-NEXT:    nop
3755; MIPS32EB-NEXT:  # %bb.2: # %entry
3756; MIPS32EB-NEXT:    and $2, $7, $5
3757; MIPS32EB-NEXT:    srlv $2, $2, $1
3758; MIPS32EB-NEXT:    sll $2, $2, 24
3759; MIPS32EB-NEXT:    sra $2, $2, 24
3760; MIPS32EB-NEXT:  # %bb.3: # %entry
3761; MIPS32EB-NEXT:    jr $ra
3762; MIPS32EB-NEXT:    nop
3763entry:
3764  %0 = atomicrmw nand ptr @y, i8 %incr monotonic
3765  ret i8 %0
3766
3767}
3768
3769define signext i8 @AtomicSwap8(i8 signext %newval) nounwind {
3770; MIPS32-LABEL: AtomicSwap8:
3771; MIPS32:       # %bb.0: # %entry
3772; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
3773; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3774; MIPS32-NEXT:    addu $1, $2, $25
3775; MIPS32-NEXT:    lw $1, %got(y)($1)
3776; MIPS32-NEXT:    addiu $2, $zero, -4
3777; MIPS32-NEXT:    and $3, $1, $2
3778; MIPS32-NEXT:    andi $1, $1, 3
3779; MIPS32-NEXT:    sll $1, $1, 3
3780; MIPS32-NEXT:    ori $2, $zero, 255
3781; MIPS32-NEXT:    sllv $5, $2, $1
3782; MIPS32-NEXT:    nor $6, $zero, $5
3783; MIPS32-NEXT:    sllv $4, $4, $1
3784; MIPS32-NEXT:  $BB11_1: # %entry
3785; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
3786; MIPS32-NEXT:    ll $7, 0($3)
3787; MIPS32-NEXT:    and $8, $4, $5
3788; MIPS32-NEXT:    and $9, $7, $6
3789; MIPS32-NEXT:    or $9, $9, $8
3790; MIPS32-NEXT:    sc $9, 0($3)
3791; MIPS32-NEXT:    beqz $9, $BB11_1
3792; MIPS32-NEXT:    nop
3793; MIPS32-NEXT:  # %bb.2: # %entry
3794; MIPS32-NEXT:    and $2, $7, $5
3795; MIPS32-NEXT:    srlv $2, $2, $1
3796; MIPS32-NEXT:    sll $2, $2, 24
3797; MIPS32-NEXT:    sra $2, $2, 24
3798; MIPS32-NEXT:  # %bb.3: # %entry
3799; MIPS32-NEXT:    jr $ra
3800; MIPS32-NEXT:    nop
3801;
3802; MIPS32O0-LABEL: AtomicSwap8:
3803; MIPS32O0:       # %bb.0: # %entry
3804; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
3805; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3806; MIPS32O0-NEXT:    addiu $sp, $sp, -8
3807; MIPS32O0-NEXT:    addu $1, $2, $25
3808; MIPS32O0-NEXT:    lw $1, %got(y)($1)
3809; MIPS32O0-NEXT:    addiu $2, $zero, -4
3810; MIPS32O0-NEXT:    and $5, $1, $2
3811; MIPS32O0-NEXT:    andi $1, $1, 3
3812; MIPS32O0-NEXT:    sll $9, $1, 3
3813; MIPS32O0-NEXT:    ori $1, $zero, 255
3814; MIPS32O0-NEXT:    sllv $7, $1, $9
3815; MIPS32O0-NEXT:    nor $8, $zero, $7
3816; MIPS32O0-NEXT:    sllv $6, $4, $9
3817; MIPS32O0-NEXT:  $BB11_1: # %entry
3818; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
3819; MIPS32O0-NEXT:    ll $2, 0($5)
3820; MIPS32O0-NEXT:    and $3, $6, $7
3821; MIPS32O0-NEXT:    and $4, $2, $8
3822; MIPS32O0-NEXT:    or $4, $4, $3
3823; MIPS32O0-NEXT:    sc $4, 0($5)
3824; MIPS32O0-NEXT:    beqz $4, $BB11_1
3825; MIPS32O0-NEXT:    nop
3826; MIPS32O0-NEXT:  # %bb.2: # %entry
3827; MIPS32O0-NEXT:    and $1, $2, $7
3828; MIPS32O0-NEXT:    srlv $1, $1, $9
3829; MIPS32O0-NEXT:    sll $1, $1, 24
3830; MIPS32O0-NEXT:    sra $1, $1, 24
3831; MIPS32O0-NEXT:  # %bb.3: # %entry
3832; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
3833; MIPS32O0-NEXT:  # %bb.4: # %entry
3834; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3835; MIPS32O0-NEXT:    sll $1, $1, 24
3836; MIPS32O0-NEXT:    sra $2, $1, 24
3837; MIPS32O0-NEXT:    addiu $sp, $sp, 8
3838; MIPS32O0-NEXT:    jr $ra
3839; MIPS32O0-NEXT:    nop
3840;
3841; MIPS32R2-LABEL: AtomicSwap8:
3842; MIPS32R2:       # %bb.0: # %entry
3843; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
3844; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3845; MIPS32R2-NEXT:    addu $1, $2, $25
3846; MIPS32R2-NEXT:    lw $1, %got(y)($1)
3847; MIPS32R2-NEXT:    addiu $2, $zero, -4
3848; MIPS32R2-NEXT:    and $3, $1, $2
3849; MIPS32R2-NEXT:    andi $1, $1, 3
3850; MIPS32R2-NEXT:    sll $1, $1, 3
3851; MIPS32R2-NEXT:    ori $2, $zero, 255
3852; MIPS32R2-NEXT:    sllv $5, $2, $1
3853; MIPS32R2-NEXT:    nor $6, $zero, $5
3854; MIPS32R2-NEXT:    sllv $4, $4, $1
3855; MIPS32R2-NEXT:  $BB11_1: # %entry
3856; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
3857; MIPS32R2-NEXT:    ll $7, 0($3)
3858; MIPS32R2-NEXT:    and $8, $4, $5
3859; MIPS32R2-NEXT:    and $9, $7, $6
3860; MIPS32R2-NEXT:    or $9, $9, $8
3861; MIPS32R2-NEXT:    sc $9, 0($3)
3862; MIPS32R2-NEXT:    beqz $9, $BB11_1
3863; MIPS32R2-NEXT:    nop
3864; MIPS32R2-NEXT:  # %bb.2: # %entry
3865; MIPS32R2-NEXT:    and $2, $7, $5
3866; MIPS32R2-NEXT:    srlv $2, $2, $1
3867; MIPS32R2-NEXT:    seb $2, $2
3868; MIPS32R2-NEXT:  # %bb.3: # %entry
3869; MIPS32R2-NEXT:    jr $ra
3870; MIPS32R2-NEXT:    nop
3871;
3872; MIPS32R6-LABEL: AtomicSwap8:
3873; MIPS32R6:       # %bb.0: # %entry
3874; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
3875; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
3876; MIPS32R6-NEXT:    addu $1, $2, $25
3877; MIPS32R6-NEXT:    lw $1, %got(y)($1)
3878; MIPS32R6-NEXT:    addiu $2, $zero, -4
3879; MIPS32R6-NEXT:    and $3, $1, $2
3880; MIPS32R6-NEXT:    andi $1, $1, 3
3881; MIPS32R6-NEXT:    sll $1, $1, 3
3882; MIPS32R6-NEXT:    ori $2, $zero, 255
3883; MIPS32R6-NEXT:    sllv $5, $2, $1
3884; MIPS32R6-NEXT:    nor $6, $zero, $5
3885; MIPS32R6-NEXT:    sllv $4, $4, $1
3886; MIPS32R6-NEXT:  $BB11_1: # %entry
3887; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
3888; MIPS32R6-NEXT:    ll $7, 0($3)
3889; MIPS32R6-NEXT:    and $8, $4, $5
3890; MIPS32R6-NEXT:    and $9, $7, $6
3891; MIPS32R6-NEXT:    or $9, $9, $8
3892; MIPS32R6-NEXT:    sc $9, 0($3)
3893; MIPS32R6-NEXT:    beqzc $9, $BB11_1
3894; MIPS32R6-NEXT:  # %bb.2: # %entry
3895; MIPS32R6-NEXT:    and $2, $7, $5
3896; MIPS32R6-NEXT:    srlv $2, $2, $1
3897; MIPS32R6-NEXT:    seb $2, $2
3898; MIPS32R6-NEXT:  # %bb.3: # %entry
3899; MIPS32R6-NEXT:    jrc $ra
3900;
3901; MIPS32R6O0-LABEL: AtomicSwap8:
3902; MIPS32R6O0:       # %bb.0: # %entry
3903; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
3904; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3905; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
3906; MIPS32R6O0-NEXT:    addu $1, $2, $25
3907; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a0
3908; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
3909; MIPS32R6O0-NEXT:    addiu $2, $zero, -4
3910; MIPS32R6O0-NEXT:    and $5, $1, $2
3911; MIPS32R6O0-NEXT:    andi $1, $1, 3
3912; MIPS32R6O0-NEXT:    sll $9, $1, 3
3913; MIPS32R6O0-NEXT:    ori $1, $zero, 255
3914; MIPS32R6O0-NEXT:    sllv $7, $1, $9
3915; MIPS32R6O0-NEXT:    nor $8, $zero, $7
3916; MIPS32R6O0-NEXT:    sllv $6, $4, $9
3917; MIPS32R6O0-NEXT:  $BB11_1: # %entry
3918; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3919; MIPS32R6O0-NEXT:    ll $2, 0($5)
3920; MIPS32R6O0-NEXT:    and $3, $6, $7
3921; MIPS32R6O0-NEXT:    and $4, $2, $8
3922; MIPS32R6O0-NEXT:    or $4, $4, $3
3923; MIPS32R6O0-NEXT:    sc $4, 0($5)
3924; MIPS32R6O0-NEXT:    beqzc $4, $BB11_1
3925; MIPS32R6O0-NEXT:  # %bb.2: # %entry
3926; MIPS32R6O0-NEXT:    and $1, $2, $7
3927; MIPS32R6O0-NEXT:    srlv $1, $1, $9
3928; MIPS32R6O0-NEXT:    seb $1, $1
3929; MIPS32R6O0-NEXT:  # %bb.3: # %entry
3930; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
3931; MIPS32R6O0-NEXT:  # %bb.4: # %entry
3932; MIPS32R6O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
3933; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
3934; MIPS32R6O0-NEXT:    jrc $ra
3935;
3936; MIPS4-LABEL: AtomicSwap8:
3937; MIPS4:       # %bb.0: # %entry
3938; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
3939; MIPS4-NEXT:    daddu $1, $1, $25
3940; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
3941; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
3942; MIPS4-NEXT:    daddiu $2, $zero, -4
3943; MIPS4-NEXT:    and $3, $1, $2
3944; MIPS4-NEXT:    andi $1, $1, 3
3945; MIPS4-NEXT:    sll $1, $1, 3
3946; MIPS4-NEXT:    ori $2, $zero, 255
3947; MIPS4-NEXT:    sllv $5, $2, $1
3948; MIPS4-NEXT:    nor $6, $zero, $5
3949; MIPS4-NEXT:    sllv $4, $4, $1
3950; MIPS4-NEXT:  .LBB11_1: # %entry
3951; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
3952; MIPS4-NEXT:    ll $7, 0($3)
3953; MIPS4-NEXT:    and $8, $4, $5
3954; MIPS4-NEXT:    and $9, $7, $6
3955; MIPS4-NEXT:    or $9, $9, $8
3956; MIPS4-NEXT:    sc $9, 0($3)
3957; MIPS4-NEXT:    beqz $9, .LBB11_1
3958; MIPS4-NEXT:    nop
3959; MIPS4-NEXT:  # %bb.2: # %entry
3960; MIPS4-NEXT:    and $2, $7, $5
3961; MIPS4-NEXT:    srlv $2, $2, $1
3962; MIPS4-NEXT:    sll $2, $2, 24
3963; MIPS4-NEXT:    sra $2, $2, 24
3964; MIPS4-NEXT:  # %bb.3: # %entry
3965; MIPS4-NEXT:    jr $ra
3966; MIPS4-NEXT:    nop
3967;
3968; MIPS64-LABEL: AtomicSwap8:
3969; MIPS64:       # %bb.0: # %entry
3970; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
3971; MIPS64-NEXT:    daddu $1, $1, $25
3972; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
3973; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
3974; MIPS64-NEXT:    daddiu $2, $zero, -4
3975; MIPS64-NEXT:    and $3, $1, $2
3976; MIPS64-NEXT:    andi $1, $1, 3
3977; MIPS64-NEXT:    sll $1, $1, 3
3978; MIPS64-NEXT:    ori $2, $zero, 255
3979; MIPS64-NEXT:    sllv $5, $2, $1
3980; MIPS64-NEXT:    nor $6, $zero, $5
3981; MIPS64-NEXT:    sllv $4, $4, $1
3982; MIPS64-NEXT:  .LBB11_1: # %entry
3983; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
3984; MIPS64-NEXT:    ll $7, 0($3)
3985; MIPS64-NEXT:    and $8, $4, $5
3986; MIPS64-NEXT:    and $9, $7, $6
3987; MIPS64-NEXT:    or $9, $9, $8
3988; MIPS64-NEXT:    sc $9, 0($3)
3989; MIPS64-NEXT:    beqz $9, .LBB11_1
3990; MIPS64-NEXT:    nop
3991; MIPS64-NEXT:  # %bb.2: # %entry
3992; MIPS64-NEXT:    and $2, $7, $5
3993; MIPS64-NEXT:    srlv $2, $2, $1
3994; MIPS64-NEXT:    sll $2, $2, 24
3995; MIPS64-NEXT:    sra $2, $2, 24
3996; MIPS64-NEXT:  # %bb.3: # %entry
3997; MIPS64-NEXT:    jr $ra
3998; MIPS64-NEXT:    nop
3999;
4000; MIPS64R2-LABEL: AtomicSwap8:
4001; MIPS64R2:       # %bb.0: # %entry
4002; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4003; MIPS64R2-NEXT:    daddu $1, $1, $25
4004; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4005; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
4006; MIPS64R2-NEXT:    daddiu $2, $zero, -4
4007; MIPS64R2-NEXT:    and $3, $1, $2
4008; MIPS64R2-NEXT:    andi $1, $1, 3
4009; MIPS64R2-NEXT:    sll $1, $1, 3
4010; MIPS64R2-NEXT:    ori $2, $zero, 255
4011; MIPS64R2-NEXT:    sllv $5, $2, $1
4012; MIPS64R2-NEXT:    nor $6, $zero, $5
4013; MIPS64R2-NEXT:    sllv $4, $4, $1
4014; MIPS64R2-NEXT:  .LBB11_1: # %entry
4015; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
4016; MIPS64R2-NEXT:    ll $7, 0($3)
4017; MIPS64R2-NEXT:    and $8, $4, $5
4018; MIPS64R2-NEXT:    and $9, $7, $6
4019; MIPS64R2-NEXT:    or $9, $9, $8
4020; MIPS64R2-NEXT:    sc $9, 0($3)
4021; MIPS64R2-NEXT:    beqz $9, .LBB11_1
4022; MIPS64R2-NEXT:    nop
4023; MIPS64R2-NEXT:  # %bb.2: # %entry
4024; MIPS64R2-NEXT:    and $2, $7, $5
4025; MIPS64R2-NEXT:    srlv $2, $2, $1
4026; MIPS64R2-NEXT:    seb $2, $2
4027; MIPS64R2-NEXT:  # %bb.3: # %entry
4028; MIPS64R2-NEXT:    jr $ra
4029; MIPS64R2-NEXT:    nop
4030;
4031; MIPS64R6-LABEL: AtomicSwap8:
4032; MIPS64R6:       # %bb.0: # %entry
4033; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4034; MIPS64R6-NEXT:    daddu $1, $1, $25
4035; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4036; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
4037; MIPS64R6-NEXT:    daddiu $2, $zero, -4
4038; MIPS64R6-NEXT:    and $3, $1, $2
4039; MIPS64R6-NEXT:    andi $1, $1, 3
4040; MIPS64R6-NEXT:    sll $1, $1, 3
4041; MIPS64R6-NEXT:    ori $2, $zero, 255
4042; MIPS64R6-NEXT:    sllv $5, $2, $1
4043; MIPS64R6-NEXT:    nor $6, $zero, $5
4044; MIPS64R6-NEXT:    sllv $4, $4, $1
4045; MIPS64R6-NEXT:  .LBB11_1: # %entry
4046; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
4047; MIPS64R6-NEXT:    ll $7, 0($3)
4048; MIPS64R6-NEXT:    and $8, $4, $5
4049; MIPS64R6-NEXT:    and $9, $7, $6
4050; MIPS64R6-NEXT:    or $9, $9, $8
4051; MIPS64R6-NEXT:    sc $9, 0($3)
4052; MIPS64R6-NEXT:    beqzc $9, .LBB11_1
4053; MIPS64R6-NEXT:  # %bb.2: # %entry
4054; MIPS64R6-NEXT:    and $2, $7, $5
4055; MIPS64R6-NEXT:    srlv $2, $2, $1
4056; MIPS64R6-NEXT:    seb $2, $2
4057; MIPS64R6-NEXT:  # %bb.3: # %entry
4058; MIPS64R6-NEXT:    jrc $ra
4059;
4060; MIPS64R6O0-LABEL: AtomicSwap8:
4061; MIPS64R6O0:       # %bb.0: # %entry
4062; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
4063; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4064; MIPS64R6O0-NEXT:    daddu $1, $1, $25
4065; MIPS64R6O0-NEXT:    daddiu $2, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4066; MIPS64R6O0-NEXT:    move $1, $4
4067; MIPS64R6O0-NEXT:    ld $2, %got_disp(y)($2)
4068; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
4069; MIPS64R6O0-NEXT:    and $5, $2, $3
4070; MIPS64R6O0-NEXT:    andi $2, $2, 3
4071; MIPS64R6O0-NEXT:    xori $2, $2, 3
4072; MIPS64R6O0-NEXT:    sll $9, $2, 3
4073; MIPS64R6O0-NEXT:    ori $2, $zero, 255
4074; MIPS64R6O0-NEXT:    sllv $7, $2, $9
4075; MIPS64R6O0-NEXT:    nor $8, $zero, $7
4076; MIPS64R6O0-NEXT:    sllv $6, $1, $9
4077; MIPS64R6O0-NEXT:  .LBB11_1: # %entry
4078; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4079; MIPS64R6O0-NEXT:    ll $2, 0($5)
4080; MIPS64R6O0-NEXT:    and $3, $6, $7
4081; MIPS64R6O0-NEXT:    and $4, $2, $8
4082; MIPS64R6O0-NEXT:    or $4, $4, $3
4083; MIPS64R6O0-NEXT:    sc $4, 0($5)
4084; MIPS64R6O0-NEXT:    beqzc $4, .LBB11_1
4085; MIPS64R6O0-NEXT:  # %bb.2: # %entry
4086; MIPS64R6O0-NEXT:    and $1, $2, $7
4087; MIPS64R6O0-NEXT:    srlv $1, $1, $9
4088; MIPS64R6O0-NEXT:    seb $1, $1
4089; MIPS64R6O0-NEXT:  # %bb.3: # %entry
4090; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
4091; MIPS64R6O0-NEXT:  # %bb.4: # %entry
4092; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
4093; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
4094; MIPS64R6O0-NEXT:    jrc $ra
4095;
4096; MM32-LABEL: AtomicSwap8:
4097; MM32:       # %bb.0: # %entry
4098; MM32-NEXT:    lui $2, %hi(_gp_disp)
4099; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4100; MM32-NEXT:    addu $2, $2, $25
4101; MM32-NEXT:    lw $1, %got(y)($2)
4102; MM32-NEXT:    addiu $2, $zero, -4
4103; MM32-NEXT:    and $3, $1, $2
4104; MM32-NEXT:    andi $1, $1, 3
4105; MM32-NEXT:    sll $1, $1, 3
4106; MM32-NEXT:    ori $2, $zero, 255
4107; MM32-NEXT:    sllv $5, $2, $1
4108; MM32-NEXT:    nor $6, $zero, $5
4109; MM32-NEXT:    sllv $4, $4, $1
4110; MM32-NEXT:  $BB11_1: # %entry
4111; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
4112; MM32-NEXT:    ll $7, 0($3)
4113; MM32-NEXT:    and $8, $4, $5
4114; MM32-NEXT:    and $9, $7, $6
4115; MM32-NEXT:    or $9, $9, $8
4116; MM32-NEXT:    sc $9, 0($3)
4117; MM32-NEXT:    beqzc $9, $BB11_1
4118; MM32-NEXT:  # %bb.2: # %entry
4119; MM32-NEXT:    and $2, $7, $5
4120; MM32-NEXT:    srlv $2, $2, $1
4121; MM32-NEXT:    seb $2, $2
4122; MM32-NEXT:  # %bb.3: # %entry
4123; MM32-NEXT:    jrc $ra
4124;
4125; O1-LABEL: AtomicSwap8:
4126; O1:       # %bb.0: # %entry
4127; O1-NEXT:    lui $2, %hi(_gp_disp)
4128; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
4129; O1-NEXT:    addu $1, $2, $25
4130; O1-NEXT:    lw $1, %got(y)($1)
4131; O1-NEXT:    addiu $2, $zero, -4
4132; O1-NEXT:    and $3, $1, $2
4133; O1-NEXT:    andi $1, $1, 3
4134; O1-NEXT:    sll $1, $1, 3
4135; O1-NEXT:    ori $2, $zero, 255
4136; O1-NEXT:    sllv $5, $2, $1
4137; O1-NEXT:    nor $6, $zero, $5
4138; O1-NEXT:    sllv $4, $4, $1
4139; O1-NEXT:  $BB11_1: # %entry
4140; O1-NEXT:    # =>This Inner Loop Header: Depth=1
4141; O1-NEXT:    ll $7, 0($3)
4142; O1-NEXT:    and $8, $4, $5
4143; O1-NEXT:    and $9, $7, $6
4144; O1-NEXT:    or $9, $9, $8
4145; O1-NEXT:    sc $9, 0($3)
4146; O1-NEXT:    beqz $9, $BB11_1
4147; O1-NEXT:    nop
4148; O1-NEXT:  # %bb.2: # %entry
4149; O1-NEXT:    and $2, $7, $5
4150; O1-NEXT:    srlv $2, $2, $1
4151; O1-NEXT:    sll $2, $2, 24
4152; O1-NEXT:    sra $2, $2, 24
4153; O1-NEXT:  # %bb.3: # %entry
4154; O1-NEXT:    jr $ra
4155; O1-NEXT:    nop
4156;
4157; O2-LABEL: AtomicSwap8:
4158; O2:       # %bb.0: # %entry
4159; O2-NEXT:    lui $2, %hi(_gp_disp)
4160; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4161; O2-NEXT:    addu $1, $2, $25
4162; O2-NEXT:    lw $1, %got(y)($1)
4163; O2-NEXT:    addiu $2, $zero, -4
4164; O2-NEXT:    and $3, $1, $2
4165; O2-NEXT:    andi $1, $1, 3
4166; O2-NEXT:    sll $1, $1, 3
4167; O2-NEXT:    ori $2, $zero, 255
4168; O2-NEXT:    sllv $5, $2, $1
4169; O2-NEXT:    nor $6, $zero, $5
4170; O2-NEXT:    sllv $4, $4, $1
4171; O2-NEXT:  $BB11_1: # %entry
4172; O2-NEXT:    # =>This Inner Loop Header: Depth=1
4173; O2-NEXT:    ll $7, 0($3)
4174; O2-NEXT:    and $8, $4, $5
4175; O2-NEXT:    and $9, $7, $6
4176; O2-NEXT:    or $9, $9, $8
4177; O2-NEXT:    sc $9, 0($3)
4178; O2-NEXT:    beqz $9, $BB11_1
4179; O2-NEXT:    nop
4180; O2-NEXT:  # %bb.2: # %entry
4181; O2-NEXT:    and $2, $7, $5
4182; O2-NEXT:    srlv $2, $2, $1
4183; O2-NEXT:    sll $2, $2, 24
4184; O2-NEXT:    sra $2, $2, 24
4185; O2-NEXT:  # %bb.3: # %entry
4186; O2-NEXT:    jr $ra
4187; O2-NEXT:    nop
4188;
4189; O3-LABEL: AtomicSwap8:
4190; O3:       # %bb.0: # %entry
4191; O3-NEXT:    lui $2, %hi(_gp_disp)
4192; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
4193; O3-NEXT:    addu $1, $2, $25
4194; O3-NEXT:    addiu $2, $zero, -4
4195; O3-NEXT:    lw $1, %got(y)($1)
4196; O3-NEXT:    and $3, $1, $2
4197; O3-NEXT:    andi $1, $1, 3
4198; O3-NEXT:    ori $2, $zero, 255
4199; O3-NEXT:    sll $1, $1, 3
4200; O3-NEXT:    sllv $5, $2, $1
4201; O3-NEXT:    sllv $4, $4, $1
4202; O3-NEXT:    nor $6, $zero, $5
4203; O3-NEXT:  $BB11_1: # %entry
4204; O3-NEXT:    # =>This Inner Loop Header: Depth=1
4205; O3-NEXT:    ll $7, 0($3)
4206; O3-NEXT:    and $8, $4, $5
4207; O3-NEXT:    and $9, $7, $6
4208; O3-NEXT:    or $9, $9, $8
4209; O3-NEXT:    sc $9, 0($3)
4210; O3-NEXT:    beqz $9, $BB11_1
4211; O3-NEXT:    nop
4212; O3-NEXT:  # %bb.2: # %entry
4213; O3-NEXT:    and $2, $7, $5
4214; O3-NEXT:    srlv $2, $2, $1
4215; O3-NEXT:    sll $2, $2, 24
4216; O3-NEXT:    sra $2, $2, 24
4217; O3-NEXT:  # %bb.3: # %entry
4218; O3-NEXT:    jr $ra
4219; O3-NEXT:    nop
4220;
4221; MIPS32EB-LABEL: AtomicSwap8:
4222; MIPS32EB:       # %bb.0: # %entry
4223; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
4224; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
4225; MIPS32EB-NEXT:    addu $1, $2, $25
4226; MIPS32EB-NEXT:    lw $1, %got(y)($1)
4227; MIPS32EB-NEXT:    addiu $2, $zero, -4
4228; MIPS32EB-NEXT:    and $3, $1, $2
4229; MIPS32EB-NEXT:    andi $1, $1, 3
4230; MIPS32EB-NEXT:    xori $1, $1, 3
4231; MIPS32EB-NEXT:    sll $1, $1, 3
4232; MIPS32EB-NEXT:    ori $2, $zero, 255
4233; MIPS32EB-NEXT:    sllv $5, $2, $1
4234; MIPS32EB-NEXT:    nor $6, $zero, $5
4235; MIPS32EB-NEXT:    sllv $4, $4, $1
4236; MIPS32EB-NEXT:  $BB11_1: # %entry
4237; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
4238; MIPS32EB-NEXT:    ll $7, 0($3)
4239; MIPS32EB-NEXT:    and $8, $4, $5
4240; MIPS32EB-NEXT:    and $9, $7, $6
4241; MIPS32EB-NEXT:    or $9, $9, $8
4242; MIPS32EB-NEXT:    sc $9, 0($3)
4243; MIPS32EB-NEXT:    beqz $9, $BB11_1
4244; MIPS32EB-NEXT:    nop
4245; MIPS32EB-NEXT:  # %bb.2: # %entry
4246; MIPS32EB-NEXT:    and $2, $7, $5
4247; MIPS32EB-NEXT:    srlv $2, $2, $1
4248; MIPS32EB-NEXT:    sll $2, $2, 24
4249; MIPS32EB-NEXT:    sra $2, $2, 24
4250; MIPS32EB-NEXT:  # %bb.3: # %entry
4251; MIPS32EB-NEXT:    jr $ra
4252; MIPS32EB-NEXT:    nop
4253entry:
4254  %0 = atomicrmw xchg ptr @y, i8 %newval monotonic
4255  ret i8 %0
4256}
4257
4258define signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind {
4259; MIPS32-LABEL: AtomicCmpSwap8:
4260; MIPS32:       # %bb.0: # %entry
4261; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
4262; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4263; MIPS32-NEXT:    addu $1, $2, $25
4264; MIPS32-NEXT:    lw $1, %got(y)($1)
4265; MIPS32-NEXT:    addiu $2, $zero, -4
4266; MIPS32-NEXT:    and $3, $1, $2
4267; MIPS32-NEXT:    andi $1, $1, 3
4268; MIPS32-NEXT:    sll $1, $1, 3
4269; MIPS32-NEXT:    ori $2, $zero, 255
4270; MIPS32-NEXT:    sllv $6, $2, $1
4271; MIPS32-NEXT:    nor $7, $zero, $6
4272; MIPS32-NEXT:    andi $2, $4, 255
4273; MIPS32-NEXT:    sllv $4, $2, $1
4274; MIPS32-NEXT:    andi $2, $5, 255
4275; MIPS32-NEXT:    sllv $5, $2, $1
4276; MIPS32-NEXT:  $BB12_1: # %entry
4277; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
4278; MIPS32-NEXT:    ll $8, 0($3)
4279; MIPS32-NEXT:    and $9, $8, $6
4280; MIPS32-NEXT:    bne $9, $4, $BB12_3
4281; MIPS32-NEXT:    nop
4282; MIPS32-NEXT:  # %bb.2: # %entry
4283; MIPS32-NEXT:    # in Loop: Header=BB12_1 Depth=1
4284; MIPS32-NEXT:    and $8, $8, $7
4285; MIPS32-NEXT:    or $8, $8, $5
4286; MIPS32-NEXT:    sc $8, 0($3)
4287; MIPS32-NEXT:    beqz $8, $BB12_1
4288; MIPS32-NEXT:    nop
4289; MIPS32-NEXT:  $BB12_3: # %entry
4290; MIPS32-NEXT:    srlv $2, $9, $1
4291; MIPS32-NEXT:    sll $2, $2, 24
4292; MIPS32-NEXT:    sra $2, $2, 24
4293; MIPS32-NEXT:  # %bb.4: # %entry
4294; MIPS32-NEXT:    jr $ra
4295; MIPS32-NEXT:    nop
4296;
4297; MIPS32O0-LABEL: AtomicCmpSwap8:
4298; MIPS32O0:       # %bb.0: # %entry
4299; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
4300; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
4301; MIPS32O0-NEXT:    addiu $sp, $sp, -8
4302; MIPS32O0-NEXT:    addu $3, $2, $25
4303; MIPS32O0-NEXT:    move $1, $5
4304; MIPS32O0-NEXT:    move $2, $4
4305; MIPS32O0-NEXT:    lw $3, %got(y)($3)
4306; MIPS32O0-NEXT:    addiu $4, $zero, -4
4307; MIPS32O0-NEXT:    and $4, $3, $4
4308; MIPS32O0-NEXT:    andi $3, $3, 3
4309; MIPS32O0-NEXT:    sll $9, $3, 3
4310; MIPS32O0-NEXT:    ori $3, $zero, 255
4311; MIPS32O0-NEXT:    sllv $5, $3, $9
4312; MIPS32O0-NEXT:    nor $7, $zero, $5
4313; MIPS32O0-NEXT:    andi $2, $2, 255
4314; MIPS32O0-NEXT:    sllv $6, $2, $9
4315; MIPS32O0-NEXT:    andi $1, $1, 255
4316; MIPS32O0-NEXT:    sllv $8, $1, $9
4317; MIPS32O0-NEXT:  $BB12_1: # %entry
4318; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
4319; MIPS32O0-NEXT:    ll $2, 0($4)
4320; MIPS32O0-NEXT:    and $3, $2, $5
4321; MIPS32O0-NEXT:    bne $3, $6, $BB12_3
4322; MIPS32O0-NEXT:    nop
4323; MIPS32O0-NEXT:  # %bb.2: # %entry
4324; MIPS32O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4325; MIPS32O0-NEXT:    and $2, $2, $7
4326; MIPS32O0-NEXT:    or $2, $2, $8
4327; MIPS32O0-NEXT:    sc $2, 0($4)
4328; MIPS32O0-NEXT:    beqz $2, $BB12_1
4329; MIPS32O0-NEXT:    nop
4330; MIPS32O0-NEXT:  $BB12_3: # %entry
4331; MIPS32O0-NEXT:    srlv $1, $3, $9
4332; MIPS32O0-NEXT:    sll $1, $1, 24
4333; MIPS32O0-NEXT:    sra $1, $1, 24
4334; MIPS32O0-NEXT:  # %bb.4: # %entry
4335; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
4336; MIPS32O0-NEXT:  # %bb.5: # %entry
4337; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
4338; MIPS32O0-NEXT:    sll $1, $1, 24
4339; MIPS32O0-NEXT:    sra $2, $1, 24
4340; MIPS32O0-NEXT:    addiu $sp, $sp, 8
4341; MIPS32O0-NEXT:    jr $ra
4342; MIPS32O0-NEXT:    nop
4343;
4344; MIPS32R2-LABEL: AtomicCmpSwap8:
4345; MIPS32R2:       # %bb.0: # %entry
4346; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
4347; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4348; MIPS32R2-NEXT:    addu $1, $2, $25
4349; MIPS32R2-NEXT:    lw $1, %got(y)($1)
4350; MIPS32R2-NEXT:    addiu $2, $zero, -4
4351; MIPS32R2-NEXT:    and $3, $1, $2
4352; MIPS32R2-NEXT:    andi $1, $1, 3
4353; MIPS32R2-NEXT:    sll $1, $1, 3
4354; MIPS32R2-NEXT:    ori $2, $zero, 255
4355; MIPS32R2-NEXT:    sllv $6, $2, $1
4356; MIPS32R2-NEXT:    nor $7, $zero, $6
4357; MIPS32R2-NEXT:    andi $2, $4, 255
4358; MIPS32R2-NEXT:    sllv $4, $2, $1
4359; MIPS32R2-NEXT:    andi $2, $5, 255
4360; MIPS32R2-NEXT:    sllv $5, $2, $1
4361; MIPS32R2-NEXT:  $BB12_1: # %entry
4362; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
4363; MIPS32R2-NEXT:    ll $8, 0($3)
4364; MIPS32R2-NEXT:    and $9, $8, $6
4365; MIPS32R2-NEXT:    bne $9, $4, $BB12_3
4366; MIPS32R2-NEXT:    nop
4367; MIPS32R2-NEXT:  # %bb.2: # %entry
4368; MIPS32R2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4369; MIPS32R2-NEXT:    and $8, $8, $7
4370; MIPS32R2-NEXT:    or $8, $8, $5
4371; MIPS32R2-NEXT:    sc $8, 0($3)
4372; MIPS32R2-NEXT:    beqz $8, $BB12_1
4373; MIPS32R2-NEXT:    nop
4374; MIPS32R2-NEXT:  $BB12_3: # %entry
4375; MIPS32R2-NEXT:    srlv $2, $9, $1
4376; MIPS32R2-NEXT:    seb $2, $2
4377; MIPS32R2-NEXT:  # %bb.4: # %entry
4378; MIPS32R2-NEXT:    jr $ra
4379; MIPS32R2-NEXT:    nop
4380;
4381; MIPS32R6-LABEL: AtomicCmpSwap8:
4382; MIPS32R6:       # %bb.0: # %entry
4383; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
4384; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
4385; MIPS32R6-NEXT:    addu $1, $2, $25
4386; MIPS32R6-NEXT:    lw $1, %got(y)($1)
4387; MIPS32R6-NEXT:    addiu $2, $zero, -4
4388; MIPS32R6-NEXT:    and $3, $1, $2
4389; MIPS32R6-NEXT:    andi $1, $1, 3
4390; MIPS32R6-NEXT:    sll $1, $1, 3
4391; MIPS32R6-NEXT:    ori $2, $zero, 255
4392; MIPS32R6-NEXT:    sllv $6, $2, $1
4393; MIPS32R6-NEXT:    nor $7, $zero, $6
4394; MIPS32R6-NEXT:    andi $2, $4, 255
4395; MIPS32R6-NEXT:    sllv $4, $2, $1
4396; MIPS32R6-NEXT:    andi $2, $5, 255
4397; MIPS32R6-NEXT:    sllv $5, $2, $1
4398; MIPS32R6-NEXT:  $BB12_1: # %entry
4399; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
4400; MIPS32R6-NEXT:    ll $8, 0($3)
4401; MIPS32R6-NEXT:    and $9, $8, $6
4402; MIPS32R6-NEXT:    bnec $9, $4, $BB12_3
4403; MIPS32R6-NEXT:  # %bb.2: # %entry
4404; MIPS32R6-NEXT:    # in Loop: Header=BB12_1 Depth=1
4405; MIPS32R6-NEXT:    and $8, $8, $7
4406; MIPS32R6-NEXT:    or $8, $8, $5
4407; MIPS32R6-NEXT:    sc $8, 0($3)
4408; MIPS32R6-NEXT:    beqzc $8, $BB12_1
4409; MIPS32R6-NEXT:  $BB12_3: # %entry
4410; MIPS32R6-NEXT:    srlv $2, $9, $1
4411; MIPS32R6-NEXT:    seb $2, $2
4412; MIPS32R6-NEXT:  # %bb.4: # %entry
4413; MIPS32R6-NEXT:    jrc $ra
4414;
4415; MIPS32R6O0-LABEL: AtomicCmpSwap8:
4416; MIPS32R6O0:       # %bb.0: # %entry
4417; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
4418; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
4419; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
4420; MIPS32R6O0-NEXT:    addu $3, $2, $25
4421; MIPS32R6O0-NEXT:    move $1, $5
4422; MIPS32R6O0-NEXT:    move $2, $4
4423; MIPS32R6O0-NEXT:    # kill: def $a1 killed $at
4424; MIPS32R6O0-NEXT:    # kill: def $a0 killed $v0
4425; MIPS32R6O0-NEXT:    lw $3, %got(y)($3)
4426; MIPS32R6O0-NEXT:    addiu $4, $zero, -4
4427; MIPS32R6O0-NEXT:    and $4, $3, $4
4428; MIPS32R6O0-NEXT:    andi $3, $3, 3
4429; MIPS32R6O0-NEXT:    sll $9, $3, 3
4430; MIPS32R6O0-NEXT:    ori $3, $zero, 255
4431; MIPS32R6O0-NEXT:    sllv $5, $3, $9
4432; MIPS32R6O0-NEXT:    nor $7, $zero, $5
4433; MIPS32R6O0-NEXT:    andi $2, $2, 255
4434; MIPS32R6O0-NEXT:    sllv $6, $2, $9
4435; MIPS32R6O0-NEXT:    andi $1, $1, 255
4436; MIPS32R6O0-NEXT:    sllv $8, $1, $9
4437; MIPS32R6O0-NEXT:  $BB12_1: # %entry
4438; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4439; MIPS32R6O0-NEXT:    ll $2, 0($4)
4440; MIPS32R6O0-NEXT:    and $3, $2, $5
4441; MIPS32R6O0-NEXT:    bnec $3, $6, $BB12_3
4442; MIPS32R6O0-NEXT:  # %bb.2: # %entry
4443; MIPS32R6O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4444; MIPS32R6O0-NEXT:    and $2, $2, $7
4445; MIPS32R6O0-NEXT:    or $2, $2, $8
4446; MIPS32R6O0-NEXT:    sc $2, 0($4)
4447; MIPS32R6O0-NEXT:    beqzc $2, $BB12_1
4448; MIPS32R6O0-NEXT:  $BB12_3: # %entry
4449; MIPS32R6O0-NEXT:    srlv $1, $3, $9
4450; MIPS32R6O0-NEXT:    seb $1, $1
4451; MIPS32R6O0-NEXT:  # %bb.4: # %entry
4452; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
4453; MIPS32R6O0-NEXT:  # %bb.5: # %entry
4454; MIPS32R6O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
4455; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
4456; MIPS32R6O0-NEXT:    jrc $ra
4457;
4458; MIPS4-LABEL: AtomicCmpSwap8:
4459; MIPS4:       # %bb.0: # %entry
4460; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4461; MIPS4-NEXT:    daddu $1, $1, $25
4462; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4463; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
4464; MIPS4-NEXT:    daddiu $2, $zero, -4
4465; MIPS4-NEXT:    and $3, $1, $2
4466; MIPS4-NEXT:    andi $1, $1, 3
4467; MIPS4-NEXT:    sll $1, $1, 3
4468; MIPS4-NEXT:    ori $2, $zero, 255
4469; MIPS4-NEXT:    sllv $6, $2, $1
4470; MIPS4-NEXT:    nor $7, $zero, $6
4471; MIPS4-NEXT:    andi $2, $4, 255
4472; MIPS4-NEXT:    sllv $4, $2, $1
4473; MIPS4-NEXT:    andi $2, $5, 255
4474; MIPS4-NEXT:    sllv $5, $2, $1
4475; MIPS4-NEXT:  .LBB12_1: # %entry
4476; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
4477; MIPS4-NEXT:    ll $8, 0($3)
4478; MIPS4-NEXT:    and $9, $8, $6
4479; MIPS4-NEXT:    bne $9, $4, .LBB12_3
4480; MIPS4-NEXT:    nop
4481; MIPS4-NEXT:  # %bb.2: # %entry
4482; MIPS4-NEXT:    # in Loop: Header=BB12_1 Depth=1
4483; MIPS4-NEXT:    and $8, $8, $7
4484; MIPS4-NEXT:    or $8, $8, $5
4485; MIPS4-NEXT:    sc $8, 0($3)
4486; MIPS4-NEXT:    beqz $8, .LBB12_1
4487; MIPS4-NEXT:    nop
4488; MIPS4-NEXT:  .LBB12_3: # %entry
4489; MIPS4-NEXT:    srlv $2, $9, $1
4490; MIPS4-NEXT:    sll $2, $2, 24
4491; MIPS4-NEXT:    sra $2, $2, 24
4492; MIPS4-NEXT:  # %bb.4: # %entry
4493; MIPS4-NEXT:    jr $ra
4494; MIPS4-NEXT:    nop
4495;
4496; MIPS64-LABEL: AtomicCmpSwap8:
4497; MIPS64:       # %bb.0: # %entry
4498; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4499; MIPS64-NEXT:    daddu $1, $1, $25
4500; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4501; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
4502; MIPS64-NEXT:    daddiu $2, $zero, -4
4503; MIPS64-NEXT:    and $3, $1, $2
4504; MIPS64-NEXT:    andi $1, $1, 3
4505; MIPS64-NEXT:    sll $1, $1, 3
4506; MIPS64-NEXT:    ori $2, $zero, 255
4507; MIPS64-NEXT:    sllv $6, $2, $1
4508; MIPS64-NEXT:    nor $7, $zero, $6
4509; MIPS64-NEXT:    andi $2, $4, 255
4510; MIPS64-NEXT:    sllv $4, $2, $1
4511; MIPS64-NEXT:    andi $2, $5, 255
4512; MIPS64-NEXT:    sllv $5, $2, $1
4513; MIPS64-NEXT:  .LBB12_1: # %entry
4514; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
4515; MIPS64-NEXT:    ll $8, 0($3)
4516; MIPS64-NEXT:    and $9, $8, $6
4517; MIPS64-NEXT:    bne $9, $4, .LBB12_3
4518; MIPS64-NEXT:    nop
4519; MIPS64-NEXT:  # %bb.2: # %entry
4520; MIPS64-NEXT:    # in Loop: Header=BB12_1 Depth=1
4521; MIPS64-NEXT:    and $8, $8, $7
4522; MIPS64-NEXT:    or $8, $8, $5
4523; MIPS64-NEXT:    sc $8, 0($3)
4524; MIPS64-NEXT:    beqz $8, .LBB12_1
4525; MIPS64-NEXT:    nop
4526; MIPS64-NEXT:  .LBB12_3: # %entry
4527; MIPS64-NEXT:    srlv $2, $9, $1
4528; MIPS64-NEXT:    sll $2, $2, 24
4529; MIPS64-NEXT:    sra $2, $2, 24
4530; MIPS64-NEXT:  # %bb.4: # %entry
4531; MIPS64-NEXT:    jr $ra
4532; MIPS64-NEXT:    nop
4533;
4534; MIPS64R2-LABEL: AtomicCmpSwap8:
4535; MIPS64R2:       # %bb.0: # %entry
4536; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4537; MIPS64R2-NEXT:    daddu $1, $1, $25
4538; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4539; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
4540; MIPS64R2-NEXT:    daddiu $2, $zero, -4
4541; MIPS64R2-NEXT:    and $3, $1, $2
4542; MIPS64R2-NEXT:    andi $1, $1, 3
4543; MIPS64R2-NEXT:    sll $1, $1, 3
4544; MIPS64R2-NEXT:    ori $2, $zero, 255
4545; MIPS64R2-NEXT:    sllv $6, $2, $1
4546; MIPS64R2-NEXT:    nor $7, $zero, $6
4547; MIPS64R2-NEXT:    andi $2, $4, 255
4548; MIPS64R2-NEXT:    sllv $4, $2, $1
4549; MIPS64R2-NEXT:    andi $2, $5, 255
4550; MIPS64R2-NEXT:    sllv $5, $2, $1
4551; MIPS64R2-NEXT:  .LBB12_1: # %entry
4552; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
4553; MIPS64R2-NEXT:    ll $8, 0($3)
4554; MIPS64R2-NEXT:    and $9, $8, $6
4555; MIPS64R2-NEXT:    bne $9, $4, .LBB12_3
4556; MIPS64R2-NEXT:    nop
4557; MIPS64R2-NEXT:  # %bb.2: # %entry
4558; MIPS64R2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4559; MIPS64R2-NEXT:    and $8, $8, $7
4560; MIPS64R2-NEXT:    or $8, $8, $5
4561; MIPS64R2-NEXT:    sc $8, 0($3)
4562; MIPS64R2-NEXT:    beqz $8, .LBB12_1
4563; MIPS64R2-NEXT:    nop
4564; MIPS64R2-NEXT:  .LBB12_3: # %entry
4565; MIPS64R2-NEXT:    srlv $2, $9, $1
4566; MIPS64R2-NEXT:    seb $2, $2
4567; MIPS64R2-NEXT:  # %bb.4: # %entry
4568; MIPS64R2-NEXT:    jr $ra
4569; MIPS64R2-NEXT:    nop
4570;
4571; MIPS64R6-LABEL: AtomicCmpSwap8:
4572; MIPS64R6:       # %bb.0: # %entry
4573; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4574; MIPS64R6-NEXT:    daddu $1, $1, $25
4575; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4576; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
4577; MIPS64R6-NEXT:    daddiu $2, $zero, -4
4578; MIPS64R6-NEXT:    and $3, $1, $2
4579; MIPS64R6-NEXT:    andi $1, $1, 3
4580; MIPS64R6-NEXT:    sll $1, $1, 3
4581; MIPS64R6-NEXT:    ori $2, $zero, 255
4582; MIPS64R6-NEXT:    sllv $6, $2, $1
4583; MIPS64R6-NEXT:    nor $7, $zero, $6
4584; MIPS64R6-NEXT:    andi $2, $4, 255
4585; MIPS64R6-NEXT:    sllv $4, $2, $1
4586; MIPS64R6-NEXT:    andi $2, $5, 255
4587; MIPS64R6-NEXT:    sllv $5, $2, $1
4588; MIPS64R6-NEXT:  .LBB12_1: # %entry
4589; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
4590; MIPS64R6-NEXT:    ll $8, 0($3)
4591; MIPS64R6-NEXT:    and $9, $8, $6
4592; MIPS64R6-NEXT:    bnec $9, $4, .LBB12_3
4593; MIPS64R6-NEXT:  # %bb.2: # %entry
4594; MIPS64R6-NEXT:    # in Loop: Header=BB12_1 Depth=1
4595; MIPS64R6-NEXT:    and $8, $8, $7
4596; MIPS64R6-NEXT:    or $8, $8, $5
4597; MIPS64R6-NEXT:    sc $8, 0($3)
4598; MIPS64R6-NEXT:    beqzc $8, .LBB12_1
4599; MIPS64R6-NEXT:  .LBB12_3: # %entry
4600; MIPS64R6-NEXT:    srlv $2, $9, $1
4601; MIPS64R6-NEXT:    seb $2, $2
4602; MIPS64R6-NEXT:  # %bb.4: # %entry
4603; MIPS64R6-NEXT:    jrc $ra
4604;
4605; MIPS64R6O0-LABEL: AtomicCmpSwap8:
4606; MIPS64R6O0:       # %bb.0: # %entry
4607; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
4608; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4609; MIPS64R6O0-NEXT:    daddu $1, $1, $25
4610; MIPS64R6O0-NEXT:    daddiu $3, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4611; MIPS64R6O0-NEXT:    move $1, $5
4612; MIPS64R6O0-NEXT:    move $2, $4
4613; MIPS64R6O0-NEXT:    ld $3, %got_disp(y)($3)
4614; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
4615; MIPS64R6O0-NEXT:    and $4, $3, $4
4616; MIPS64R6O0-NEXT:    andi $3, $3, 3
4617; MIPS64R6O0-NEXT:    xori $3, $3, 3
4618; MIPS64R6O0-NEXT:    sll $9, $3, 3
4619; MIPS64R6O0-NEXT:    ori $3, $zero, 255
4620; MIPS64R6O0-NEXT:    sllv $5, $3, $9
4621; MIPS64R6O0-NEXT:    nor $7, $zero, $5
4622; MIPS64R6O0-NEXT:    andi $2, $2, 255
4623; MIPS64R6O0-NEXT:    sllv $6, $2, $9
4624; MIPS64R6O0-NEXT:    andi $1, $1, 255
4625; MIPS64R6O0-NEXT:    sllv $8, $1, $9
4626; MIPS64R6O0-NEXT:  .LBB12_1: # %entry
4627; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4628; MIPS64R6O0-NEXT:    ll $2, 0($4)
4629; MIPS64R6O0-NEXT:    and $3, $2, $5
4630; MIPS64R6O0-NEXT:    bnec $3, $6, .LBB12_3
4631; MIPS64R6O0-NEXT:  # %bb.2: # %entry
4632; MIPS64R6O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4633; MIPS64R6O0-NEXT:    and $2, $2, $7
4634; MIPS64R6O0-NEXT:    or $2, $2, $8
4635; MIPS64R6O0-NEXT:    sc $2, 0($4)
4636; MIPS64R6O0-NEXT:    beqzc $2, .LBB12_1
4637; MIPS64R6O0-NEXT:  .LBB12_3: # %entry
4638; MIPS64R6O0-NEXT:    srlv $1, $3, $9
4639; MIPS64R6O0-NEXT:    seb $1, $1
4640; MIPS64R6O0-NEXT:  # %bb.4: # %entry
4641; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
4642; MIPS64R6O0-NEXT:  # %bb.5: # %entry
4643; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
4644; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
4645; MIPS64R6O0-NEXT:    jrc $ra
4646;
4647; MM32-LABEL: AtomicCmpSwap8:
4648; MM32:       # %bb.0: # %entry
4649; MM32-NEXT:    lui $2, %hi(_gp_disp)
4650; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4651; MM32-NEXT:    addu $2, $2, $25
4652; MM32-NEXT:    lw $1, %got(y)($2)
4653; MM32-NEXT:    addiu $2, $zero, -4
4654; MM32-NEXT:    and $3, $1, $2
4655; MM32-NEXT:    andi $1, $1, 3
4656; MM32-NEXT:    sll $1, $1, 3
4657; MM32-NEXT:    ori $2, $zero, 255
4658; MM32-NEXT:    sllv $6, $2, $1
4659; MM32-NEXT:    nor $7, $zero, $6
4660; MM32-NEXT:    andi $2, $4, 255
4661; MM32-NEXT:    sllv $4, $2, $1
4662; MM32-NEXT:    andi $2, $5, 255
4663; MM32-NEXT:    sllv $5, $2, $1
4664; MM32-NEXT:  $BB12_1: # %entry
4665; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
4666; MM32-NEXT:    ll $8, 0($3)
4667; MM32-NEXT:    and $9, $8, $6
4668; MM32-NEXT:    bne $9, $4, $BB12_3
4669; MM32-NEXT:    nop
4670; MM32-NEXT:  # %bb.2: # %entry
4671; MM32-NEXT:    # in Loop: Header=BB12_1 Depth=1
4672; MM32-NEXT:    and $8, $8, $7
4673; MM32-NEXT:    or $8, $8, $5
4674; MM32-NEXT:    sc $8, 0($3)
4675; MM32-NEXT:    beqzc $8, $BB12_1
4676; MM32-NEXT:  $BB12_3: # %entry
4677; MM32-NEXT:    srlv $2, $9, $1
4678; MM32-NEXT:    seb $2, $2
4679; MM32-NEXT:  # %bb.4: # %entry
4680; MM32-NEXT:    jrc $ra
4681;
4682; O1-LABEL: AtomicCmpSwap8:
4683; O1:       # %bb.0: # %entry
4684; O1-NEXT:    lui $2, %hi(_gp_disp)
4685; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
4686; O1-NEXT:    addu $1, $2, $25
4687; O1-NEXT:    lw $1, %got(y)($1)
4688; O1-NEXT:    addiu $2, $zero, -4
4689; O1-NEXT:    and $3, $1, $2
4690; O1-NEXT:    andi $1, $1, 3
4691; O1-NEXT:    sll $1, $1, 3
4692; O1-NEXT:    ori $2, $zero, 255
4693; O1-NEXT:    sllv $6, $2, $1
4694; O1-NEXT:    nor $7, $zero, $6
4695; O1-NEXT:    andi $2, $4, 255
4696; O1-NEXT:    sllv $4, $2, $1
4697; O1-NEXT:    andi $2, $5, 255
4698; O1-NEXT:    sllv $5, $2, $1
4699; O1-NEXT:  $BB12_1: # %entry
4700; O1-NEXT:    # =>This Inner Loop Header: Depth=1
4701; O1-NEXT:    ll $8, 0($3)
4702; O1-NEXT:    and $9, $8, $6
4703; O1-NEXT:    bne $9, $4, $BB12_3
4704; O1-NEXT:    nop
4705; O1-NEXT:  # %bb.2: # %entry
4706; O1-NEXT:    # in Loop: Header=BB12_1 Depth=1
4707; O1-NEXT:    and $8, $8, $7
4708; O1-NEXT:    or $8, $8, $5
4709; O1-NEXT:    sc $8, 0($3)
4710; O1-NEXT:    beqz $8, $BB12_1
4711; O1-NEXT:    nop
4712; O1-NEXT:  $BB12_3: # %entry
4713; O1-NEXT:    srlv $2, $9, $1
4714; O1-NEXT:    sll $2, $2, 24
4715; O1-NEXT:    sra $2, $2, 24
4716; O1-NEXT:  # %bb.4: # %entry
4717; O1-NEXT:    jr $ra
4718; O1-NEXT:    nop
4719;
4720; O2-LABEL: AtomicCmpSwap8:
4721; O2:       # %bb.0: # %entry
4722; O2-NEXT:    lui $2, %hi(_gp_disp)
4723; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4724; O2-NEXT:    addu $1, $2, $25
4725; O2-NEXT:    lw $1, %got(y)($1)
4726; O2-NEXT:    addiu $2, $zero, -4
4727; O2-NEXT:    and $3, $1, $2
4728; O2-NEXT:    andi $1, $1, 3
4729; O2-NEXT:    sll $1, $1, 3
4730; O2-NEXT:    ori $2, $zero, 255
4731; O2-NEXT:    sllv $6, $2, $1
4732; O2-NEXT:    nor $7, $zero, $6
4733; O2-NEXT:    andi $2, $4, 255
4734; O2-NEXT:    sllv $4, $2, $1
4735; O2-NEXT:    andi $2, $5, 255
4736; O2-NEXT:    sllv $5, $2, $1
4737; O2-NEXT:  $BB12_1: # %entry
4738; O2-NEXT:    # =>This Inner Loop Header: Depth=1
4739; O2-NEXT:    ll $8, 0($3)
4740; O2-NEXT:    and $9, $8, $6
4741; O2-NEXT:    bne $9, $4, $BB12_3
4742; O2-NEXT:    nop
4743; O2-NEXT:  # %bb.2: # %entry
4744; O2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4745; O2-NEXT:    and $8, $8, $7
4746; O2-NEXT:    or $8, $8, $5
4747; O2-NEXT:    sc $8, 0($3)
4748; O2-NEXT:    beqz $8, $BB12_1
4749; O2-NEXT:    nop
4750; O2-NEXT:  $BB12_3: # %entry
4751; O2-NEXT:    srlv $2, $9, $1
4752; O2-NEXT:    sll $2, $2, 24
4753; O2-NEXT:    sra $2, $2, 24
4754; O2-NEXT:  # %bb.4: # %entry
4755; O2-NEXT:    jr $ra
4756; O2-NEXT:    nop
4757;
4758; O3-LABEL: AtomicCmpSwap8:
4759; O3:       # %bb.0: # %entry
4760; O3-NEXT:    lui $2, %hi(_gp_disp)
4761; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
4762; O3-NEXT:    addu $1, $2, $25
4763; O3-NEXT:    addiu $2, $zero, -4
4764; O3-NEXT:    lw $1, %got(y)($1)
4765; O3-NEXT:    and $3, $1, $2
4766; O3-NEXT:    andi $1, $1, 3
4767; O3-NEXT:    ori $2, $zero, 255
4768; O3-NEXT:    sll $1, $1, 3
4769; O3-NEXT:    sllv $6, $2, $1
4770; O3-NEXT:    andi $2, $4, 255
4771; O3-NEXT:    sllv $4, $2, $1
4772; O3-NEXT:    andi $2, $5, 255
4773; O3-NEXT:    nor $7, $zero, $6
4774; O3-NEXT:    sllv $5, $2, $1
4775; O3-NEXT:  $BB12_1: # %entry
4776; O3-NEXT:    # =>This Inner Loop Header: Depth=1
4777; O3-NEXT:    ll $8, 0($3)
4778; O3-NEXT:    and $9, $8, $6
4779; O3-NEXT:    bne $9, $4, $BB12_3
4780; O3-NEXT:    nop
4781; O3-NEXT:  # %bb.2: # %entry
4782; O3-NEXT:    # in Loop: Header=BB12_1 Depth=1
4783; O3-NEXT:    and $8, $8, $7
4784; O3-NEXT:    or $8, $8, $5
4785; O3-NEXT:    sc $8, 0($3)
4786; O3-NEXT:    beqz $8, $BB12_1
4787; O3-NEXT:    nop
4788; O3-NEXT:  $BB12_3: # %entry
4789; O3-NEXT:    srlv $2, $9, $1
4790; O3-NEXT:    sll $2, $2, 24
4791; O3-NEXT:    sra $2, $2, 24
4792; O3-NEXT:  # %bb.4: # %entry
4793; O3-NEXT:    jr $ra
4794; O3-NEXT:    nop
4795;
4796; MIPS32EB-LABEL: AtomicCmpSwap8:
4797; MIPS32EB:       # %bb.0: # %entry
4798; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
4799; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
4800; MIPS32EB-NEXT:    addu $1, $2, $25
4801; MIPS32EB-NEXT:    lw $1, %got(y)($1)
4802; MIPS32EB-NEXT:    addiu $2, $zero, -4
4803; MIPS32EB-NEXT:    and $3, $1, $2
4804; MIPS32EB-NEXT:    andi $1, $1, 3
4805; MIPS32EB-NEXT:    xori $1, $1, 3
4806; MIPS32EB-NEXT:    sll $1, $1, 3
4807; MIPS32EB-NEXT:    ori $2, $zero, 255
4808; MIPS32EB-NEXT:    sllv $6, $2, $1
4809; MIPS32EB-NEXT:    nor $7, $zero, $6
4810; MIPS32EB-NEXT:    andi $2, $4, 255
4811; MIPS32EB-NEXT:    sllv $4, $2, $1
4812; MIPS32EB-NEXT:    andi $2, $5, 255
4813; MIPS32EB-NEXT:    sllv $5, $2, $1
4814; MIPS32EB-NEXT:  $BB12_1: # %entry
4815; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
4816; MIPS32EB-NEXT:    ll $8, 0($3)
4817; MIPS32EB-NEXT:    and $9, $8, $6
4818; MIPS32EB-NEXT:    bne $9, $4, $BB12_3
4819; MIPS32EB-NEXT:    nop
4820; MIPS32EB-NEXT:  # %bb.2: # %entry
4821; MIPS32EB-NEXT:    # in Loop: Header=BB12_1 Depth=1
4822; MIPS32EB-NEXT:    and $8, $8, $7
4823; MIPS32EB-NEXT:    or $8, $8, $5
4824; MIPS32EB-NEXT:    sc $8, 0($3)
4825; MIPS32EB-NEXT:    beqz $8, $BB12_1
4826; MIPS32EB-NEXT:    nop
4827; MIPS32EB-NEXT:  $BB12_3: # %entry
4828; MIPS32EB-NEXT:    srlv $2, $9, $1
4829; MIPS32EB-NEXT:    sll $2, $2, 24
4830; MIPS32EB-NEXT:    sra $2, $2, 24
4831; MIPS32EB-NEXT:  # %bb.4: # %entry
4832; MIPS32EB-NEXT:    jr $ra
4833; MIPS32EB-NEXT:    nop
4834entry:
4835  %pair0 = cmpxchg ptr @y, i8 %oldval, i8 %newval monotonic monotonic
4836  %0 = extractvalue { i8, i1 } %pair0, 0
4837  ret i8 %0
4838}
4839
4840define i1 @AtomicCmpSwapRes8(ptr %ptr, i8 signext %oldval, i8 signext %newval) nounwind {
4841; MIPS32-LABEL: AtomicCmpSwapRes8:
4842; MIPS32:       # %bb.0: # %entry
4843; MIPS32-NEXT:    addiu $1, $zero, -4
4844; MIPS32-NEXT:    and $2, $4, $1
4845; MIPS32-NEXT:    andi $1, $4, 3
4846; MIPS32-NEXT:    sll $3, $1, 3
4847; MIPS32-NEXT:    ori $1, $zero, 255
4848; MIPS32-NEXT:    sllv $4, $1, $3
4849; MIPS32-NEXT:    nor $7, $zero, $4
4850; MIPS32-NEXT:    andi $1, $5, 255
4851; MIPS32-NEXT:    sllv $8, $1, $3
4852; MIPS32-NEXT:    andi $1, $6, 255
4853; MIPS32-NEXT:    sllv $6, $1, $3
4854; MIPS32-NEXT:  $BB13_1: # %entry
4855; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
4856; MIPS32-NEXT:    ll $9, 0($2)
4857; MIPS32-NEXT:    and $10, $9, $4
4858; MIPS32-NEXT:    bne $10, $8, $BB13_3
4859; MIPS32-NEXT:    nop
4860; MIPS32-NEXT:  # %bb.2: # %entry
4861; MIPS32-NEXT:    # in Loop: Header=BB13_1 Depth=1
4862; MIPS32-NEXT:    and $9, $9, $7
4863; MIPS32-NEXT:    or $9, $9, $6
4864; MIPS32-NEXT:    sc $9, 0($2)
4865; MIPS32-NEXT:    beqz $9, $BB13_1
4866; MIPS32-NEXT:    nop
4867; MIPS32-NEXT:  $BB13_3: # %entry
4868; MIPS32-NEXT:    srlv $1, $10, $3
4869; MIPS32-NEXT:    sll $1, $1, 24
4870; MIPS32-NEXT:    sra $1, $1, 24
4871; MIPS32-NEXT:  # %bb.4: # %entry
4872; MIPS32-NEXT:    xor $1, $1, $5
4873; MIPS32-NEXT:    jr $ra
4874; MIPS32-NEXT:    sltiu $2, $1, 1
4875;
4876; MIPS32O0-LABEL: AtomicCmpSwapRes8:
4877; MIPS32O0:       # %bb.0: # %entry
4878; MIPS32O0-NEXT:    addiu $sp, $sp, -8
4879; MIPS32O0-NEXT:    move $1, $6
4880; MIPS32O0-NEXT:    move $2, $5
4881; MIPS32O0-NEXT:    move $3, $4
4882; MIPS32O0-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
4883; MIPS32O0-NEXT:    addiu $4, $zero, -4
4884; MIPS32O0-NEXT:    and $4, $3, $4
4885; MIPS32O0-NEXT:    andi $3, $3, 3
4886; MIPS32O0-NEXT:    sll $9, $3, 3
4887; MIPS32O0-NEXT:    ori $3, $zero, 255
4888; MIPS32O0-NEXT:    sllv $5, $3, $9
4889; MIPS32O0-NEXT:    nor $7, $zero, $5
4890; MIPS32O0-NEXT:    andi $2, $2, 255
4891; MIPS32O0-NEXT:    sllv $6, $2, $9
4892; MIPS32O0-NEXT:    andi $1, $1, 255
4893; MIPS32O0-NEXT:    sllv $8, $1, $9
4894; MIPS32O0-NEXT:  $BB13_1: # %entry
4895; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
4896; MIPS32O0-NEXT:    ll $2, 0($4)
4897; MIPS32O0-NEXT:    and $3, $2, $5
4898; MIPS32O0-NEXT:    bne $3, $6, $BB13_3
4899; MIPS32O0-NEXT:    nop
4900; MIPS32O0-NEXT:  # %bb.2: # %entry
4901; MIPS32O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
4902; MIPS32O0-NEXT:    and $2, $2, $7
4903; MIPS32O0-NEXT:    or $2, $2, $8
4904; MIPS32O0-NEXT:    sc $2, 0($4)
4905; MIPS32O0-NEXT:    beqz $2, $BB13_1
4906; MIPS32O0-NEXT:    nop
4907; MIPS32O0-NEXT:  $BB13_3: # %entry
4908; MIPS32O0-NEXT:    srlv $1, $3, $9
4909; MIPS32O0-NEXT:    sll $1, $1, 24
4910; MIPS32O0-NEXT:    sra $1, $1, 24
4911; MIPS32O0-NEXT:  # %bb.4: # %entry
4912; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
4913; MIPS32O0-NEXT:  # %bb.5: # %entry
4914; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
4915; MIPS32O0-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
4916; MIPS32O0-NEXT:    sll $2, $2, 24
4917; MIPS32O0-NEXT:    sra $2, $2, 24
4918; MIPS32O0-NEXT:    xor $1, $1, $2
4919; MIPS32O0-NEXT:    sltiu $2, $1, 1
4920; MIPS32O0-NEXT:    addiu $sp, $sp, 8
4921; MIPS32O0-NEXT:    jr $ra
4922; MIPS32O0-NEXT:    nop
4923;
4924; MIPS32R2-LABEL: AtomicCmpSwapRes8:
4925; MIPS32R2:       # %bb.0: # %entry
4926; MIPS32R2-NEXT:    addiu $1, $zero, -4
4927; MIPS32R2-NEXT:    and $2, $4, $1
4928; MIPS32R2-NEXT:    andi $1, $4, 3
4929; MIPS32R2-NEXT:    sll $3, $1, 3
4930; MIPS32R2-NEXT:    ori $1, $zero, 255
4931; MIPS32R2-NEXT:    sllv $4, $1, $3
4932; MIPS32R2-NEXT:    nor $7, $zero, $4
4933; MIPS32R2-NEXT:    andi $1, $5, 255
4934; MIPS32R2-NEXT:    sllv $8, $1, $3
4935; MIPS32R2-NEXT:    andi $1, $6, 255
4936; MIPS32R2-NEXT:    sllv $6, $1, $3
4937; MIPS32R2-NEXT:  $BB13_1: # %entry
4938; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
4939; MIPS32R2-NEXT:    ll $9, 0($2)
4940; MIPS32R2-NEXT:    and $10, $9, $4
4941; MIPS32R2-NEXT:    bne $10, $8, $BB13_3
4942; MIPS32R2-NEXT:    nop
4943; MIPS32R2-NEXT:  # %bb.2: # %entry
4944; MIPS32R2-NEXT:    # in Loop: Header=BB13_1 Depth=1
4945; MIPS32R2-NEXT:    and $9, $9, $7
4946; MIPS32R2-NEXT:    or $9, $9, $6
4947; MIPS32R2-NEXT:    sc $9, 0($2)
4948; MIPS32R2-NEXT:    beqz $9, $BB13_1
4949; MIPS32R2-NEXT:    nop
4950; MIPS32R2-NEXT:  $BB13_3: # %entry
4951; MIPS32R2-NEXT:    srlv $1, $10, $3
4952; MIPS32R2-NEXT:    seb $1, $1
4953; MIPS32R2-NEXT:  # %bb.4: # %entry
4954; MIPS32R2-NEXT:    xor $1, $1, $5
4955; MIPS32R2-NEXT:    jr $ra
4956; MIPS32R2-NEXT:    sltiu $2, $1, 1
4957;
4958; MIPS32R6-LABEL: AtomicCmpSwapRes8:
4959; MIPS32R6:       # %bb.0: # %entry
4960; MIPS32R6-NEXT:    addiu $1, $zero, -4
4961; MIPS32R6-NEXT:    and $2, $4, $1
4962; MIPS32R6-NEXT:    andi $1, $4, 3
4963; MIPS32R6-NEXT:    sll $3, $1, 3
4964; MIPS32R6-NEXT:    ori $1, $zero, 255
4965; MIPS32R6-NEXT:    sllv $4, $1, $3
4966; MIPS32R6-NEXT:    nor $7, $zero, $4
4967; MIPS32R6-NEXT:    andi $1, $5, 255
4968; MIPS32R6-NEXT:    sllv $8, $1, $3
4969; MIPS32R6-NEXT:    andi $1, $6, 255
4970; MIPS32R6-NEXT:    sllv $6, $1, $3
4971; MIPS32R6-NEXT:  $BB13_1: # %entry
4972; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
4973; MIPS32R6-NEXT:    ll $9, 0($2)
4974; MIPS32R6-NEXT:    and $10, $9, $4
4975; MIPS32R6-NEXT:    bnec $10, $8, $BB13_3
4976; MIPS32R6-NEXT:  # %bb.2: # %entry
4977; MIPS32R6-NEXT:    # in Loop: Header=BB13_1 Depth=1
4978; MIPS32R6-NEXT:    and $9, $9, $7
4979; MIPS32R6-NEXT:    or $9, $9, $6
4980; MIPS32R6-NEXT:    sc $9, 0($2)
4981; MIPS32R6-NEXT:    beqzc $9, $BB13_1
4982; MIPS32R6-NEXT:  $BB13_3: # %entry
4983; MIPS32R6-NEXT:    srlv $1, $10, $3
4984; MIPS32R6-NEXT:    seb $1, $1
4985; MIPS32R6-NEXT:  # %bb.4: # %entry
4986; MIPS32R6-NEXT:    xor $1, $1, $5
4987; MIPS32R6-NEXT:    jr $ra
4988; MIPS32R6-NEXT:    sltiu $2, $1, 1
4989;
4990; MIPS32R6O0-LABEL: AtomicCmpSwapRes8:
4991; MIPS32R6O0:       # %bb.0: # %entry
4992; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
4993; MIPS32R6O0-NEXT:    move $1, $6
4994; MIPS32R6O0-NEXT:    move $2, $5
4995; MIPS32R6O0-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
4996; MIPS32R6O0-NEXT:    move $3, $4
4997; MIPS32R6O0-NEXT:    # kill: def $a2 killed $at
4998; MIPS32R6O0-NEXT:    # kill: def $a1 killed $v0
4999; MIPS32R6O0-NEXT:    addiu $4, $zero, -4
5000; MIPS32R6O0-NEXT:    and $4, $3, $4
5001; MIPS32R6O0-NEXT:    andi $3, $3, 3
5002; MIPS32R6O0-NEXT:    sll $9, $3, 3
5003; MIPS32R6O0-NEXT:    ori $3, $zero, 255
5004; MIPS32R6O0-NEXT:    sllv $5, $3, $9
5005; MIPS32R6O0-NEXT:    nor $7, $zero, $5
5006; MIPS32R6O0-NEXT:    andi $2, $2, 255
5007; MIPS32R6O0-NEXT:    sllv $6, $2, $9
5008; MIPS32R6O0-NEXT:    andi $1, $1, 255
5009; MIPS32R6O0-NEXT:    sllv $8, $1, $9
5010; MIPS32R6O0-NEXT:  $BB13_1: # %entry
5011; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5012; MIPS32R6O0-NEXT:    ll $2, 0($4)
5013; MIPS32R6O0-NEXT:    and $3, $2, $5
5014; MIPS32R6O0-NEXT:    bnec $3, $6, $BB13_3
5015; MIPS32R6O0-NEXT:  # %bb.2: # %entry
5016; MIPS32R6O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
5017; MIPS32R6O0-NEXT:    and $2, $2, $7
5018; MIPS32R6O0-NEXT:    or $2, $2, $8
5019; MIPS32R6O0-NEXT:    sc $2, 0($4)
5020; MIPS32R6O0-NEXT:    beqzc $2, $BB13_1
5021; MIPS32R6O0-NEXT:  $BB13_3: # %entry
5022; MIPS32R6O0-NEXT:    srlv $1, $3, $9
5023; MIPS32R6O0-NEXT:    seb $1, $1
5024; MIPS32R6O0-NEXT:  # %bb.4: # %entry
5025; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
5026; MIPS32R6O0-NEXT:  # %bb.5: # %entry
5027; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5028; MIPS32R6O0-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
5029; MIPS32R6O0-NEXT:    xor $1, $1, $2
5030; MIPS32R6O0-NEXT:    sltiu $2, $1, 1
5031; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
5032; MIPS32R6O0-NEXT:    jrc $ra
5033;
5034; MIPS4-LABEL: AtomicCmpSwapRes8:
5035; MIPS4:       # %bb.0: # %entry
5036; MIPS4-NEXT:    daddiu $1, $zero, -4
5037; MIPS4-NEXT:    and $2, $4, $1
5038; MIPS4-NEXT:    andi $1, $4, 3
5039; MIPS4-NEXT:    sll $3, $1, 3
5040; MIPS4-NEXT:    ori $1, $zero, 255
5041; MIPS4-NEXT:    sllv $4, $1, $3
5042; MIPS4-NEXT:    nor $7, $zero, $4
5043; MIPS4-NEXT:    andi $1, $5, 255
5044; MIPS4-NEXT:    sllv $8, $1, $3
5045; MIPS4-NEXT:    andi $1, $6, 255
5046; MIPS4-NEXT:    sllv $6, $1, $3
5047; MIPS4-NEXT:  .LBB13_1: # %entry
5048; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
5049; MIPS4-NEXT:    ll $9, 0($2)
5050; MIPS4-NEXT:    and $10, $9, $4
5051; MIPS4-NEXT:    bne $10, $8, .LBB13_3
5052; MIPS4-NEXT:    nop
5053; MIPS4-NEXT:  # %bb.2: # %entry
5054; MIPS4-NEXT:    # in Loop: Header=BB13_1 Depth=1
5055; MIPS4-NEXT:    and $9, $9, $7
5056; MIPS4-NEXT:    or $9, $9, $6
5057; MIPS4-NEXT:    sc $9, 0($2)
5058; MIPS4-NEXT:    beqz $9, .LBB13_1
5059; MIPS4-NEXT:    nop
5060; MIPS4-NEXT:  .LBB13_3: # %entry
5061; MIPS4-NEXT:    srlv $1, $10, $3
5062; MIPS4-NEXT:    sll $1, $1, 24
5063; MIPS4-NEXT:    sra $1, $1, 24
5064; MIPS4-NEXT:  # %bb.4: # %entry
5065; MIPS4-NEXT:    xor $1, $1, $5
5066; MIPS4-NEXT:    jr $ra
5067; MIPS4-NEXT:    sltiu $2, $1, 1
5068;
5069; MIPS64-LABEL: AtomicCmpSwapRes8:
5070; MIPS64:       # %bb.0: # %entry
5071; MIPS64-NEXT:    daddiu $1, $zero, -4
5072; MIPS64-NEXT:    and $2, $4, $1
5073; MIPS64-NEXT:    andi $1, $4, 3
5074; MIPS64-NEXT:    sll $3, $1, 3
5075; MIPS64-NEXT:    ori $1, $zero, 255
5076; MIPS64-NEXT:    sllv $4, $1, $3
5077; MIPS64-NEXT:    nor $7, $zero, $4
5078; MIPS64-NEXT:    andi $1, $5, 255
5079; MIPS64-NEXT:    sllv $8, $1, $3
5080; MIPS64-NEXT:    andi $1, $6, 255
5081; MIPS64-NEXT:    sllv $6, $1, $3
5082; MIPS64-NEXT:  .LBB13_1: # %entry
5083; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
5084; MIPS64-NEXT:    ll $9, 0($2)
5085; MIPS64-NEXT:    and $10, $9, $4
5086; MIPS64-NEXT:    bne $10, $8, .LBB13_3
5087; MIPS64-NEXT:    nop
5088; MIPS64-NEXT:  # %bb.2: # %entry
5089; MIPS64-NEXT:    # in Loop: Header=BB13_1 Depth=1
5090; MIPS64-NEXT:    and $9, $9, $7
5091; MIPS64-NEXT:    or $9, $9, $6
5092; MIPS64-NEXT:    sc $9, 0($2)
5093; MIPS64-NEXT:    beqz $9, .LBB13_1
5094; MIPS64-NEXT:    nop
5095; MIPS64-NEXT:  .LBB13_3: # %entry
5096; MIPS64-NEXT:    srlv $1, $10, $3
5097; MIPS64-NEXT:    sll $1, $1, 24
5098; MIPS64-NEXT:    sra $1, $1, 24
5099; MIPS64-NEXT:  # %bb.4: # %entry
5100; MIPS64-NEXT:    xor $1, $1, $5
5101; MIPS64-NEXT:    jr $ra
5102; MIPS64-NEXT:    sltiu $2, $1, 1
5103;
5104; MIPS64R2-LABEL: AtomicCmpSwapRes8:
5105; MIPS64R2:       # %bb.0: # %entry
5106; MIPS64R2-NEXT:    daddiu $1, $zero, -4
5107; MIPS64R2-NEXT:    and $2, $4, $1
5108; MIPS64R2-NEXT:    andi $1, $4, 3
5109; MIPS64R2-NEXT:    sll $3, $1, 3
5110; MIPS64R2-NEXT:    ori $1, $zero, 255
5111; MIPS64R2-NEXT:    sllv $4, $1, $3
5112; MIPS64R2-NEXT:    nor $7, $zero, $4
5113; MIPS64R2-NEXT:    andi $1, $5, 255
5114; MIPS64R2-NEXT:    sllv $8, $1, $3
5115; MIPS64R2-NEXT:    andi $1, $6, 255
5116; MIPS64R2-NEXT:    sllv $6, $1, $3
5117; MIPS64R2-NEXT:  .LBB13_1: # %entry
5118; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
5119; MIPS64R2-NEXT:    ll $9, 0($2)
5120; MIPS64R2-NEXT:    and $10, $9, $4
5121; MIPS64R2-NEXT:    bne $10, $8, .LBB13_3
5122; MIPS64R2-NEXT:    nop
5123; MIPS64R2-NEXT:  # %bb.2: # %entry
5124; MIPS64R2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5125; MIPS64R2-NEXT:    and $9, $9, $7
5126; MIPS64R2-NEXT:    or $9, $9, $6
5127; MIPS64R2-NEXT:    sc $9, 0($2)
5128; MIPS64R2-NEXT:    beqz $9, .LBB13_1
5129; MIPS64R2-NEXT:    nop
5130; MIPS64R2-NEXT:  .LBB13_3: # %entry
5131; MIPS64R2-NEXT:    srlv $1, $10, $3
5132; MIPS64R2-NEXT:    seb $1, $1
5133; MIPS64R2-NEXT:  # %bb.4: # %entry
5134; MIPS64R2-NEXT:    xor $1, $1, $5
5135; MIPS64R2-NEXT:    jr $ra
5136; MIPS64R2-NEXT:    sltiu $2, $1, 1
5137;
5138; MIPS64R6-LABEL: AtomicCmpSwapRes8:
5139; MIPS64R6:       # %bb.0: # %entry
5140; MIPS64R6-NEXT:    daddiu $1, $zero, -4
5141; MIPS64R6-NEXT:    and $2, $4, $1
5142; MIPS64R6-NEXT:    andi $1, $4, 3
5143; MIPS64R6-NEXT:    sll $3, $1, 3
5144; MIPS64R6-NEXT:    ori $1, $zero, 255
5145; MIPS64R6-NEXT:    sllv $4, $1, $3
5146; MIPS64R6-NEXT:    nor $7, $zero, $4
5147; MIPS64R6-NEXT:    andi $1, $5, 255
5148; MIPS64R6-NEXT:    sllv $8, $1, $3
5149; MIPS64R6-NEXT:    andi $1, $6, 255
5150; MIPS64R6-NEXT:    sllv $6, $1, $3
5151; MIPS64R6-NEXT:  .LBB13_1: # %entry
5152; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
5153; MIPS64R6-NEXT:    ll $9, 0($2)
5154; MIPS64R6-NEXT:    and $10, $9, $4
5155; MIPS64R6-NEXT:    bnec $10, $8, .LBB13_3
5156; MIPS64R6-NEXT:  # %bb.2: # %entry
5157; MIPS64R6-NEXT:    # in Loop: Header=BB13_1 Depth=1
5158; MIPS64R6-NEXT:    and $9, $9, $7
5159; MIPS64R6-NEXT:    or $9, $9, $6
5160; MIPS64R6-NEXT:    sc $9, 0($2)
5161; MIPS64R6-NEXT:    beqzc $9, .LBB13_1
5162; MIPS64R6-NEXT:  .LBB13_3: # %entry
5163; MIPS64R6-NEXT:    srlv $1, $10, $3
5164; MIPS64R6-NEXT:    seb $1, $1
5165; MIPS64R6-NEXT:  # %bb.4: # %entry
5166; MIPS64R6-NEXT:    xor $1, $1, $5
5167; MIPS64R6-NEXT:    jr $ra
5168; MIPS64R6-NEXT:    sltiu $2, $1, 1
5169;
5170; MIPS64R6O0-LABEL: AtomicCmpSwapRes8:
5171; MIPS64R6O0:       # %bb.0: # %entry
5172; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
5173; MIPS64R6O0-NEXT:    move $3, $4
5174; MIPS64R6O0-NEXT:    move $1, $6
5175; MIPS64R6O0-NEXT:    move $2, $5
5176; MIPS64R6O0-NEXT:    sw $2, 8($sp) # 4-byte Folded Spill
5177; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
5178; MIPS64R6O0-NEXT:    and $4, $3, $4
5179; MIPS64R6O0-NEXT:    andi $3, $3, 3
5180; MIPS64R6O0-NEXT:    xori $3, $3, 3
5181; MIPS64R6O0-NEXT:    sll $9, $3, 3
5182; MIPS64R6O0-NEXT:    ori $3, $zero, 255
5183; MIPS64R6O0-NEXT:    sllv $5, $3, $9
5184; MIPS64R6O0-NEXT:    nor $7, $zero, $5
5185; MIPS64R6O0-NEXT:    andi $2, $2, 255
5186; MIPS64R6O0-NEXT:    sllv $6, $2, $9
5187; MIPS64R6O0-NEXT:    andi $1, $1, 255
5188; MIPS64R6O0-NEXT:    sllv $8, $1, $9
5189; MIPS64R6O0-NEXT:  .LBB13_1: # %entry
5190; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5191; MIPS64R6O0-NEXT:    ll $2, 0($4)
5192; MIPS64R6O0-NEXT:    and $3, $2, $5
5193; MIPS64R6O0-NEXT:    bnec $3, $6, .LBB13_3
5194; MIPS64R6O0-NEXT:  # %bb.2: # %entry
5195; MIPS64R6O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
5196; MIPS64R6O0-NEXT:    and $2, $2, $7
5197; MIPS64R6O0-NEXT:    or $2, $2, $8
5198; MIPS64R6O0-NEXT:    sc $2, 0($4)
5199; MIPS64R6O0-NEXT:    beqzc $2, .LBB13_1
5200; MIPS64R6O0-NEXT:  .LBB13_3: # %entry
5201; MIPS64R6O0-NEXT:    srlv $1, $3, $9
5202; MIPS64R6O0-NEXT:    seb $1, $1
5203; MIPS64R6O0-NEXT:  # %bb.4: # %entry
5204; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
5205; MIPS64R6O0-NEXT:  # %bb.5: # %entry
5206; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
5207; MIPS64R6O0-NEXT:    lw $2, 8($sp) # 4-byte Folded Reload
5208; MIPS64R6O0-NEXT:    xor $1, $1, $2
5209; MIPS64R6O0-NEXT:    sltiu $2, $1, 1
5210; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
5211; MIPS64R6O0-NEXT:    jrc $ra
5212;
5213; MM32-LABEL: AtomicCmpSwapRes8:
5214; MM32:       # %bb.0: # %entry
5215; MM32-NEXT:    addiu $1, $zero, -4
5216; MM32-NEXT:    and $2, $4, $1
5217; MM32-NEXT:    andi $1, $4, 3
5218; MM32-NEXT:    sll $3, $1, 3
5219; MM32-NEXT:    ori $1, $zero, 255
5220; MM32-NEXT:    sllv $4, $1, $3
5221; MM32-NEXT:    nor $7, $zero, $4
5222; MM32-NEXT:    andi $1, $5, 255
5223; MM32-NEXT:    sllv $8, $1, $3
5224; MM32-NEXT:    andi $1, $6, 255
5225; MM32-NEXT:    sllv $6, $1, $3
5226; MM32-NEXT:  $BB13_1: # %entry
5227; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
5228; MM32-NEXT:    ll $9, 0($2)
5229; MM32-NEXT:    and $10, $9, $4
5230; MM32-NEXT:    bne $10, $8, $BB13_3
5231; MM32-NEXT:    nop
5232; MM32-NEXT:  # %bb.2: # %entry
5233; MM32-NEXT:    # in Loop: Header=BB13_1 Depth=1
5234; MM32-NEXT:    and $9, $9, $7
5235; MM32-NEXT:    or $9, $9, $6
5236; MM32-NEXT:    sc $9, 0($2)
5237; MM32-NEXT:    beqzc $9, $BB13_1
5238; MM32-NEXT:  $BB13_3: # %entry
5239; MM32-NEXT:    srlv $1, $10, $3
5240; MM32-NEXT:    seb $1, $1
5241; MM32-NEXT:  # %bb.4: # %entry
5242; MM32-NEXT:    xor $1, $1, $5
5243; MM32-NEXT:    jr $ra
5244; MM32-NEXT:    sltiu $2, $1, 1
5245;
5246; O1-LABEL: AtomicCmpSwapRes8:
5247; O1:       # %bb.0: # %entry
5248; O1-NEXT:    addiu $1, $zero, -4
5249; O1-NEXT:    and $2, $4, $1
5250; O1-NEXT:    andi $1, $4, 3
5251; O1-NEXT:    sll $3, $1, 3
5252; O1-NEXT:    ori $1, $zero, 255
5253; O1-NEXT:    sllv $4, $1, $3
5254; O1-NEXT:    nor $7, $zero, $4
5255; O1-NEXT:    andi $1, $5, 255
5256; O1-NEXT:    sllv $8, $1, $3
5257; O1-NEXT:    andi $1, $6, 255
5258; O1-NEXT:    sllv $6, $1, $3
5259; O1-NEXT:  $BB13_1: # %entry
5260; O1-NEXT:    # =>This Inner Loop Header: Depth=1
5261; O1-NEXT:    ll $9, 0($2)
5262; O1-NEXT:    and $10, $9, $4
5263; O1-NEXT:    bne $10, $8, $BB13_3
5264; O1-NEXT:    nop
5265; O1-NEXT:  # %bb.2: # %entry
5266; O1-NEXT:    # in Loop: Header=BB13_1 Depth=1
5267; O1-NEXT:    and $9, $9, $7
5268; O1-NEXT:    or $9, $9, $6
5269; O1-NEXT:    sc $9, 0($2)
5270; O1-NEXT:    beqz $9, $BB13_1
5271; O1-NEXT:    nop
5272; O1-NEXT:  $BB13_3: # %entry
5273; O1-NEXT:    srlv $1, $10, $3
5274; O1-NEXT:    sll $1, $1, 24
5275; O1-NEXT:    sra $1, $1, 24
5276; O1-NEXT:  # %bb.4: # %entry
5277; O1-NEXT:    xor $1, $1, $5
5278; O1-NEXT:    jr $ra
5279; O1-NEXT:    sltiu $2, $1, 1
5280;
5281; O2-LABEL: AtomicCmpSwapRes8:
5282; O2:       # %bb.0: # %entry
5283; O2-NEXT:    addiu $1, $zero, -4
5284; O2-NEXT:    and $2, $4, $1
5285; O2-NEXT:    andi $1, $4, 3
5286; O2-NEXT:    sll $3, $1, 3
5287; O2-NEXT:    ori $1, $zero, 255
5288; O2-NEXT:    sllv $4, $1, $3
5289; O2-NEXT:    nor $7, $zero, $4
5290; O2-NEXT:    andi $1, $5, 255
5291; O2-NEXT:    sllv $8, $1, $3
5292; O2-NEXT:    andi $1, $6, 255
5293; O2-NEXT:    sllv $6, $1, $3
5294; O2-NEXT:  $BB13_1: # %entry
5295; O2-NEXT:    # =>This Inner Loop Header: Depth=1
5296; O2-NEXT:    ll $9, 0($2)
5297; O2-NEXT:    and $10, $9, $4
5298; O2-NEXT:    bne $10, $8, $BB13_3
5299; O2-NEXT:    nop
5300; O2-NEXT:  # %bb.2: # %entry
5301; O2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5302; O2-NEXT:    and $9, $9, $7
5303; O2-NEXT:    or $9, $9, $6
5304; O2-NEXT:    sc $9, 0($2)
5305; O2-NEXT:    beqz $9, $BB13_1
5306; O2-NEXT:    nop
5307; O2-NEXT:  $BB13_3: # %entry
5308; O2-NEXT:    srlv $1, $10, $3
5309; O2-NEXT:    sll $1, $1, 24
5310; O2-NEXT:    sra $1, $1, 24
5311; O2-NEXT:  # %bb.4: # %entry
5312; O2-NEXT:    xor $1, $1, $5
5313; O2-NEXT:    jr $ra
5314; O2-NEXT:    sltiu $2, $1, 1
5315;
5316; O3-LABEL: AtomicCmpSwapRes8:
5317; O3:       # %bb.0: # %entry
5318; O3-NEXT:    addiu $1, $zero, -4
5319; O3-NEXT:    and $2, $4, $1
5320; O3-NEXT:    andi $1, $4, 3
5321; O3-NEXT:    sll $3, $1, 3
5322; O3-NEXT:    ori $1, $zero, 255
5323; O3-NEXT:    sllv $4, $1, $3
5324; O3-NEXT:    andi $1, $5, 255
5325; O3-NEXT:    sllv $8, $1, $3
5326; O3-NEXT:    andi $1, $6, 255
5327; O3-NEXT:    nor $7, $zero, $4
5328; O3-NEXT:    sllv $6, $1, $3
5329; O3-NEXT:  $BB13_1: # %entry
5330; O3-NEXT:    # =>This Inner Loop Header: Depth=1
5331; O3-NEXT:    ll $9, 0($2)
5332; O3-NEXT:    and $10, $9, $4
5333; O3-NEXT:    bne $10, $8, $BB13_3
5334; O3-NEXT:    nop
5335; O3-NEXT:  # %bb.2: # %entry
5336; O3-NEXT:    # in Loop: Header=BB13_1 Depth=1
5337; O3-NEXT:    and $9, $9, $7
5338; O3-NEXT:    or $9, $9, $6
5339; O3-NEXT:    sc $9, 0($2)
5340; O3-NEXT:    beqz $9, $BB13_1
5341; O3-NEXT:    nop
5342; O3-NEXT:  $BB13_3: # %entry
5343; O3-NEXT:    srlv $1, $10, $3
5344; O3-NEXT:    sll $1, $1, 24
5345; O3-NEXT:    sra $1, $1, 24
5346; O3-NEXT:  # %bb.4: # %entry
5347; O3-NEXT:    xor $1, $1, $5
5348; O3-NEXT:    jr $ra
5349; O3-NEXT:    sltiu $2, $1, 1
5350;
5351; MIPS32EB-LABEL: AtomicCmpSwapRes8:
5352; MIPS32EB:       # %bb.0: # %entry
5353; MIPS32EB-NEXT:    addiu $1, $zero, -4
5354; MIPS32EB-NEXT:    and $2, $4, $1
5355; MIPS32EB-NEXT:    andi $1, $4, 3
5356; MIPS32EB-NEXT:    xori $1, $1, 3
5357; MIPS32EB-NEXT:    sll $3, $1, 3
5358; MIPS32EB-NEXT:    ori $1, $zero, 255
5359; MIPS32EB-NEXT:    sllv $4, $1, $3
5360; MIPS32EB-NEXT:    nor $7, $zero, $4
5361; MIPS32EB-NEXT:    andi $1, $5, 255
5362; MIPS32EB-NEXT:    sllv $8, $1, $3
5363; MIPS32EB-NEXT:    andi $1, $6, 255
5364; MIPS32EB-NEXT:    sllv $6, $1, $3
5365; MIPS32EB-NEXT:  $BB13_1: # %entry
5366; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
5367; MIPS32EB-NEXT:    ll $9, 0($2)
5368; MIPS32EB-NEXT:    and $10, $9, $4
5369; MIPS32EB-NEXT:    bne $10, $8, $BB13_3
5370; MIPS32EB-NEXT:    nop
5371; MIPS32EB-NEXT:  # %bb.2: # %entry
5372; MIPS32EB-NEXT:    # in Loop: Header=BB13_1 Depth=1
5373; MIPS32EB-NEXT:    and $9, $9, $7
5374; MIPS32EB-NEXT:    or $9, $9, $6
5375; MIPS32EB-NEXT:    sc $9, 0($2)
5376; MIPS32EB-NEXT:    beqz $9, $BB13_1
5377; MIPS32EB-NEXT:    nop
5378; MIPS32EB-NEXT:  $BB13_3: # %entry
5379; MIPS32EB-NEXT:    srlv $1, $10, $3
5380; MIPS32EB-NEXT:    sll $1, $1, 24
5381; MIPS32EB-NEXT:    sra $1, $1, 24
5382; MIPS32EB-NEXT:  # %bb.4: # %entry
5383; MIPS32EB-NEXT:    xor $1, $1, $5
5384; MIPS32EB-NEXT:    jr $ra
5385; MIPS32EB-NEXT:    sltiu $2, $1, 1
5386entry:
5387  %0 = cmpxchg ptr %ptr, i8 %oldval, i8 %newval monotonic monotonic
5388  %1 = extractvalue { i8, i1 } %0, 1
5389  ret i1 %1
5390; FIXME: -march=mips produces a redundant sign extension here...
5391; FIXME: ...Leading to this split check.
5392
5393}
5394
5395; Check one i16 so that we cover the seh sign extend
5396@z = common global i16 0, align 1
5397
5398define signext i16 @AtomicLoadAdd16(i16 signext %incr) nounwind {
5399; MIPS32-LABEL: AtomicLoadAdd16:
5400; MIPS32:       # %bb.0: # %entry
5401; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
5402; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
5403; MIPS32-NEXT:    addu $1, $2, $25
5404; MIPS32-NEXT:    lw $1, %got(z)($1)
5405; MIPS32-NEXT:    addiu $2, $zero, -4
5406; MIPS32-NEXT:    and $3, $1, $2
5407; MIPS32-NEXT:    andi $1, $1, 3
5408; MIPS32-NEXT:    sll $1, $1, 3
5409; MIPS32-NEXT:    ori $2, $zero, 65535
5410; MIPS32-NEXT:    sllv $5, $2, $1
5411; MIPS32-NEXT:    nor $6, $zero, $5
5412; MIPS32-NEXT:    sllv $4, $4, $1
5413; MIPS32-NEXT:  $BB14_1: # %entry
5414; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
5415; MIPS32-NEXT:    ll $7, 0($3)
5416; MIPS32-NEXT:    addu $8, $7, $4
5417; MIPS32-NEXT:    and $8, $8, $5
5418; MIPS32-NEXT:    and $9, $7, $6
5419; MIPS32-NEXT:    or $9, $9, $8
5420; MIPS32-NEXT:    sc $9, 0($3)
5421; MIPS32-NEXT:    beqz $9, $BB14_1
5422; MIPS32-NEXT:    nop
5423; MIPS32-NEXT:  # %bb.2: # %entry
5424; MIPS32-NEXT:    and $2, $7, $5
5425; MIPS32-NEXT:    srlv $2, $2, $1
5426; MIPS32-NEXT:    sll $2, $2, 16
5427; MIPS32-NEXT:    sra $2, $2, 16
5428; MIPS32-NEXT:  # %bb.3: # %entry
5429; MIPS32-NEXT:    jr $ra
5430; MIPS32-NEXT:    nop
5431;
5432; MIPS32O0-LABEL: AtomicLoadAdd16:
5433; MIPS32O0:       # %bb.0: # %entry
5434; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
5435; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
5436; MIPS32O0-NEXT:    addiu $sp, $sp, -8
5437; MIPS32O0-NEXT:    addu $1, $2, $25
5438; MIPS32O0-NEXT:    lw $1, %got(z)($1)
5439; MIPS32O0-NEXT:    addiu $2, $zero, -4
5440; MIPS32O0-NEXT:    and $5, $1, $2
5441; MIPS32O0-NEXT:    andi $1, $1, 3
5442; MIPS32O0-NEXT:    sll $9, $1, 3
5443; MIPS32O0-NEXT:    ori $1, $zero, 65535
5444; MIPS32O0-NEXT:    sllv $7, $1, $9
5445; MIPS32O0-NEXT:    nor $8, $zero, $7
5446; MIPS32O0-NEXT:    sllv $6, $4, $9
5447; MIPS32O0-NEXT:  $BB14_1: # %entry
5448; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
5449; MIPS32O0-NEXT:    ll $2, 0($5)
5450; MIPS32O0-NEXT:    addu $3, $2, $6
5451; MIPS32O0-NEXT:    and $3, $3, $7
5452; MIPS32O0-NEXT:    and $4, $2, $8
5453; MIPS32O0-NEXT:    or $4, $4, $3
5454; MIPS32O0-NEXT:    sc $4, 0($5)
5455; MIPS32O0-NEXT:    beqz $4, $BB14_1
5456; MIPS32O0-NEXT:    nop
5457; MIPS32O0-NEXT:  # %bb.2: # %entry
5458; MIPS32O0-NEXT:    and $1, $2, $7
5459; MIPS32O0-NEXT:    srlv $1, $1, $9
5460; MIPS32O0-NEXT:    sll $1, $1, 16
5461; MIPS32O0-NEXT:    sra $1, $1, 16
5462; MIPS32O0-NEXT:  # %bb.3: # %entry
5463; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
5464; MIPS32O0-NEXT:  # %bb.4: # %entry
5465; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5466; MIPS32O0-NEXT:    sll $1, $1, 16
5467; MIPS32O0-NEXT:    sra $2, $1, 16
5468; MIPS32O0-NEXT:    addiu $sp, $sp, 8
5469; MIPS32O0-NEXT:    jr $ra
5470; MIPS32O0-NEXT:    nop
5471;
5472; MIPS32R2-LABEL: AtomicLoadAdd16:
5473; MIPS32R2:       # %bb.0: # %entry
5474; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
5475; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
5476; MIPS32R2-NEXT:    addu $1, $2, $25
5477; MIPS32R2-NEXT:    lw $1, %got(z)($1)
5478; MIPS32R2-NEXT:    addiu $2, $zero, -4
5479; MIPS32R2-NEXT:    and $3, $1, $2
5480; MIPS32R2-NEXT:    andi $1, $1, 3
5481; MIPS32R2-NEXT:    sll $1, $1, 3
5482; MIPS32R2-NEXT:    ori $2, $zero, 65535
5483; MIPS32R2-NEXT:    sllv $5, $2, $1
5484; MIPS32R2-NEXT:    nor $6, $zero, $5
5485; MIPS32R2-NEXT:    sllv $4, $4, $1
5486; MIPS32R2-NEXT:  $BB14_1: # %entry
5487; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
5488; MIPS32R2-NEXT:    ll $7, 0($3)
5489; MIPS32R2-NEXT:    addu $8, $7, $4
5490; MIPS32R2-NEXT:    and $8, $8, $5
5491; MIPS32R2-NEXT:    and $9, $7, $6
5492; MIPS32R2-NEXT:    or $9, $9, $8
5493; MIPS32R2-NEXT:    sc $9, 0($3)
5494; MIPS32R2-NEXT:    beqz $9, $BB14_1
5495; MIPS32R2-NEXT:    nop
5496; MIPS32R2-NEXT:  # %bb.2: # %entry
5497; MIPS32R2-NEXT:    and $2, $7, $5
5498; MIPS32R2-NEXT:    srlv $2, $2, $1
5499; MIPS32R2-NEXT:    seh $2, $2
5500; MIPS32R2-NEXT:  # %bb.3: # %entry
5501; MIPS32R2-NEXT:    jr $ra
5502; MIPS32R2-NEXT:    nop
5503;
5504; MIPS32R6-LABEL: AtomicLoadAdd16:
5505; MIPS32R6:       # %bb.0: # %entry
5506; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
5507; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
5508; MIPS32R6-NEXT:    addu $1, $2, $25
5509; MIPS32R6-NEXT:    lw $1, %got(z)($1)
5510; MIPS32R6-NEXT:    addiu $2, $zero, -4
5511; MIPS32R6-NEXT:    and $3, $1, $2
5512; MIPS32R6-NEXT:    andi $1, $1, 3
5513; MIPS32R6-NEXT:    sll $1, $1, 3
5514; MIPS32R6-NEXT:    ori $2, $zero, 65535
5515; MIPS32R6-NEXT:    sllv $5, $2, $1
5516; MIPS32R6-NEXT:    nor $6, $zero, $5
5517; MIPS32R6-NEXT:    sllv $4, $4, $1
5518; MIPS32R6-NEXT:  $BB14_1: # %entry
5519; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
5520; MIPS32R6-NEXT:    ll $7, 0($3)
5521; MIPS32R6-NEXT:    addu $8, $7, $4
5522; MIPS32R6-NEXT:    and $8, $8, $5
5523; MIPS32R6-NEXT:    and $9, $7, $6
5524; MIPS32R6-NEXT:    or $9, $9, $8
5525; MIPS32R6-NEXT:    sc $9, 0($3)
5526; MIPS32R6-NEXT:    beqzc $9, $BB14_1
5527; MIPS32R6-NEXT:  # %bb.2: # %entry
5528; MIPS32R6-NEXT:    and $2, $7, $5
5529; MIPS32R6-NEXT:    srlv $2, $2, $1
5530; MIPS32R6-NEXT:    seh $2, $2
5531; MIPS32R6-NEXT:  # %bb.3: # %entry
5532; MIPS32R6-NEXT:    jrc $ra
5533;
5534; MIPS32R6O0-LABEL: AtomicLoadAdd16:
5535; MIPS32R6O0:       # %bb.0: # %entry
5536; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
5537; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
5538; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
5539; MIPS32R6O0-NEXT:    addu $1, $2, $25
5540; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a0
5541; MIPS32R6O0-NEXT:    lw $1, %got(z)($1)
5542; MIPS32R6O0-NEXT:    addiu $2, $zero, -4
5543; MIPS32R6O0-NEXT:    and $5, $1, $2
5544; MIPS32R6O0-NEXT:    andi $1, $1, 3
5545; MIPS32R6O0-NEXT:    sll $9, $1, 3
5546; MIPS32R6O0-NEXT:    ori $1, $zero, 65535
5547; MIPS32R6O0-NEXT:    sllv $7, $1, $9
5548; MIPS32R6O0-NEXT:    nor $8, $zero, $7
5549; MIPS32R6O0-NEXT:    sllv $6, $4, $9
5550; MIPS32R6O0-NEXT:  $BB14_1: # %entry
5551; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5552; MIPS32R6O0-NEXT:    ll $2, 0($5)
5553; MIPS32R6O0-NEXT:    addu $3, $2, $6
5554; MIPS32R6O0-NEXT:    and $3, $3, $7
5555; MIPS32R6O0-NEXT:    and $4, $2, $8
5556; MIPS32R6O0-NEXT:    or $4, $4, $3
5557; MIPS32R6O0-NEXT:    sc $4, 0($5)
5558; MIPS32R6O0-NEXT:    beqzc $4, $BB14_1
5559; MIPS32R6O0-NEXT:  # %bb.2: # %entry
5560; MIPS32R6O0-NEXT:    and $1, $2, $7
5561; MIPS32R6O0-NEXT:    srlv $1, $1, $9
5562; MIPS32R6O0-NEXT:    seh $1, $1
5563; MIPS32R6O0-NEXT:  # %bb.3: # %entry
5564; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
5565; MIPS32R6O0-NEXT:  # %bb.4: # %entry
5566; MIPS32R6O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
5567; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
5568; MIPS32R6O0-NEXT:    jrc $ra
5569;
5570; MIPS4-LABEL: AtomicLoadAdd16:
5571; MIPS4:       # %bb.0: # %entry
5572; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5573; MIPS4-NEXT:    daddu $1, $1, $25
5574; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5575; MIPS4-NEXT:    ld $1, %got_disp(z)($1)
5576; MIPS4-NEXT:    daddiu $2, $zero, -4
5577; MIPS4-NEXT:    and $3, $1, $2
5578; MIPS4-NEXT:    andi $1, $1, 3
5579; MIPS4-NEXT:    sll $1, $1, 3
5580; MIPS4-NEXT:    ori $2, $zero, 65535
5581; MIPS4-NEXT:    sllv $5, $2, $1
5582; MIPS4-NEXT:    nor $6, $zero, $5
5583; MIPS4-NEXT:    sllv $4, $4, $1
5584; MIPS4-NEXT:  .LBB14_1: # %entry
5585; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
5586; MIPS4-NEXT:    ll $7, 0($3)
5587; MIPS4-NEXT:    addu $8, $7, $4
5588; MIPS4-NEXT:    and $8, $8, $5
5589; MIPS4-NEXT:    and $9, $7, $6
5590; MIPS4-NEXT:    or $9, $9, $8
5591; MIPS4-NEXT:    sc $9, 0($3)
5592; MIPS4-NEXT:    beqz $9, .LBB14_1
5593; MIPS4-NEXT:    nop
5594; MIPS4-NEXT:  # %bb.2: # %entry
5595; MIPS4-NEXT:    and $2, $7, $5
5596; MIPS4-NEXT:    srlv $2, $2, $1
5597; MIPS4-NEXT:    sll $2, $2, 16
5598; MIPS4-NEXT:    sra $2, $2, 16
5599; MIPS4-NEXT:  # %bb.3: # %entry
5600; MIPS4-NEXT:    jr $ra
5601; MIPS4-NEXT:    nop
5602;
5603; MIPS64-LABEL: AtomicLoadAdd16:
5604; MIPS64:       # %bb.0: # %entry
5605; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5606; MIPS64-NEXT:    daddu $1, $1, $25
5607; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5608; MIPS64-NEXT:    ld $1, %got_disp(z)($1)
5609; MIPS64-NEXT:    daddiu $2, $zero, -4
5610; MIPS64-NEXT:    and $3, $1, $2
5611; MIPS64-NEXT:    andi $1, $1, 3
5612; MIPS64-NEXT:    sll $1, $1, 3
5613; MIPS64-NEXT:    ori $2, $zero, 65535
5614; MIPS64-NEXT:    sllv $5, $2, $1
5615; MIPS64-NEXT:    nor $6, $zero, $5
5616; MIPS64-NEXT:    sllv $4, $4, $1
5617; MIPS64-NEXT:  .LBB14_1: # %entry
5618; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
5619; MIPS64-NEXT:    ll $7, 0($3)
5620; MIPS64-NEXT:    addu $8, $7, $4
5621; MIPS64-NEXT:    and $8, $8, $5
5622; MIPS64-NEXT:    and $9, $7, $6
5623; MIPS64-NEXT:    or $9, $9, $8
5624; MIPS64-NEXT:    sc $9, 0($3)
5625; MIPS64-NEXT:    beqz $9, .LBB14_1
5626; MIPS64-NEXT:    nop
5627; MIPS64-NEXT:  # %bb.2: # %entry
5628; MIPS64-NEXT:    and $2, $7, $5
5629; MIPS64-NEXT:    srlv $2, $2, $1
5630; MIPS64-NEXT:    sll $2, $2, 16
5631; MIPS64-NEXT:    sra $2, $2, 16
5632; MIPS64-NEXT:  # %bb.3: # %entry
5633; MIPS64-NEXT:    jr $ra
5634; MIPS64-NEXT:    nop
5635;
5636; MIPS64R2-LABEL: AtomicLoadAdd16:
5637; MIPS64R2:       # %bb.0: # %entry
5638; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5639; MIPS64R2-NEXT:    daddu $1, $1, $25
5640; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5641; MIPS64R2-NEXT:    ld $1, %got_disp(z)($1)
5642; MIPS64R2-NEXT:    daddiu $2, $zero, -4
5643; MIPS64R2-NEXT:    and $3, $1, $2
5644; MIPS64R2-NEXT:    andi $1, $1, 3
5645; MIPS64R2-NEXT:    sll $1, $1, 3
5646; MIPS64R2-NEXT:    ori $2, $zero, 65535
5647; MIPS64R2-NEXT:    sllv $5, $2, $1
5648; MIPS64R2-NEXT:    nor $6, $zero, $5
5649; MIPS64R2-NEXT:    sllv $4, $4, $1
5650; MIPS64R2-NEXT:  .LBB14_1: # %entry
5651; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
5652; MIPS64R2-NEXT:    ll $7, 0($3)
5653; MIPS64R2-NEXT:    addu $8, $7, $4
5654; MIPS64R2-NEXT:    and $8, $8, $5
5655; MIPS64R2-NEXT:    and $9, $7, $6
5656; MIPS64R2-NEXT:    or $9, $9, $8
5657; MIPS64R2-NEXT:    sc $9, 0($3)
5658; MIPS64R2-NEXT:    beqz $9, .LBB14_1
5659; MIPS64R2-NEXT:    nop
5660; MIPS64R2-NEXT:  # %bb.2: # %entry
5661; MIPS64R2-NEXT:    and $2, $7, $5
5662; MIPS64R2-NEXT:    srlv $2, $2, $1
5663; MIPS64R2-NEXT:    seh $2, $2
5664; MIPS64R2-NEXT:  # %bb.3: # %entry
5665; MIPS64R2-NEXT:    jr $ra
5666; MIPS64R2-NEXT:    nop
5667;
5668; MIPS64R6-LABEL: AtomicLoadAdd16:
5669; MIPS64R6:       # %bb.0: # %entry
5670; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5671; MIPS64R6-NEXT:    daddu $1, $1, $25
5672; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5673; MIPS64R6-NEXT:    ld $1, %got_disp(z)($1)
5674; MIPS64R6-NEXT:    daddiu $2, $zero, -4
5675; MIPS64R6-NEXT:    and $3, $1, $2
5676; MIPS64R6-NEXT:    andi $1, $1, 3
5677; MIPS64R6-NEXT:    sll $1, $1, 3
5678; MIPS64R6-NEXT:    ori $2, $zero, 65535
5679; MIPS64R6-NEXT:    sllv $5, $2, $1
5680; MIPS64R6-NEXT:    nor $6, $zero, $5
5681; MIPS64R6-NEXT:    sllv $4, $4, $1
5682; MIPS64R6-NEXT:  .LBB14_1: # %entry
5683; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
5684; MIPS64R6-NEXT:    ll $7, 0($3)
5685; MIPS64R6-NEXT:    addu $8, $7, $4
5686; MIPS64R6-NEXT:    and $8, $8, $5
5687; MIPS64R6-NEXT:    and $9, $7, $6
5688; MIPS64R6-NEXT:    or $9, $9, $8
5689; MIPS64R6-NEXT:    sc $9, 0($3)
5690; MIPS64R6-NEXT:    beqzc $9, .LBB14_1
5691; MIPS64R6-NEXT:  # %bb.2: # %entry
5692; MIPS64R6-NEXT:    and $2, $7, $5
5693; MIPS64R6-NEXT:    srlv $2, $2, $1
5694; MIPS64R6-NEXT:    seh $2, $2
5695; MIPS64R6-NEXT:  # %bb.3: # %entry
5696; MIPS64R6-NEXT:    jrc $ra
5697;
5698; MIPS64R6O0-LABEL: AtomicLoadAdd16:
5699; MIPS64R6O0:       # %bb.0: # %entry
5700; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
5701; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5702; MIPS64R6O0-NEXT:    daddu $1, $1, $25
5703; MIPS64R6O0-NEXT:    daddiu $2, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5704; MIPS64R6O0-NEXT:    move $1, $4
5705; MIPS64R6O0-NEXT:    ld $2, %got_disp(z)($2)
5706; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
5707; MIPS64R6O0-NEXT:    and $5, $2, $3
5708; MIPS64R6O0-NEXT:    andi $2, $2, 3
5709; MIPS64R6O0-NEXT:    xori $2, $2, 2
5710; MIPS64R6O0-NEXT:    sll $9, $2, 3
5711; MIPS64R6O0-NEXT:    ori $2, $zero, 65535
5712; MIPS64R6O0-NEXT:    sllv $7, $2, $9
5713; MIPS64R6O0-NEXT:    nor $8, $zero, $7
5714; MIPS64R6O0-NEXT:    sllv $6, $1, $9
5715; MIPS64R6O0-NEXT:  .LBB14_1: # %entry
5716; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5717; MIPS64R6O0-NEXT:    ll $2, 0($5)
5718; MIPS64R6O0-NEXT:    addu $3, $2, $6
5719; MIPS64R6O0-NEXT:    and $3, $3, $7
5720; MIPS64R6O0-NEXT:    and $4, $2, $8
5721; MIPS64R6O0-NEXT:    or $4, $4, $3
5722; MIPS64R6O0-NEXT:    sc $4, 0($5)
5723; MIPS64R6O0-NEXT:    beqzc $4, .LBB14_1
5724; MIPS64R6O0-NEXT:  # %bb.2: # %entry
5725; MIPS64R6O0-NEXT:    and $1, $2, $7
5726; MIPS64R6O0-NEXT:    srlv $1, $1, $9
5727; MIPS64R6O0-NEXT:    seh $1, $1
5728; MIPS64R6O0-NEXT:  # %bb.3: # %entry
5729; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
5730; MIPS64R6O0-NEXT:  # %bb.4: # %entry
5731; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
5732; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
5733; MIPS64R6O0-NEXT:    jrc $ra
5734;
5735; MM32-LABEL: AtomicLoadAdd16:
5736; MM32:       # %bb.0: # %entry
5737; MM32-NEXT:    lui $2, %hi(_gp_disp)
5738; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
5739; MM32-NEXT:    addu $2, $2, $25
5740; MM32-NEXT:    lw $1, %got(z)($2)
5741; MM32-NEXT:    addiu $2, $zero, -4
5742; MM32-NEXT:    and $3, $1, $2
5743; MM32-NEXT:    andi $1, $1, 3
5744; MM32-NEXT:    sll $1, $1, 3
5745; MM32-NEXT:    ori $2, $zero, 65535
5746; MM32-NEXT:    sllv $5, $2, $1
5747; MM32-NEXT:    nor $6, $zero, $5
5748; MM32-NEXT:    sllv $4, $4, $1
5749; MM32-NEXT:  $BB14_1: # %entry
5750; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
5751; MM32-NEXT:    ll $7, 0($3)
5752; MM32-NEXT:    addu $8, $7, $4
5753; MM32-NEXT:    and $8, $8, $5
5754; MM32-NEXT:    and $9, $7, $6
5755; MM32-NEXT:    or $9, $9, $8
5756; MM32-NEXT:    sc $9, 0($3)
5757; MM32-NEXT:    beqzc $9, $BB14_1
5758; MM32-NEXT:  # %bb.2: # %entry
5759; MM32-NEXT:    and $2, $7, $5
5760; MM32-NEXT:    srlv $2, $2, $1
5761; MM32-NEXT:    seh $2, $2
5762; MM32-NEXT:  # %bb.3: # %entry
5763; MM32-NEXT:    jrc $ra
5764;
5765; O1-LABEL: AtomicLoadAdd16:
5766; O1:       # %bb.0: # %entry
5767; O1-NEXT:    lui $2, %hi(_gp_disp)
5768; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
5769; O1-NEXT:    addu $1, $2, $25
5770; O1-NEXT:    lw $1, %got(z)($1)
5771; O1-NEXT:    addiu $2, $zero, -4
5772; O1-NEXT:    and $3, $1, $2
5773; O1-NEXT:    andi $1, $1, 3
5774; O1-NEXT:    sll $1, $1, 3
5775; O1-NEXT:    ori $2, $zero, 65535
5776; O1-NEXT:    sllv $5, $2, $1
5777; O1-NEXT:    nor $6, $zero, $5
5778; O1-NEXT:    sllv $4, $4, $1
5779; O1-NEXT:  $BB14_1: # %entry
5780; O1-NEXT:    # =>This Inner Loop Header: Depth=1
5781; O1-NEXT:    ll $7, 0($3)
5782; O1-NEXT:    addu $8, $7, $4
5783; O1-NEXT:    and $8, $8, $5
5784; O1-NEXT:    and $9, $7, $6
5785; O1-NEXT:    or $9, $9, $8
5786; O1-NEXT:    sc $9, 0($3)
5787; O1-NEXT:    beqz $9, $BB14_1
5788; O1-NEXT:    nop
5789; O1-NEXT:  # %bb.2: # %entry
5790; O1-NEXT:    and $2, $7, $5
5791; O1-NEXT:    srlv $2, $2, $1
5792; O1-NEXT:    sll $2, $2, 16
5793; O1-NEXT:    sra $2, $2, 16
5794; O1-NEXT:  # %bb.3: # %entry
5795; O1-NEXT:    jr $ra
5796; O1-NEXT:    nop
5797;
5798; O2-LABEL: AtomicLoadAdd16:
5799; O2:       # %bb.0: # %entry
5800; O2-NEXT:    lui $2, %hi(_gp_disp)
5801; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
5802; O2-NEXT:    addu $1, $2, $25
5803; O2-NEXT:    lw $1, %got(z)($1)
5804; O2-NEXT:    addiu $2, $zero, -4
5805; O2-NEXT:    and $3, $1, $2
5806; O2-NEXT:    andi $1, $1, 3
5807; O2-NEXT:    sll $1, $1, 3
5808; O2-NEXT:    ori $2, $zero, 65535
5809; O2-NEXT:    sllv $5, $2, $1
5810; O2-NEXT:    nor $6, $zero, $5
5811; O2-NEXT:    sllv $4, $4, $1
5812; O2-NEXT:  $BB14_1: # %entry
5813; O2-NEXT:    # =>This Inner Loop Header: Depth=1
5814; O2-NEXT:    ll $7, 0($3)
5815; O2-NEXT:    addu $8, $7, $4
5816; O2-NEXT:    and $8, $8, $5
5817; O2-NEXT:    and $9, $7, $6
5818; O2-NEXT:    or $9, $9, $8
5819; O2-NEXT:    sc $9, 0($3)
5820; O2-NEXT:    beqz $9, $BB14_1
5821; O2-NEXT:    nop
5822; O2-NEXT:  # %bb.2: # %entry
5823; O2-NEXT:    and $2, $7, $5
5824; O2-NEXT:    srlv $2, $2, $1
5825; O2-NEXT:    sll $2, $2, 16
5826; O2-NEXT:    sra $2, $2, 16
5827; O2-NEXT:  # %bb.3: # %entry
5828; O2-NEXT:    jr $ra
5829; O2-NEXT:    nop
5830;
5831; O3-LABEL: AtomicLoadAdd16:
5832; O3:       # %bb.0: # %entry
5833; O3-NEXT:    lui $2, %hi(_gp_disp)
5834; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
5835; O3-NEXT:    addu $1, $2, $25
5836; O3-NEXT:    addiu $2, $zero, -4
5837; O3-NEXT:    lw $1, %got(z)($1)
5838; O3-NEXT:    and $3, $1, $2
5839; O3-NEXT:    andi $1, $1, 3
5840; O3-NEXT:    ori $2, $zero, 65535
5841; O3-NEXT:    sll $1, $1, 3
5842; O3-NEXT:    sllv $5, $2, $1
5843; O3-NEXT:    sllv $4, $4, $1
5844; O3-NEXT:    nor $6, $zero, $5
5845; O3-NEXT:  $BB14_1: # %entry
5846; O3-NEXT:    # =>This Inner Loop Header: Depth=1
5847; O3-NEXT:    ll $7, 0($3)
5848; O3-NEXT:    addu $8, $7, $4
5849; O3-NEXT:    and $8, $8, $5
5850; O3-NEXT:    and $9, $7, $6
5851; O3-NEXT:    or $9, $9, $8
5852; O3-NEXT:    sc $9, 0($3)
5853; O3-NEXT:    beqz $9, $BB14_1
5854; O3-NEXT:    nop
5855; O3-NEXT:  # %bb.2: # %entry
5856; O3-NEXT:    and $2, $7, $5
5857; O3-NEXT:    srlv $2, $2, $1
5858; O3-NEXT:    sll $2, $2, 16
5859; O3-NEXT:    sra $2, $2, 16
5860; O3-NEXT:  # %bb.3: # %entry
5861; O3-NEXT:    jr $ra
5862; O3-NEXT:    nop
5863;
5864; MIPS32EB-LABEL: AtomicLoadAdd16:
5865; MIPS32EB:       # %bb.0: # %entry
5866; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
5867; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
5868; MIPS32EB-NEXT:    addu $1, $2, $25
5869; MIPS32EB-NEXT:    lw $1, %got(z)($1)
5870; MIPS32EB-NEXT:    addiu $2, $zero, -4
5871; MIPS32EB-NEXT:    and $3, $1, $2
5872; MIPS32EB-NEXT:    andi $1, $1, 3
5873; MIPS32EB-NEXT:    xori $1, $1, 2
5874; MIPS32EB-NEXT:    sll $1, $1, 3
5875; MIPS32EB-NEXT:    ori $2, $zero, 65535
5876; MIPS32EB-NEXT:    sllv $5, $2, $1
5877; MIPS32EB-NEXT:    nor $6, $zero, $5
5878; MIPS32EB-NEXT:    sllv $4, $4, $1
5879; MIPS32EB-NEXT:  $BB14_1: # %entry
5880; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
5881; MIPS32EB-NEXT:    ll $7, 0($3)
5882; MIPS32EB-NEXT:    addu $8, $7, $4
5883; MIPS32EB-NEXT:    and $8, $8, $5
5884; MIPS32EB-NEXT:    and $9, $7, $6
5885; MIPS32EB-NEXT:    or $9, $9, $8
5886; MIPS32EB-NEXT:    sc $9, 0($3)
5887; MIPS32EB-NEXT:    beqz $9, $BB14_1
5888; MIPS32EB-NEXT:    nop
5889; MIPS32EB-NEXT:  # %bb.2: # %entry
5890; MIPS32EB-NEXT:    and $2, $7, $5
5891; MIPS32EB-NEXT:    srlv $2, $2, $1
5892; MIPS32EB-NEXT:    sll $2, $2, 16
5893; MIPS32EB-NEXT:    sra $2, $2, 16
5894; MIPS32EB-NEXT:  # %bb.3: # %entry
5895; MIPS32EB-NEXT:    jr $ra
5896; MIPS32EB-NEXT:    nop
5897entry:
5898  %0 = atomicrmw add ptr @z, i16 %incr monotonic
5899  ret i16 %0
5900
5901}
5902
5903; Test that the i16 return value from cmpxchg is recognised as signed,
5904; so that setCC doesn't end up comparing an unsigned value to a signed
5905; value.
5906; The rest of the functions here are testing the atomic expansion, so
5907; we just match the end of the function.
5908define {i16, i1} @foo(ptr %addr, i16 %l, i16 %r, i16 %new) {
5909; MIPS32-LABEL: foo:
5910; MIPS32:       # %bb.0:
5911; MIPS32-NEXT:    addu $1, $5, $6
5912; MIPS32-NEXT:    sync
5913; MIPS32-NEXT:    addiu $2, $zero, -4
5914; MIPS32-NEXT:    and $3, $4, $2
5915; MIPS32-NEXT:    andi $2, $4, 3
5916; MIPS32-NEXT:    sll $4, $2, 3
5917; MIPS32-NEXT:    ori $2, $zero, 65535
5918; MIPS32-NEXT:    sllv $5, $2, $4
5919; MIPS32-NEXT:    nor $6, $zero, $5
5920; MIPS32-NEXT:    andi $2, $1, 65535
5921; MIPS32-NEXT:    sllv $8, $2, $4
5922; MIPS32-NEXT:    andi $2, $7, 65535
5923; MIPS32-NEXT:    sllv $7, $2, $4
5924; MIPS32-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
5925; MIPS32-NEXT:    ll $9, 0($3)
5926; MIPS32-NEXT:    and $10, $9, $5
5927; MIPS32-NEXT:    bne $10, $8, $BB15_3
5928; MIPS32-NEXT:    nop
5929; MIPS32-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
5930; MIPS32-NEXT:    and $9, $9, $6
5931; MIPS32-NEXT:    or $9, $9, $7
5932; MIPS32-NEXT:    sc $9, 0($3)
5933; MIPS32-NEXT:    beqz $9, $BB15_1
5934; MIPS32-NEXT:    nop
5935; MIPS32-NEXT:  $BB15_3:
5936; MIPS32-NEXT:    srlv $2, $10, $4
5937; MIPS32-NEXT:    sll $2, $2, 16
5938; MIPS32-NEXT:    sra $2, $2, 16
5939; MIPS32-NEXT:  # %bb.4:
5940; MIPS32-NEXT:    sll $1, $1, 16
5941; MIPS32-NEXT:    sra $1, $1, 16
5942; MIPS32-NEXT:    xor $1, $2, $1
5943; MIPS32-NEXT:    sltiu $3, $1, 1
5944; MIPS32-NEXT:    sync
5945; MIPS32-NEXT:    jr $ra
5946; MIPS32-NEXT:    nop
5947;
5948; MIPS32O0-LABEL: foo:
5949; MIPS32O0:       # %bb.0:
5950; MIPS32O0-NEXT:    addiu $sp, $sp, -8
5951; MIPS32O0-NEXT:    .cfi_def_cfa_offset 8
5952; MIPS32O0-NEXT:    move $1, $7
5953; MIPS32O0-NEXT:    move $3, $4
5954; MIPS32O0-NEXT:    addu $2, $5, $6
5955; MIPS32O0-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
5956; MIPS32O0-NEXT:    sync
5957; MIPS32O0-NEXT:    addiu $4, $zero, -4
5958; MIPS32O0-NEXT:    and $4, $3, $4
5959; MIPS32O0-NEXT:    andi $3, $3, 3
5960; MIPS32O0-NEXT:    sll $9, $3, 3
5961; MIPS32O0-NEXT:    ori $3, $zero, 65535
5962; MIPS32O0-NEXT:    sllv $5, $3, $9
5963; MIPS32O0-NEXT:    nor $7, $zero, $5
5964; MIPS32O0-NEXT:    andi $2, $2, 65535
5965; MIPS32O0-NEXT:    sllv $6, $2, $9
5966; MIPS32O0-NEXT:    andi $1, $1, 65535
5967; MIPS32O0-NEXT:    sllv $8, $1, $9
5968; MIPS32O0-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
5969; MIPS32O0-NEXT:    ll $2, 0($4)
5970; MIPS32O0-NEXT:    and $3, $2, $5
5971; MIPS32O0-NEXT:    bne $3, $6, $BB15_3
5972; MIPS32O0-NEXT:    nop
5973; MIPS32O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
5974; MIPS32O0-NEXT:    and $2, $2, $7
5975; MIPS32O0-NEXT:    or $2, $2, $8
5976; MIPS32O0-NEXT:    sc $2, 0($4)
5977; MIPS32O0-NEXT:    beqz $2, $BB15_1
5978; MIPS32O0-NEXT:    nop
5979; MIPS32O0-NEXT:  $BB15_3:
5980; MIPS32O0-NEXT:    srlv $1, $3, $9
5981; MIPS32O0-NEXT:    sll $1, $1, 16
5982; MIPS32O0-NEXT:    sra $1, $1, 16
5983; MIPS32O0-NEXT:  # %bb.4:
5984; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
5985; MIPS32O0-NEXT:  # %bb.5:
5986; MIPS32O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
5987; MIPS32O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
5988; MIPS32O0-NEXT:    sll $1, $1, 16
5989; MIPS32O0-NEXT:    sra $1, $1, 16
5990; MIPS32O0-NEXT:    xor $1, $2, $1
5991; MIPS32O0-NEXT:    sltiu $3, $1, 1
5992; MIPS32O0-NEXT:    sync
5993; MIPS32O0-NEXT:    addiu $sp, $sp, 8
5994; MIPS32O0-NEXT:    jr $ra
5995; MIPS32O0-NEXT:    nop
5996;
5997; MIPS32R2-LABEL: foo:
5998; MIPS32R2:       # %bb.0:
5999; MIPS32R2-NEXT:    addu $1, $5, $6
6000; MIPS32R2-NEXT:    sync
6001; MIPS32R2-NEXT:    addiu $2, $zero, -4
6002; MIPS32R2-NEXT:    and $3, $4, $2
6003; MIPS32R2-NEXT:    andi $2, $4, 3
6004; MIPS32R2-NEXT:    sll $4, $2, 3
6005; MIPS32R2-NEXT:    ori $2, $zero, 65535
6006; MIPS32R2-NEXT:    sllv $5, $2, $4
6007; MIPS32R2-NEXT:    nor $6, $zero, $5
6008; MIPS32R2-NEXT:    andi $2, $1, 65535
6009; MIPS32R2-NEXT:    sllv $8, $2, $4
6010; MIPS32R2-NEXT:    andi $2, $7, 65535
6011; MIPS32R2-NEXT:    sllv $7, $2, $4
6012; MIPS32R2-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6013; MIPS32R2-NEXT:    ll $9, 0($3)
6014; MIPS32R2-NEXT:    and $10, $9, $5
6015; MIPS32R2-NEXT:    bne $10, $8, $BB15_3
6016; MIPS32R2-NEXT:    nop
6017; MIPS32R2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6018; MIPS32R2-NEXT:    and $9, $9, $6
6019; MIPS32R2-NEXT:    or $9, $9, $7
6020; MIPS32R2-NEXT:    sc $9, 0($3)
6021; MIPS32R2-NEXT:    beqz $9, $BB15_1
6022; MIPS32R2-NEXT:    nop
6023; MIPS32R2-NEXT:  $BB15_3:
6024; MIPS32R2-NEXT:    srlv $2, $10, $4
6025; MIPS32R2-NEXT:    seh $2, $2
6026; MIPS32R2-NEXT:  # %bb.4:
6027; MIPS32R2-NEXT:    seh $1, $1
6028; MIPS32R2-NEXT:    xor $1, $2, $1
6029; MIPS32R2-NEXT:    sltiu $3, $1, 1
6030; MIPS32R2-NEXT:    sync
6031; MIPS32R2-NEXT:    jr $ra
6032; MIPS32R2-NEXT:    nop
6033;
6034; MIPS32R6-LABEL: foo:
6035; MIPS32R6:       # %bb.0:
6036; MIPS32R6-NEXT:    addu $1, $5, $6
6037; MIPS32R6-NEXT:    sync
6038; MIPS32R6-NEXT:    addiu $2, $zero, -4
6039; MIPS32R6-NEXT:    and $3, $4, $2
6040; MIPS32R6-NEXT:    andi $2, $4, 3
6041; MIPS32R6-NEXT:    sll $4, $2, 3
6042; MIPS32R6-NEXT:    ori $2, $zero, 65535
6043; MIPS32R6-NEXT:    sllv $5, $2, $4
6044; MIPS32R6-NEXT:    nor $6, $zero, $5
6045; MIPS32R6-NEXT:    andi $2, $1, 65535
6046; MIPS32R6-NEXT:    sllv $8, $2, $4
6047; MIPS32R6-NEXT:    andi $2, $7, 65535
6048; MIPS32R6-NEXT:    sllv $7, $2, $4
6049; MIPS32R6-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6050; MIPS32R6-NEXT:    ll $9, 0($3)
6051; MIPS32R6-NEXT:    and $10, $9, $5
6052; MIPS32R6-NEXT:    bnec $10, $8, $BB15_3
6053; MIPS32R6-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6054; MIPS32R6-NEXT:    and $9, $9, $6
6055; MIPS32R6-NEXT:    or $9, $9, $7
6056; MIPS32R6-NEXT:    sc $9, 0($3)
6057; MIPS32R6-NEXT:    beqzc $9, $BB15_1
6058; MIPS32R6-NEXT:  $BB15_3:
6059; MIPS32R6-NEXT:    srlv $2, $10, $4
6060; MIPS32R6-NEXT:    seh $2, $2
6061; MIPS32R6-NEXT:  # %bb.4:
6062; MIPS32R6-NEXT:    seh $1, $1
6063; MIPS32R6-NEXT:    xor $1, $2, $1
6064; MIPS32R6-NEXT:    sltiu $3, $1, 1
6065; MIPS32R6-NEXT:    sync
6066; MIPS32R6-NEXT:    jrc $ra
6067;
6068; MIPS32R6O0-LABEL: foo:
6069; MIPS32R6O0:       # %bb.0:
6070; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
6071; MIPS32R6O0-NEXT:    .cfi_def_cfa_offset 8
6072; MIPS32R6O0-NEXT:    move $1, $7
6073; MIPS32R6O0-NEXT:    move $3, $4
6074; MIPS32R6O0-NEXT:    # kill: def $a3 killed $at
6075; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a2
6076; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a1
6077; MIPS32R6O0-NEXT:    addu $2, $5, $6
6078; MIPS32R6O0-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
6079; MIPS32R6O0-NEXT:    sync
6080; MIPS32R6O0-NEXT:    addiu $4, $zero, -4
6081; MIPS32R6O0-NEXT:    and $4, $3, $4
6082; MIPS32R6O0-NEXT:    andi $3, $3, 3
6083; MIPS32R6O0-NEXT:    sll $9, $3, 3
6084; MIPS32R6O0-NEXT:    ori $3, $zero, 65535
6085; MIPS32R6O0-NEXT:    sllv $5, $3, $9
6086; MIPS32R6O0-NEXT:    nor $7, $zero, $5
6087; MIPS32R6O0-NEXT:    andi $2, $2, 65535
6088; MIPS32R6O0-NEXT:    sllv $6, $2, $9
6089; MIPS32R6O0-NEXT:    andi $1, $1, 65535
6090; MIPS32R6O0-NEXT:    sllv $8, $1, $9
6091; MIPS32R6O0-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6092; MIPS32R6O0-NEXT:    ll $2, 0($4)
6093; MIPS32R6O0-NEXT:    and $3, $2, $5
6094; MIPS32R6O0-NEXT:    bnec $3, $6, $BB15_3
6095; MIPS32R6O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6096; MIPS32R6O0-NEXT:    and $2, $2, $7
6097; MIPS32R6O0-NEXT:    or $2, $2, $8
6098; MIPS32R6O0-NEXT:    sc $2, 0($4)
6099; MIPS32R6O0-NEXT:    beqzc $2, $BB15_1
6100; MIPS32R6O0-NEXT:  $BB15_3:
6101; MIPS32R6O0-NEXT:    srlv $1, $3, $9
6102; MIPS32R6O0-NEXT:    seh $1, $1
6103; MIPS32R6O0-NEXT:  # %bb.4:
6104; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
6105; MIPS32R6O0-NEXT:  # %bb.5:
6106; MIPS32R6O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
6107; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
6108; MIPS32R6O0-NEXT:    seh $1, $1
6109; MIPS32R6O0-NEXT:    xor $1, $2, $1
6110; MIPS32R6O0-NEXT:    sltiu $3, $1, 1
6111; MIPS32R6O0-NEXT:    sync
6112; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
6113; MIPS32R6O0-NEXT:    jrc $ra
6114;
6115; MIPS4-LABEL: foo:
6116; MIPS4:       # %bb.0:
6117; MIPS4-NEXT:    sll $1, $6, 0
6118; MIPS4-NEXT:    sll $2, $5, 0
6119; MIPS4-NEXT:    addu $1, $2, $1
6120; MIPS4-NEXT:    sync
6121; MIPS4-NEXT:    sll $2, $7, 0
6122; MIPS4-NEXT:    daddiu $3, $zero, -4
6123; MIPS4-NEXT:    and $3, $4, $3
6124; MIPS4-NEXT:    andi $4, $4, 3
6125; MIPS4-NEXT:    sll $4, $4, 3
6126; MIPS4-NEXT:    ori $5, $zero, 65535
6127; MIPS4-NEXT:    sllv $5, $5, $4
6128; MIPS4-NEXT:    nor $6, $zero, $5
6129; MIPS4-NEXT:    andi $7, $1, 65535
6130; MIPS4-NEXT:    sllv $7, $7, $4
6131; MIPS4-NEXT:    andi $2, $2, 65535
6132; MIPS4-NEXT:    sllv $8, $2, $4
6133; MIPS4-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6134; MIPS4-NEXT:    ll $9, 0($3)
6135; MIPS4-NEXT:    and $10, $9, $5
6136; MIPS4-NEXT:    bne $10, $7, .LBB15_3
6137; MIPS4-NEXT:    nop
6138; MIPS4-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6139; MIPS4-NEXT:    and $9, $9, $6
6140; MIPS4-NEXT:    or $9, $9, $8
6141; MIPS4-NEXT:    sc $9, 0($3)
6142; MIPS4-NEXT:    beqz $9, .LBB15_1
6143; MIPS4-NEXT:    nop
6144; MIPS4-NEXT:  .LBB15_3:
6145; MIPS4-NEXT:    srlv $2, $10, $4
6146; MIPS4-NEXT:    sll $2, $2, 16
6147; MIPS4-NEXT:    sra $2, $2, 16
6148; MIPS4-NEXT:  # %bb.4:
6149; MIPS4-NEXT:    sll $1, $1, 16
6150; MIPS4-NEXT:    sra $1, $1, 16
6151; MIPS4-NEXT:    xor $1, $2, $1
6152; MIPS4-NEXT:    sltiu $3, $1, 1
6153; MIPS4-NEXT:    sync
6154; MIPS4-NEXT:    jr $ra
6155; MIPS4-NEXT:    nop
6156;
6157; MIPS64-LABEL: foo:
6158; MIPS64:       # %bb.0:
6159; MIPS64-NEXT:    sll $1, $6, 0
6160; MIPS64-NEXT:    sll $2, $5, 0
6161; MIPS64-NEXT:    addu $1, $2, $1
6162; MIPS64-NEXT:    sync
6163; MIPS64-NEXT:    sll $2, $7, 0
6164; MIPS64-NEXT:    daddiu $3, $zero, -4
6165; MIPS64-NEXT:    and $3, $4, $3
6166; MIPS64-NEXT:    andi $4, $4, 3
6167; MIPS64-NEXT:    sll $4, $4, 3
6168; MIPS64-NEXT:    ori $5, $zero, 65535
6169; MIPS64-NEXT:    sllv $5, $5, $4
6170; MIPS64-NEXT:    nor $6, $zero, $5
6171; MIPS64-NEXT:    andi $7, $1, 65535
6172; MIPS64-NEXT:    sllv $7, $7, $4
6173; MIPS64-NEXT:    andi $2, $2, 65535
6174; MIPS64-NEXT:    sllv $8, $2, $4
6175; MIPS64-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6176; MIPS64-NEXT:    ll $9, 0($3)
6177; MIPS64-NEXT:    and $10, $9, $5
6178; MIPS64-NEXT:    bne $10, $7, .LBB15_3
6179; MIPS64-NEXT:    nop
6180; MIPS64-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6181; MIPS64-NEXT:    and $9, $9, $6
6182; MIPS64-NEXT:    or $9, $9, $8
6183; MIPS64-NEXT:    sc $9, 0($3)
6184; MIPS64-NEXT:    beqz $9, .LBB15_1
6185; MIPS64-NEXT:    nop
6186; MIPS64-NEXT:  .LBB15_3:
6187; MIPS64-NEXT:    srlv $2, $10, $4
6188; MIPS64-NEXT:    sll $2, $2, 16
6189; MIPS64-NEXT:    sra $2, $2, 16
6190; MIPS64-NEXT:  # %bb.4:
6191; MIPS64-NEXT:    sll $1, $1, 16
6192; MIPS64-NEXT:    sra $1, $1, 16
6193; MIPS64-NEXT:    xor $1, $2, $1
6194; MIPS64-NEXT:    sltiu $3, $1, 1
6195; MIPS64-NEXT:    sync
6196; MIPS64-NEXT:    jr $ra
6197; MIPS64-NEXT:    nop
6198;
6199; MIPS64R2-LABEL: foo:
6200; MIPS64R2:       # %bb.0:
6201; MIPS64R2-NEXT:    sll $1, $6, 0
6202; MIPS64R2-NEXT:    sll $2, $5, 0
6203; MIPS64R2-NEXT:    addu $1, $2, $1
6204; MIPS64R2-NEXT:    sync
6205; MIPS64R2-NEXT:    sll $2, $7, 0
6206; MIPS64R2-NEXT:    daddiu $3, $zero, -4
6207; MIPS64R2-NEXT:    and $3, $4, $3
6208; MIPS64R2-NEXT:    andi $4, $4, 3
6209; MIPS64R2-NEXT:    sll $4, $4, 3
6210; MIPS64R2-NEXT:    ori $5, $zero, 65535
6211; MIPS64R2-NEXT:    sllv $5, $5, $4
6212; MIPS64R2-NEXT:    nor $6, $zero, $5
6213; MIPS64R2-NEXT:    andi $7, $1, 65535
6214; MIPS64R2-NEXT:    sllv $7, $7, $4
6215; MIPS64R2-NEXT:    andi $2, $2, 65535
6216; MIPS64R2-NEXT:    sllv $8, $2, $4
6217; MIPS64R2-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6218; MIPS64R2-NEXT:    ll $9, 0($3)
6219; MIPS64R2-NEXT:    and $10, $9, $5
6220; MIPS64R2-NEXT:    bne $10, $7, .LBB15_3
6221; MIPS64R2-NEXT:    nop
6222; MIPS64R2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6223; MIPS64R2-NEXT:    and $9, $9, $6
6224; MIPS64R2-NEXT:    or $9, $9, $8
6225; MIPS64R2-NEXT:    sc $9, 0($3)
6226; MIPS64R2-NEXT:    beqz $9, .LBB15_1
6227; MIPS64R2-NEXT:    nop
6228; MIPS64R2-NEXT:  .LBB15_3:
6229; MIPS64R2-NEXT:    srlv $2, $10, $4
6230; MIPS64R2-NEXT:    seh $2, $2
6231; MIPS64R2-NEXT:  # %bb.4:
6232; MIPS64R2-NEXT:    seh $1, $1
6233; MIPS64R2-NEXT:    xor $1, $2, $1
6234; MIPS64R2-NEXT:    sltiu $3, $1, 1
6235; MIPS64R2-NEXT:    sync
6236; MIPS64R2-NEXT:    jr $ra
6237; MIPS64R2-NEXT:    nop
6238;
6239; MIPS64R6-LABEL: foo:
6240; MIPS64R6:       # %bb.0:
6241; MIPS64R6-NEXT:    sll $1, $6, 0
6242; MIPS64R6-NEXT:    sll $2, $5, 0
6243; MIPS64R6-NEXT:    addu $1, $2, $1
6244; MIPS64R6-NEXT:    sync
6245; MIPS64R6-NEXT:    sll $2, $7, 0
6246; MIPS64R6-NEXT:    daddiu $3, $zero, -4
6247; MIPS64R6-NEXT:    and $3, $4, $3
6248; MIPS64R6-NEXT:    andi $4, $4, 3
6249; MIPS64R6-NEXT:    sll $4, $4, 3
6250; MIPS64R6-NEXT:    ori $5, $zero, 65535
6251; MIPS64R6-NEXT:    sllv $5, $5, $4
6252; MIPS64R6-NEXT:    nor $6, $zero, $5
6253; MIPS64R6-NEXT:    andi $7, $1, 65535
6254; MIPS64R6-NEXT:    sllv $7, $7, $4
6255; MIPS64R6-NEXT:    andi $2, $2, 65535
6256; MIPS64R6-NEXT:    sllv $8, $2, $4
6257; MIPS64R6-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6258; MIPS64R6-NEXT:    ll $9, 0($3)
6259; MIPS64R6-NEXT:    and $10, $9, $5
6260; MIPS64R6-NEXT:    bnec $10, $7, .LBB15_3
6261; MIPS64R6-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6262; MIPS64R6-NEXT:    and $9, $9, $6
6263; MIPS64R6-NEXT:    or $9, $9, $8
6264; MIPS64R6-NEXT:    sc $9, 0($3)
6265; MIPS64R6-NEXT:    beqzc $9, .LBB15_1
6266; MIPS64R6-NEXT:  .LBB15_3:
6267; MIPS64R6-NEXT:    srlv $2, $10, $4
6268; MIPS64R6-NEXT:    seh $2, $2
6269; MIPS64R6-NEXT:  # %bb.4:
6270; MIPS64R6-NEXT:    seh $1, $1
6271; MIPS64R6-NEXT:    xor $1, $2, $1
6272; MIPS64R6-NEXT:    sltiu $3, $1, 1
6273; MIPS64R6-NEXT:    sync
6274; MIPS64R6-NEXT:    jrc $ra
6275;
6276; MIPS64R6O0-LABEL: foo:
6277; MIPS64R6O0:       # %bb.0:
6278; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
6279; MIPS64R6O0-NEXT:    .cfi_def_cfa_offset 16
6280; MIPS64R6O0-NEXT:    move $3, $4
6281; MIPS64R6O0-NEXT:    move $1, $7
6282; MIPS64R6O0-NEXT:    sll $1, $1, 0
6283; MIPS64R6O0-NEXT:    move $2, $6
6284; MIPS64R6O0-NEXT:    sll $4, $2, 0
6285; MIPS64R6O0-NEXT:    move $2, $5
6286; MIPS64R6O0-NEXT:    sll $2, $2, 0
6287; MIPS64R6O0-NEXT:    addu $2, $2, $4
6288; MIPS64R6O0-NEXT:    sw $2, 8($sp) # 4-byte Folded Spill
6289; MIPS64R6O0-NEXT:    sync
6290; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
6291; MIPS64R6O0-NEXT:    and $4, $3, $4
6292; MIPS64R6O0-NEXT:    andi $3, $3, 3
6293; MIPS64R6O0-NEXT:    xori $3, $3, 2
6294; MIPS64R6O0-NEXT:    sll $9, $3, 3
6295; MIPS64R6O0-NEXT:    ori $3, $zero, 65535
6296; MIPS64R6O0-NEXT:    sllv $5, $3, $9
6297; MIPS64R6O0-NEXT:    nor $7, $zero, $5
6298; MIPS64R6O0-NEXT:    andi $2, $2, 65535
6299; MIPS64R6O0-NEXT:    sllv $6, $2, $9
6300; MIPS64R6O0-NEXT:    andi $1, $1, 65535
6301; MIPS64R6O0-NEXT:    sllv $8, $1, $9
6302; MIPS64R6O0-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6303; MIPS64R6O0-NEXT:    ll $2, 0($4)
6304; MIPS64R6O0-NEXT:    and $3, $2, $5
6305; MIPS64R6O0-NEXT:    bnec $3, $6, .LBB15_3
6306; MIPS64R6O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6307; MIPS64R6O0-NEXT:    and $2, $2, $7
6308; MIPS64R6O0-NEXT:    or $2, $2, $8
6309; MIPS64R6O0-NEXT:    sc $2, 0($4)
6310; MIPS64R6O0-NEXT:    beqzc $2, .LBB15_1
6311; MIPS64R6O0-NEXT:  .LBB15_3:
6312; MIPS64R6O0-NEXT:    srlv $1, $3, $9
6313; MIPS64R6O0-NEXT:    seh $1, $1
6314; MIPS64R6O0-NEXT:  # %bb.4:
6315; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
6316; MIPS64R6O0-NEXT:  # %bb.5:
6317; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
6318; MIPS64R6O0-NEXT:    lw $1, 8($sp) # 4-byte Folded Reload
6319; MIPS64R6O0-NEXT:    seh $1, $1
6320; MIPS64R6O0-NEXT:    xor $1, $2, $1
6321; MIPS64R6O0-NEXT:    sltiu $3, $1, 1
6322; MIPS64R6O0-NEXT:    sync
6323; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
6324; MIPS64R6O0-NEXT:    jrc $ra
6325;
6326; MM32-LABEL: foo:
6327; MM32:       # %bb.0:
6328; MM32-NEXT:    addu16 $3, $5, $6
6329; MM32-NEXT:    sync
6330; MM32-NEXT:    addiu $1, $zero, -4
6331; MM32-NEXT:    and $1, $4, $1
6332; MM32-NEXT:    andi $2, $4, 3
6333; MM32-NEXT:    sll $4, $2, 3
6334; MM32-NEXT:    ori $2, $zero, 65535
6335; MM32-NEXT:    sllv $5, $2, $4
6336; MM32-NEXT:    nor $6, $zero, $5
6337; MM32-NEXT:    andi $2, $3, 65535
6338; MM32-NEXT:    sllv $8, $2, $4
6339; MM32-NEXT:    andi $2, $7, 65535
6340; MM32-NEXT:    sllv $7, $2, $4
6341; MM32-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6342; MM32-NEXT:    ll $9, 0($1)
6343; MM32-NEXT:    and $10, $9, $5
6344; MM32-NEXT:    bne $10, $8, $BB15_3
6345; MM32-NEXT:    nop
6346; MM32-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6347; MM32-NEXT:    and $9, $9, $6
6348; MM32-NEXT:    or $9, $9, $7
6349; MM32-NEXT:    sc $9, 0($1)
6350; MM32-NEXT:    beqzc $9, $BB15_1
6351; MM32-NEXT:  $BB15_3:
6352; MM32-NEXT:    srlv $2, $10, $4
6353; MM32-NEXT:    seh $2, $2
6354; MM32-NEXT:  # %bb.4:
6355; MM32-NEXT:    seh $1, $3
6356; MM32-NEXT:    xor $1, $2, $1
6357; MM32-NEXT:    sltiu $3, $1, 1
6358; MM32-NEXT:    sync
6359; MM32-NEXT:    jrc $ra
6360;
6361; O1-LABEL: foo:
6362; O1:       # %bb.0:
6363; O1-NEXT:    addu $1, $5, $6
6364; O1-NEXT:    sync
6365; O1-NEXT:    addiu $2, $zero, -4
6366; O1-NEXT:    and $3, $4, $2
6367; O1-NEXT:    andi $2, $4, 3
6368; O1-NEXT:    sll $4, $2, 3
6369; O1-NEXT:    ori $2, $zero, 65535
6370; O1-NEXT:    sllv $5, $2, $4
6371; O1-NEXT:    nor $6, $zero, $5
6372; O1-NEXT:    andi $2, $1, 65535
6373; O1-NEXT:    sllv $8, $2, $4
6374; O1-NEXT:    andi $2, $7, 65535
6375; O1-NEXT:    sllv $7, $2, $4
6376; O1-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6377; O1-NEXT:    ll $9, 0($3)
6378; O1-NEXT:    and $10, $9, $5
6379; O1-NEXT:    bne $10, $8, $BB15_3
6380; O1-NEXT:    nop
6381; O1-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6382; O1-NEXT:    and $9, $9, $6
6383; O1-NEXT:    or $9, $9, $7
6384; O1-NEXT:    sc $9, 0($3)
6385; O1-NEXT:    beqz $9, $BB15_1
6386; O1-NEXT:    nop
6387; O1-NEXT:  $BB15_3:
6388; O1-NEXT:    srlv $2, $10, $4
6389; O1-NEXT:    sll $2, $2, 16
6390; O1-NEXT:    sra $2, $2, 16
6391; O1-NEXT:  # %bb.4:
6392; O1-NEXT:    sll $1, $1, 16
6393; O1-NEXT:    sra $1, $1, 16
6394; O1-NEXT:    xor $1, $2, $1
6395; O1-NEXT:    sltiu $3, $1, 1
6396; O1-NEXT:    sync
6397; O1-NEXT:    jr $ra
6398; O1-NEXT:    nop
6399;
6400; O2-LABEL: foo:
6401; O2:       # %bb.0:
6402; O2-NEXT:    addu $1, $5, $6
6403; O2-NEXT:    sync
6404; O2-NEXT:    addiu $2, $zero, -4
6405; O2-NEXT:    and $3, $4, $2
6406; O2-NEXT:    andi $2, $4, 3
6407; O2-NEXT:    sll $4, $2, 3
6408; O2-NEXT:    ori $2, $zero, 65535
6409; O2-NEXT:    sllv $5, $2, $4
6410; O2-NEXT:    nor $6, $zero, $5
6411; O2-NEXT:    andi $2, $1, 65535
6412; O2-NEXT:    sllv $8, $2, $4
6413; O2-NEXT:    andi $2, $7, 65535
6414; O2-NEXT:    sllv $7, $2, $4
6415; O2-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6416; O2-NEXT:    ll $9, 0($3)
6417; O2-NEXT:    and $10, $9, $5
6418; O2-NEXT:    bne $10, $8, $BB15_3
6419; O2-NEXT:    nop
6420; O2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6421; O2-NEXT:    and $9, $9, $6
6422; O2-NEXT:    or $9, $9, $7
6423; O2-NEXT:    sc $9, 0($3)
6424; O2-NEXT:    beqz $9, $BB15_1
6425; O2-NEXT:    nop
6426; O2-NEXT:  $BB15_3:
6427; O2-NEXT:    srlv $2, $10, $4
6428; O2-NEXT:    sll $2, $2, 16
6429; O2-NEXT:    sra $2, $2, 16
6430; O2-NEXT:  # %bb.4:
6431; O2-NEXT:    sll $1, $1, 16
6432; O2-NEXT:    sra $1, $1, 16
6433; O2-NEXT:    xor $1, $2, $1
6434; O2-NEXT:    sltiu $3, $1, 1
6435; O2-NEXT:    sync
6436; O2-NEXT:    jr $ra
6437; O2-NEXT:    nop
6438;
6439; O3-LABEL: foo:
6440; O3:       # %bb.0:
6441; O3-NEXT:    addiu $2, $zero, -4
6442; O3-NEXT:    addu $1, $5, $6
6443; O3-NEXT:    sync
6444; O3-NEXT:    and $3, $4, $2
6445; O3-NEXT:    andi $2, $4, 3
6446; O3-NEXT:    sll $4, $2, 3
6447; O3-NEXT:    ori $2, $zero, 65535
6448; O3-NEXT:    sllv $5, $2, $4
6449; O3-NEXT:    andi $2, $1, 65535
6450; O3-NEXT:    sll $1, $1, 16
6451; O3-NEXT:    sllv $8, $2, $4
6452; O3-NEXT:    andi $2, $7, 65535
6453; O3-NEXT:    nor $6, $zero, $5
6454; O3-NEXT:    sra $1, $1, 16
6455; O3-NEXT:    sllv $7, $2, $4
6456; O3-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6457; O3-NEXT:    ll $9, 0($3)
6458; O3-NEXT:    and $10, $9, $5
6459; O3-NEXT:    bne $10, $8, $BB15_3
6460; O3-NEXT:    nop
6461; O3-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6462; O3-NEXT:    and $9, $9, $6
6463; O3-NEXT:    or $9, $9, $7
6464; O3-NEXT:    sc $9, 0($3)
6465; O3-NEXT:    beqz $9, $BB15_1
6466; O3-NEXT:    nop
6467; O3-NEXT:  $BB15_3:
6468; O3-NEXT:    srlv $2, $10, $4
6469; O3-NEXT:    sll $2, $2, 16
6470; O3-NEXT:    sra $2, $2, 16
6471; O3-NEXT:  # %bb.4:
6472; O3-NEXT:    sync
6473; O3-NEXT:    xor $1, $2, $1
6474; O3-NEXT:    jr $ra
6475; O3-NEXT:    sltiu $3, $1, 1
6476;
6477; MIPS32EB-LABEL: foo:
6478; MIPS32EB:       # %bb.0:
6479; MIPS32EB-NEXT:    addu $1, $5, $6
6480; MIPS32EB-NEXT:    sync
6481; MIPS32EB-NEXT:    addiu $2, $zero, -4
6482; MIPS32EB-NEXT:    and $3, $4, $2
6483; MIPS32EB-NEXT:    andi $2, $4, 3
6484; MIPS32EB-NEXT:    xori $2, $2, 2
6485; MIPS32EB-NEXT:    sll $4, $2, 3
6486; MIPS32EB-NEXT:    ori $2, $zero, 65535
6487; MIPS32EB-NEXT:    sllv $5, $2, $4
6488; MIPS32EB-NEXT:    nor $6, $zero, $5
6489; MIPS32EB-NEXT:    andi $2, $1, 65535
6490; MIPS32EB-NEXT:    sllv $8, $2, $4
6491; MIPS32EB-NEXT:    andi $2, $7, 65535
6492; MIPS32EB-NEXT:    sllv $7, $2, $4
6493; MIPS32EB-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6494; MIPS32EB-NEXT:    ll $9, 0($3)
6495; MIPS32EB-NEXT:    and $10, $9, $5
6496; MIPS32EB-NEXT:    bne $10, $8, $BB15_3
6497; MIPS32EB-NEXT:    nop
6498; MIPS32EB-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6499; MIPS32EB-NEXT:    and $9, $9, $6
6500; MIPS32EB-NEXT:    or $9, $9, $7
6501; MIPS32EB-NEXT:    sc $9, 0($3)
6502; MIPS32EB-NEXT:    beqz $9, $BB15_1
6503; MIPS32EB-NEXT:    nop
6504; MIPS32EB-NEXT:  $BB15_3:
6505; MIPS32EB-NEXT:    srlv $2, $10, $4
6506; MIPS32EB-NEXT:    sll $2, $2, 16
6507; MIPS32EB-NEXT:    sra $2, $2, 16
6508; MIPS32EB-NEXT:  # %bb.4:
6509; MIPS32EB-NEXT:    sll $1, $1, 16
6510; MIPS32EB-NEXT:    sra $1, $1, 16
6511; MIPS32EB-NEXT:    xor $1, $2, $1
6512; MIPS32EB-NEXT:    sltiu $3, $1, 1
6513; MIPS32EB-NEXT:    sync
6514; MIPS32EB-NEXT:    jr $ra
6515; MIPS32EB-NEXT:    nop
6516  %desired = add i16 %l, %r
6517  %res = cmpxchg ptr %addr, i16 %desired, i16 %new seq_cst seq_cst
6518  ret {i16, i1} %res
6519}
6520
6521@countsint = common global i32 0, align 4
6522
6523define i32 @CheckSync(i32 signext %v) nounwind noinline {
6524; MIPS32-LABEL: CheckSync:
6525; MIPS32:       # %bb.0: # %entry
6526; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
6527; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6528; MIPS32-NEXT:    addu $1, $2, $25
6529; MIPS32-NEXT:    sync
6530; MIPS32-NEXT:    lw $1, %got(countsint)($1)
6531; MIPS32-NEXT:  $BB16_1: # %entry
6532; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
6533; MIPS32-NEXT:    ll $2, 0($1)
6534; MIPS32-NEXT:    addu $3, $2, $4
6535; MIPS32-NEXT:    sc $3, 0($1)
6536; MIPS32-NEXT:    beqz $3, $BB16_1
6537; MIPS32-NEXT:    nop
6538; MIPS32-NEXT:  # %bb.2: # %entry
6539; MIPS32-NEXT:    sync
6540; MIPS32-NEXT:    jr $ra
6541; MIPS32-NEXT:    nop
6542;
6543; MIPS32O0-LABEL: CheckSync:
6544; MIPS32O0:       # %bb.0: # %entry
6545; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
6546; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6547; MIPS32O0-NEXT:    addu $1, $2, $25
6548; MIPS32O0-NEXT:    sync
6549; MIPS32O0-NEXT:    lw $3, %got(countsint)($1)
6550; MIPS32O0-NEXT:  $BB16_1: # %entry
6551; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
6552; MIPS32O0-NEXT:    ll $2, 0($3)
6553; MIPS32O0-NEXT:    addu $1, $2, $4
6554; MIPS32O0-NEXT:    sc $1, 0($3)
6555; MIPS32O0-NEXT:    beqz $1, $BB16_1
6556; MIPS32O0-NEXT:    nop
6557; MIPS32O0-NEXT:  # %bb.2: # %entry
6558; MIPS32O0-NEXT:    sync
6559; MIPS32O0-NEXT:    jr $ra
6560; MIPS32O0-NEXT:    nop
6561;
6562; MIPS32R2-LABEL: CheckSync:
6563; MIPS32R2:       # %bb.0: # %entry
6564; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
6565; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6566; MIPS32R2-NEXT:    addu $1, $2, $25
6567; MIPS32R2-NEXT:    sync
6568; MIPS32R2-NEXT:    lw $1, %got(countsint)($1)
6569; MIPS32R2-NEXT:  $BB16_1: # %entry
6570; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
6571; MIPS32R2-NEXT:    ll $2, 0($1)
6572; MIPS32R2-NEXT:    addu $3, $2, $4
6573; MIPS32R2-NEXT:    sc $3, 0($1)
6574; MIPS32R2-NEXT:    beqz $3, $BB16_1
6575; MIPS32R2-NEXT:    nop
6576; MIPS32R2-NEXT:  # %bb.2: # %entry
6577; MIPS32R2-NEXT:    sync
6578; MIPS32R2-NEXT:    jr $ra
6579; MIPS32R2-NEXT:    nop
6580;
6581; MIPS32R6-LABEL: CheckSync:
6582; MIPS32R6:       # %bb.0: # %entry
6583; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
6584; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
6585; MIPS32R6-NEXT:    addu $1, $2, $25
6586; MIPS32R6-NEXT:    sync
6587; MIPS32R6-NEXT:    lw $1, %got(countsint)($1)
6588; MIPS32R6-NEXT:  $BB16_1: # %entry
6589; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
6590; MIPS32R6-NEXT:    ll $2, 0($1)
6591; MIPS32R6-NEXT:    addu $3, $2, $4
6592; MIPS32R6-NEXT:    sc $3, 0($1)
6593; MIPS32R6-NEXT:    beqzc $3, $BB16_1
6594; MIPS32R6-NEXT:  # %bb.2: # %entry
6595; MIPS32R6-NEXT:    sync
6596; MIPS32R6-NEXT:    jrc $ra
6597;
6598; MIPS32R6O0-LABEL: CheckSync:
6599; MIPS32R6O0:       # %bb.0: # %entry
6600; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
6601; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6602; MIPS32R6O0-NEXT:    addu $1, $2, $25
6603; MIPS32R6O0-NEXT:    sync
6604; MIPS32R6O0-NEXT:    lw $3, %got(countsint)($1)
6605; MIPS32R6O0-NEXT:  $BB16_1: # %entry
6606; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
6607; MIPS32R6O0-NEXT:    ll $2, 0($3)
6608; MIPS32R6O0-NEXT:    addu $1, $2, $4
6609; MIPS32R6O0-NEXT:    sc $1, 0($3)
6610; MIPS32R6O0-NEXT:    beqzc $1, $BB16_1
6611; MIPS32R6O0-NEXT:  # %bb.2: # %entry
6612; MIPS32R6O0-NEXT:    sync
6613; MIPS32R6O0-NEXT:    jrc $ra
6614;
6615; MIPS4-LABEL: CheckSync:
6616; MIPS4:       # %bb.0: # %entry
6617; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6618; MIPS4-NEXT:    daddu $1, $1, $25
6619; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6620; MIPS4-NEXT:    sync
6621; MIPS4-NEXT:    ld $1, %got_disp(countsint)($1)
6622; MIPS4-NEXT:  .LBB16_1: # %entry
6623; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
6624; MIPS4-NEXT:    ll $2, 0($1)
6625; MIPS4-NEXT:    addu $3, $2, $4
6626; MIPS4-NEXT:    sc $3, 0($1)
6627; MIPS4-NEXT:    beqz $3, .LBB16_1
6628; MIPS4-NEXT:    nop
6629; MIPS4-NEXT:  # %bb.2: # %entry
6630; MIPS4-NEXT:    sync
6631; MIPS4-NEXT:    jr $ra
6632; MIPS4-NEXT:    nop
6633;
6634; MIPS64-LABEL: CheckSync:
6635; MIPS64:       # %bb.0: # %entry
6636; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6637; MIPS64-NEXT:    daddu $1, $1, $25
6638; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6639; MIPS64-NEXT:    sync
6640; MIPS64-NEXT:    ld $1, %got_disp(countsint)($1)
6641; MIPS64-NEXT:  .LBB16_1: # %entry
6642; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
6643; MIPS64-NEXT:    ll $2, 0($1)
6644; MIPS64-NEXT:    addu $3, $2, $4
6645; MIPS64-NEXT:    sc $3, 0($1)
6646; MIPS64-NEXT:    beqz $3, .LBB16_1
6647; MIPS64-NEXT:    nop
6648; MIPS64-NEXT:  # %bb.2: # %entry
6649; MIPS64-NEXT:    sync
6650; MIPS64-NEXT:    jr $ra
6651; MIPS64-NEXT:    nop
6652;
6653; MIPS64R2-LABEL: CheckSync:
6654; MIPS64R2:       # %bb.0: # %entry
6655; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6656; MIPS64R2-NEXT:    daddu $1, $1, $25
6657; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6658; MIPS64R2-NEXT:    sync
6659; MIPS64R2-NEXT:    ld $1, %got_disp(countsint)($1)
6660; MIPS64R2-NEXT:  .LBB16_1: # %entry
6661; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
6662; MIPS64R2-NEXT:    ll $2, 0($1)
6663; MIPS64R2-NEXT:    addu $3, $2, $4
6664; MIPS64R2-NEXT:    sc $3, 0($1)
6665; MIPS64R2-NEXT:    beqz $3, .LBB16_1
6666; MIPS64R2-NEXT:    nop
6667; MIPS64R2-NEXT:  # %bb.2: # %entry
6668; MIPS64R2-NEXT:    sync
6669; MIPS64R2-NEXT:    jr $ra
6670; MIPS64R2-NEXT:    nop
6671;
6672; MIPS64R6-LABEL: CheckSync:
6673; MIPS64R6:       # %bb.0: # %entry
6674; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6675; MIPS64R6-NEXT:    daddu $1, $1, $25
6676; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6677; MIPS64R6-NEXT:    sync
6678; MIPS64R6-NEXT:    ld $1, %got_disp(countsint)($1)
6679; MIPS64R6-NEXT:  .LBB16_1: # %entry
6680; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
6681; MIPS64R6-NEXT:    ll $2, 0($1)
6682; MIPS64R6-NEXT:    addu $3, $2, $4
6683; MIPS64R6-NEXT:    sc $3, 0($1)
6684; MIPS64R6-NEXT:    beqzc $3, .LBB16_1
6685; MIPS64R6-NEXT:  # %bb.2: # %entry
6686; MIPS64R6-NEXT:    sync
6687; MIPS64R6-NEXT:    jrc $ra
6688;
6689; MIPS64R6O0-LABEL: CheckSync:
6690; MIPS64R6O0:       # %bb.0: # %entry
6691; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6692; MIPS64R6O0-NEXT:    daddu $1, $1, $25
6693; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6694; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
6695; MIPS64R6O0-NEXT:    sync
6696; MIPS64R6O0-NEXT:    ld $3, %got_disp(countsint)($1)
6697; MIPS64R6O0-NEXT:  .LBB16_1: # %entry
6698; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
6699; MIPS64R6O0-NEXT:    ll $2, 0($3)
6700; MIPS64R6O0-NEXT:    addu $1, $2, $4
6701; MIPS64R6O0-NEXT:    sc $1, 0($3)
6702; MIPS64R6O0-NEXT:    beqzc $1, .LBB16_1
6703; MIPS64R6O0-NEXT:  # %bb.2: # %entry
6704; MIPS64R6O0-NEXT:    sync
6705; MIPS64R6O0-NEXT:    jrc $ra
6706;
6707; MM32-LABEL: CheckSync:
6708; MM32:       # %bb.0: # %entry
6709; MM32-NEXT:    lui $2, %hi(_gp_disp)
6710; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6711; MM32-NEXT:    addu $2, $2, $25
6712; MM32-NEXT:    sync
6713; MM32-NEXT:    lw $1, %got(countsint)($2)
6714; MM32-NEXT:  $BB16_1: # %entry
6715; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
6716; MM32-NEXT:    ll $2, 0($1)
6717; MM32-NEXT:    addu16 $3, $2, $4
6718; MM32-NEXT:    sc $3, 0($1)
6719; MM32-NEXT:    beqzc $3, $BB16_1
6720; MM32-NEXT:  # %bb.2: # %entry
6721; MM32-NEXT:    sync
6722; MM32-NEXT:    jrc $ra
6723;
6724; O1-LABEL: CheckSync:
6725; O1:       # %bb.0: # %entry
6726; O1-NEXT:    lui $2, %hi(_gp_disp)
6727; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
6728; O1-NEXT:    addu $1, $2, $25
6729; O1-NEXT:    sync
6730; O1-NEXT:    lw $1, %got(countsint)($1)
6731; O1-NEXT:  $BB16_1: # %entry
6732; O1-NEXT:    # =>This Inner Loop Header: Depth=1
6733; O1-NEXT:    ll $2, 0($1)
6734; O1-NEXT:    addu $3, $2, $4
6735; O1-NEXT:    sc $3, 0($1)
6736; O1-NEXT:    beqz $3, $BB16_1
6737; O1-NEXT:    nop
6738; O1-NEXT:  # %bb.2: # %entry
6739; O1-NEXT:    sync
6740; O1-NEXT:    jr $ra
6741; O1-NEXT:    nop
6742;
6743; O2-LABEL: CheckSync:
6744; O2:       # %bb.0: # %entry
6745; O2-NEXT:    lui $2, %hi(_gp_disp)
6746; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6747; O2-NEXT:    addu $1, $2, $25
6748; O2-NEXT:    sync
6749; O2-NEXT:    lw $1, %got(countsint)($1)
6750; O2-NEXT:  $BB16_1: # %entry
6751; O2-NEXT:    # =>This Inner Loop Header: Depth=1
6752; O2-NEXT:    ll $2, 0($1)
6753; O2-NEXT:    addu $3, $2, $4
6754; O2-NEXT:    sc $3, 0($1)
6755; O2-NEXT:    beqz $3, $BB16_1
6756; O2-NEXT:    nop
6757; O2-NEXT:  # %bb.2: # %entry
6758; O2-NEXT:    sync
6759; O2-NEXT:    jr $ra
6760; O2-NEXT:    nop
6761;
6762; O3-LABEL: CheckSync:
6763; O3:       # %bb.0: # %entry
6764; O3-NEXT:    lui $2, %hi(_gp_disp)
6765; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
6766; O3-NEXT:    addu $1, $2, $25
6767; O3-NEXT:    sync
6768; O3-NEXT:    lw $1, %got(countsint)($1)
6769; O3-NEXT:  $BB16_1: # %entry
6770; O3-NEXT:    # =>This Inner Loop Header: Depth=1
6771; O3-NEXT:    ll $2, 0($1)
6772; O3-NEXT:    addu $3, $2, $4
6773; O3-NEXT:    sc $3, 0($1)
6774; O3-NEXT:    beqz $3, $BB16_1
6775; O3-NEXT:    nop
6776; O3-NEXT:  # %bb.2: # %entry
6777; O3-NEXT:    sync
6778; O3-NEXT:    jr $ra
6779; O3-NEXT:    nop
6780;
6781; MIPS32EB-LABEL: CheckSync:
6782; MIPS32EB:       # %bb.0: # %entry
6783; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
6784; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
6785; MIPS32EB-NEXT:    addu $1, $2, $25
6786; MIPS32EB-NEXT:    sync
6787; MIPS32EB-NEXT:    lw $1, %got(countsint)($1)
6788; MIPS32EB-NEXT:  $BB16_1: # %entry
6789; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
6790; MIPS32EB-NEXT:    ll $2, 0($1)
6791; MIPS32EB-NEXT:    addu $3, $2, $4
6792; MIPS32EB-NEXT:    sc $3, 0($1)
6793; MIPS32EB-NEXT:    beqz $3, $BB16_1
6794; MIPS32EB-NEXT:    nop
6795; MIPS32EB-NEXT:  # %bb.2: # %entry
6796; MIPS32EB-NEXT:    sync
6797; MIPS32EB-NEXT:    jr $ra
6798; MIPS32EB-NEXT:    nop
6799entry:
6800  %0 = atomicrmw add ptr @countsint, i32 %v seq_cst
6801  ret i32 %0
6802}
6803
6804; make sure that this assertion in
6805; TwoAddressInstructionPass::TryInstructionTransform does not fail:
6806;
6807; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) &&
6808;
6809; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an
6810; operand of an atomic instruction with register $zero.
6811@a = external global i32
6812
6813define i32 @zeroreg() nounwind {
6814; MIPS32-LABEL: zeroreg:
6815; MIPS32:       # %bb.0: # %entry
6816; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
6817; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6818; MIPS32-NEXT:    addu $1, $2, $25
6819; MIPS32-NEXT:    sync
6820; MIPS32-NEXT:    addiu $2, $zero, 0
6821; MIPS32-NEXT:    addiu $3, $zero, 1
6822; MIPS32-NEXT:    lw $1, %got(a)($1)
6823; MIPS32-NEXT:  $BB17_1: # %entry
6824; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
6825; MIPS32-NEXT:    ll $4, 0($1)
6826; MIPS32-NEXT:    bne $4, $3, $BB17_3
6827; MIPS32-NEXT:    nop
6828; MIPS32-NEXT:  # %bb.2: # %entry
6829; MIPS32-NEXT:    # in Loop: Header=BB17_1 Depth=1
6830; MIPS32-NEXT:    move $5, $2
6831; MIPS32-NEXT:    sc $5, 0($1)
6832; MIPS32-NEXT:    beqz $5, $BB17_1
6833; MIPS32-NEXT:    nop
6834; MIPS32-NEXT:  $BB17_3: # %entry
6835; MIPS32-NEXT:    xor $1, $4, $3
6836; MIPS32-NEXT:    sltiu $2, $1, 1
6837; MIPS32-NEXT:    sync
6838; MIPS32-NEXT:    jr $ra
6839; MIPS32-NEXT:    nop
6840;
6841; MIPS32O0-LABEL: zeroreg:
6842; MIPS32O0:       # %bb.0: # %entry
6843; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
6844; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6845; MIPS32O0-NEXT:    addu $1, $2, $25
6846; MIPS32O0-NEXT:    sync
6847; MIPS32O0-NEXT:    lw $4, %got(a)($1)
6848; MIPS32O0-NEXT:    addiu $6, $zero, 0
6849; MIPS32O0-NEXT:    addiu $2, $zero, 1
6850; MIPS32O0-NEXT:    move $5, $2
6851; MIPS32O0-NEXT:  $BB17_1: # %entry
6852; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
6853; MIPS32O0-NEXT:    ll $1, 0($4)
6854; MIPS32O0-NEXT:    bne $1, $5, $BB17_3
6855; MIPS32O0-NEXT:    nop
6856; MIPS32O0-NEXT:  # %bb.2: # %entry
6857; MIPS32O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
6858; MIPS32O0-NEXT:    move $3, $6
6859; MIPS32O0-NEXT:    sc $3, 0($4)
6860; MIPS32O0-NEXT:    beqz $3, $BB17_1
6861; MIPS32O0-NEXT:    nop
6862; MIPS32O0-NEXT:  $BB17_3: # %entry
6863; MIPS32O0-NEXT:    xor $2, $1, $2
6864; MIPS32O0-NEXT:    sltiu $2, $2, 1
6865; MIPS32O0-NEXT:    sync
6866; MIPS32O0-NEXT:    addiu $2, $zero, 1
6867; MIPS32O0-NEXT:    xor $1, $1, $2
6868; MIPS32O0-NEXT:    sltiu $1, $1, 1
6869; MIPS32O0-NEXT:    andi $2, $1, 1
6870; MIPS32O0-NEXT:    jr $ra
6871; MIPS32O0-NEXT:    nop
6872;
6873; MIPS32R2-LABEL: zeroreg:
6874; MIPS32R2:       # %bb.0: # %entry
6875; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
6876; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6877; MIPS32R2-NEXT:    addu $1, $2, $25
6878; MIPS32R2-NEXT:    sync
6879; MIPS32R2-NEXT:    addiu $2, $zero, 0
6880; MIPS32R2-NEXT:    addiu $3, $zero, 1
6881; MIPS32R2-NEXT:    lw $1, %got(a)($1)
6882; MIPS32R2-NEXT:  $BB17_1: # %entry
6883; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
6884; MIPS32R2-NEXT:    ll $4, 0($1)
6885; MIPS32R2-NEXT:    bne $4, $3, $BB17_3
6886; MIPS32R2-NEXT:    nop
6887; MIPS32R2-NEXT:  # %bb.2: # %entry
6888; MIPS32R2-NEXT:    # in Loop: Header=BB17_1 Depth=1
6889; MIPS32R2-NEXT:    move $5, $2
6890; MIPS32R2-NEXT:    sc $5, 0($1)
6891; MIPS32R2-NEXT:    beqz $5, $BB17_1
6892; MIPS32R2-NEXT:    nop
6893; MIPS32R2-NEXT:  $BB17_3: # %entry
6894; MIPS32R2-NEXT:    xor $1, $4, $3
6895; MIPS32R2-NEXT:    sltiu $2, $1, 1
6896; MIPS32R2-NEXT:    sync
6897; MIPS32R2-NEXT:    jr $ra
6898; MIPS32R2-NEXT:    nop
6899;
6900; MIPS32R6-LABEL: zeroreg:
6901; MIPS32R6:       # %bb.0: # %entry
6902; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
6903; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
6904; MIPS32R6-NEXT:    addu $1, $2, $25
6905; MIPS32R6-NEXT:    sync
6906; MIPS32R6-NEXT:    addiu $2, $zero, 0
6907; MIPS32R6-NEXT:    addiu $3, $zero, 1
6908; MIPS32R6-NEXT:    lw $1, %got(a)($1)
6909; MIPS32R6-NEXT:  $BB17_1: # %entry
6910; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
6911; MIPS32R6-NEXT:    ll $4, 0($1)
6912; MIPS32R6-NEXT:    bnec $4, $3, $BB17_3
6913; MIPS32R6-NEXT:  # %bb.2: # %entry
6914; MIPS32R6-NEXT:    # in Loop: Header=BB17_1 Depth=1
6915; MIPS32R6-NEXT:    move $5, $2
6916; MIPS32R6-NEXT:    sc $5, 0($1)
6917; MIPS32R6-NEXT:    beqzc $5, $BB17_1
6918; MIPS32R6-NEXT:  $BB17_3: # %entry
6919; MIPS32R6-NEXT:    xor $1, $4, $3
6920; MIPS32R6-NEXT:    sltiu $2, $1, 1
6921; MIPS32R6-NEXT:    sync
6922; MIPS32R6-NEXT:    jrc $ra
6923;
6924; MIPS32R6O0-LABEL: zeroreg:
6925; MIPS32R6O0:       # %bb.0: # %entry
6926; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
6927; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6928; MIPS32R6O0-NEXT:    addu $1, $2, $25
6929; MIPS32R6O0-NEXT:    sync
6930; MIPS32R6O0-NEXT:    lw $4, %got(a)($1)
6931; MIPS32R6O0-NEXT:    addiu $6, $zero, 0
6932; MIPS32R6O0-NEXT:    addiu $2, $zero, 1
6933; MIPS32R6O0-NEXT:    move $5, $2
6934; MIPS32R6O0-NEXT:  $BB17_1: # %entry
6935; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
6936; MIPS32R6O0-NEXT:    ll $1, 0($4)
6937; MIPS32R6O0-NEXT:    bnec $1, $5, $BB17_3
6938; MIPS32R6O0-NEXT:  # %bb.2: # %entry
6939; MIPS32R6O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
6940; MIPS32R6O0-NEXT:    move $3, $6
6941; MIPS32R6O0-NEXT:    sc $3, 0($4)
6942; MIPS32R6O0-NEXT:    beqzc $3, $BB17_1
6943; MIPS32R6O0-NEXT:  $BB17_3: # %entry
6944; MIPS32R6O0-NEXT:    xor $1, $1, $2
6945; MIPS32R6O0-NEXT:    sltiu $2, $1, 1
6946; MIPS32R6O0-NEXT:    sync
6947; MIPS32R6O0-NEXT:    jrc $ra
6948;
6949; MIPS4-LABEL: zeroreg:
6950; MIPS4:       # %bb.0: # %entry
6951; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
6952; MIPS4-NEXT:    daddu $1, $1, $25
6953; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
6954; MIPS4-NEXT:    sync
6955; MIPS4-NEXT:    addiu $2, $zero, 0
6956; MIPS4-NEXT:    addiu $3, $zero, 1
6957; MIPS4-NEXT:    ld $1, %got_disp(a)($1)
6958; MIPS4-NEXT:  .LBB17_1: # %entry
6959; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
6960; MIPS4-NEXT:    ll $4, 0($1)
6961; MIPS4-NEXT:    bne $4, $3, .LBB17_3
6962; MIPS4-NEXT:    nop
6963; MIPS4-NEXT:  # %bb.2: # %entry
6964; MIPS4-NEXT:    # in Loop: Header=BB17_1 Depth=1
6965; MIPS4-NEXT:    move $5, $2
6966; MIPS4-NEXT:    sc $5, 0($1)
6967; MIPS4-NEXT:    beqz $5, .LBB17_1
6968; MIPS4-NEXT:    nop
6969; MIPS4-NEXT:  .LBB17_3: # %entry
6970; MIPS4-NEXT:    xor $1, $4, $3
6971; MIPS4-NEXT:    sltiu $2, $1, 1
6972; MIPS4-NEXT:    sync
6973; MIPS4-NEXT:    jr $ra
6974; MIPS4-NEXT:    nop
6975;
6976; MIPS64-LABEL: zeroreg:
6977; MIPS64:       # %bb.0: # %entry
6978; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
6979; MIPS64-NEXT:    daddu $1, $1, $25
6980; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
6981; MIPS64-NEXT:    sync
6982; MIPS64-NEXT:    addiu $2, $zero, 0
6983; MIPS64-NEXT:    addiu $3, $zero, 1
6984; MIPS64-NEXT:    ld $1, %got_disp(a)($1)
6985; MIPS64-NEXT:  .LBB17_1: # %entry
6986; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
6987; MIPS64-NEXT:    ll $4, 0($1)
6988; MIPS64-NEXT:    bne $4, $3, .LBB17_3
6989; MIPS64-NEXT:    nop
6990; MIPS64-NEXT:  # %bb.2: # %entry
6991; MIPS64-NEXT:    # in Loop: Header=BB17_1 Depth=1
6992; MIPS64-NEXT:    move $5, $2
6993; MIPS64-NEXT:    sc $5, 0($1)
6994; MIPS64-NEXT:    beqz $5, .LBB17_1
6995; MIPS64-NEXT:    nop
6996; MIPS64-NEXT:  .LBB17_3: # %entry
6997; MIPS64-NEXT:    xor $1, $4, $3
6998; MIPS64-NEXT:    sltiu $2, $1, 1
6999; MIPS64-NEXT:    sync
7000; MIPS64-NEXT:    jr $ra
7001; MIPS64-NEXT:    nop
7002;
7003; MIPS64R2-LABEL: zeroreg:
7004; MIPS64R2:       # %bb.0: # %entry
7005; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7006; MIPS64R2-NEXT:    daddu $1, $1, $25
7007; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7008; MIPS64R2-NEXT:    sync
7009; MIPS64R2-NEXT:    addiu $2, $zero, 0
7010; MIPS64R2-NEXT:    addiu $3, $zero, 1
7011; MIPS64R2-NEXT:    ld $1, %got_disp(a)($1)
7012; MIPS64R2-NEXT:  .LBB17_1: # %entry
7013; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
7014; MIPS64R2-NEXT:    ll $4, 0($1)
7015; MIPS64R2-NEXT:    bne $4, $3, .LBB17_3
7016; MIPS64R2-NEXT:    nop
7017; MIPS64R2-NEXT:  # %bb.2: # %entry
7018; MIPS64R2-NEXT:    # in Loop: Header=BB17_1 Depth=1
7019; MIPS64R2-NEXT:    move $5, $2
7020; MIPS64R2-NEXT:    sc $5, 0($1)
7021; MIPS64R2-NEXT:    beqz $5, .LBB17_1
7022; MIPS64R2-NEXT:    nop
7023; MIPS64R2-NEXT:  .LBB17_3: # %entry
7024; MIPS64R2-NEXT:    xor $1, $4, $3
7025; MIPS64R2-NEXT:    sltiu $2, $1, 1
7026; MIPS64R2-NEXT:    sync
7027; MIPS64R2-NEXT:    jr $ra
7028; MIPS64R2-NEXT:    nop
7029;
7030; MIPS64R6-LABEL: zeroreg:
7031; MIPS64R6:       # %bb.0: # %entry
7032; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7033; MIPS64R6-NEXT:    daddu $1, $1, $25
7034; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7035; MIPS64R6-NEXT:    sync
7036; MIPS64R6-NEXT:    addiu $2, $zero, 0
7037; MIPS64R6-NEXT:    addiu $3, $zero, 1
7038; MIPS64R6-NEXT:    ld $1, %got_disp(a)($1)
7039; MIPS64R6-NEXT:  .LBB17_1: # %entry
7040; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
7041; MIPS64R6-NEXT:    ll $4, 0($1)
7042; MIPS64R6-NEXT:    bnec $4, $3, .LBB17_3
7043; MIPS64R6-NEXT:  # %bb.2: # %entry
7044; MIPS64R6-NEXT:    # in Loop: Header=BB17_1 Depth=1
7045; MIPS64R6-NEXT:    move $5, $2
7046; MIPS64R6-NEXT:    sc $5, 0($1)
7047; MIPS64R6-NEXT:    beqzc $5, .LBB17_1
7048; MIPS64R6-NEXT:  .LBB17_3: # %entry
7049; MIPS64R6-NEXT:    xor $1, $4, $3
7050; MIPS64R6-NEXT:    sltiu $2, $1, 1
7051; MIPS64R6-NEXT:    sync
7052; MIPS64R6-NEXT:    jrc $ra
7053;
7054; MIPS64R6O0-LABEL: zeroreg:
7055; MIPS64R6O0:       # %bb.0: # %entry
7056; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7057; MIPS64R6O0-NEXT:    daddu $1, $1, $25
7058; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7059; MIPS64R6O0-NEXT:    sync
7060; MIPS64R6O0-NEXT:    ld $4, %got_disp(a)($1)
7061; MIPS64R6O0-NEXT:    addiu $6, $zero, 0
7062; MIPS64R6O0-NEXT:    addiu $2, $zero, 1
7063; MIPS64R6O0-NEXT:    move $5, $2
7064; MIPS64R6O0-NEXT:  .LBB17_1: # %entry
7065; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7066; MIPS64R6O0-NEXT:    ll $1, 0($4)
7067; MIPS64R6O0-NEXT:    bnec $1, $5, .LBB17_3
7068; MIPS64R6O0-NEXT:  # %bb.2: # %entry
7069; MIPS64R6O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
7070; MIPS64R6O0-NEXT:    move $3, $6
7071; MIPS64R6O0-NEXT:    sc $3, 0($4)
7072; MIPS64R6O0-NEXT:    beqzc $3, .LBB17_1
7073; MIPS64R6O0-NEXT:  .LBB17_3: # %entry
7074; MIPS64R6O0-NEXT:    xor $1, $1, $2
7075; MIPS64R6O0-NEXT:    sltiu $2, $1, 1
7076; MIPS64R6O0-NEXT:    sync
7077; MIPS64R6O0-NEXT:    jrc $ra
7078;
7079; MM32-LABEL: zeroreg:
7080; MM32:       # %bb.0: # %entry
7081; MM32-NEXT:    lui $2, %hi(_gp_disp)
7082; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7083; MM32-NEXT:    addu $2, $2, $25
7084; MM32-NEXT:    sync
7085; MM32-NEXT:    li16 $3, 0
7086; MM32-NEXT:    li16 $4, 1
7087; MM32-NEXT:    lw $1, %got(a)($2)
7088; MM32-NEXT:  $BB17_1: # %entry
7089; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
7090; MM32-NEXT:    ll $2, 0($1)
7091; MM32-NEXT:    bne $2, $4, $BB17_3
7092; MM32-NEXT:    nop
7093; MM32-NEXT:  # %bb.2: # %entry
7094; MM32-NEXT:    # in Loop: Header=BB17_1 Depth=1
7095; MM32-NEXT:    move $5, $3
7096; MM32-NEXT:    sc $5, 0($1)
7097; MM32-NEXT:    beqzc $5, $BB17_1
7098; MM32-NEXT:  $BB17_3: # %entry
7099; MM32-NEXT:    xor $1, $2, $4
7100; MM32-NEXT:    sltiu $2, $1, 1
7101; MM32-NEXT:    sync
7102; MM32-NEXT:    jrc $ra
7103;
7104; O1-LABEL: zeroreg:
7105; O1:       # %bb.0: # %entry
7106; O1-NEXT:    lui $2, %hi(_gp_disp)
7107; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
7108; O1-NEXT:    addu $1, $2, $25
7109; O1-NEXT:    sync
7110; O1-NEXT:    addiu $2, $zero, 0
7111; O1-NEXT:    addiu $3, $zero, 1
7112; O1-NEXT:    lw $1, %got(a)($1)
7113; O1-NEXT:  $BB17_1: # %entry
7114; O1-NEXT:    # =>This Inner Loop Header: Depth=1
7115; O1-NEXT:    ll $4, 0($1)
7116; O1-NEXT:    bne $4, $3, $BB17_3
7117; O1-NEXT:    nop
7118; O1-NEXT:  # %bb.2: # %entry
7119; O1-NEXT:    # in Loop: Header=BB17_1 Depth=1
7120; O1-NEXT:    move $5, $2
7121; O1-NEXT:    sc $5, 0($1)
7122; O1-NEXT:    beqz $5, $BB17_1
7123; O1-NEXT:    nop
7124; O1-NEXT:  $BB17_3: # %entry
7125; O1-NEXT:    xor $1, $4, $3
7126; O1-NEXT:    sltiu $2, $1, 1
7127; O1-NEXT:    sync
7128; O1-NEXT:    jr $ra
7129; O1-NEXT:    nop
7130;
7131; O2-LABEL: zeroreg:
7132; O2:       # %bb.0: # %entry
7133; O2-NEXT:    lui $2, %hi(_gp_disp)
7134; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7135; O2-NEXT:    addu $1, $2, $25
7136; O2-NEXT:    sync
7137; O2-NEXT:    addiu $2, $zero, 0
7138; O2-NEXT:    addiu $3, $zero, 1
7139; O2-NEXT:    lw $1, %got(a)($1)
7140; O2-NEXT:  $BB17_1: # %entry
7141; O2-NEXT:    # =>This Inner Loop Header: Depth=1
7142; O2-NEXT:    ll $4, 0($1)
7143; O2-NEXT:    bne $4, $3, $BB17_3
7144; O2-NEXT:    nop
7145; O2-NEXT:  # %bb.2: # %entry
7146; O2-NEXT:    # in Loop: Header=BB17_1 Depth=1
7147; O2-NEXT:    move $5, $2
7148; O2-NEXT:    sc $5, 0($1)
7149; O2-NEXT:    beqz $5, $BB17_1
7150; O2-NEXT:    nop
7151; O2-NEXT:  $BB17_3: # %entry
7152; O2-NEXT:    xor $1, $4, $3
7153; O2-NEXT:    sltiu $2, $1, 1
7154; O2-NEXT:    sync
7155; O2-NEXT:    jr $ra
7156; O2-NEXT:    nop
7157;
7158; O3-LABEL: zeroreg:
7159; O3:       # %bb.0: # %entry
7160; O3-NEXT:    lui $2, %hi(_gp_disp)
7161; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
7162; O3-NEXT:    addu $1, $2, $25
7163; O3-NEXT:    addiu $2, $zero, 0
7164; O3-NEXT:    addiu $3, $zero, 1
7165; O3-NEXT:    sync
7166; O3-NEXT:    lw $1, %got(a)($1)
7167; O3-NEXT:  $BB17_1: # %entry
7168; O3-NEXT:    # =>This Inner Loop Header: Depth=1
7169; O3-NEXT:    ll $4, 0($1)
7170; O3-NEXT:    bne $4, $3, $BB17_3
7171; O3-NEXT:    nop
7172; O3-NEXT:  # %bb.2: # %entry
7173; O3-NEXT:    # in Loop: Header=BB17_1 Depth=1
7174; O3-NEXT:    move $5, $2
7175; O3-NEXT:    sc $5, 0($1)
7176; O3-NEXT:    beqz $5, $BB17_1
7177; O3-NEXT:    nop
7178; O3-NEXT:  $BB17_3: # %entry
7179; O3-NEXT:    sync
7180; O3-NEXT:    xor $1, $4, $3
7181; O3-NEXT:    jr $ra
7182; O3-NEXT:    sltiu $2, $1, 1
7183;
7184; MIPS32EB-LABEL: zeroreg:
7185; MIPS32EB:       # %bb.0: # %entry
7186; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
7187; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
7188; MIPS32EB-NEXT:    addu $1, $2, $25
7189; MIPS32EB-NEXT:    sync
7190; MIPS32EB-NEXT:    addiu $2, $zero, 0
7191; MIPS32EB-NEXT:    addiu $3, $zero, 1
7192; MIPS32EB-NEXT:    lw $1, %got(a)($1)
7193; MIPS32EB-NEXT:  $BB17_1: # %entry
7194; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
7195; MIPS32EB-NEXT:    ll $4, 0($1)
7196; MIPS32EB-NEXT:    bne $4, $3, $BB17_3
7197; MIPS32EB-NEXT:    nop
7198; MIPS32EB-NEXT:  # %bb.2: # %entry
7199; MIPS32EB-NEXT:    # in Loop: Header=BB17_1 Depth=1
7200; MIPS32EB-NEXT:    move $5, $2
7201; MIPS32EB-NEXT:    sc $5, 0($1)
7202; MIPS32EB-NEXT:    beqz $5, $BB17_1
7203; MIPS32EB-NEXT:    nop
7204; MIPS32EB-NEXT:  $BB17_3: # %entry
7205; MIPS32EB-NEXT:    xor $1, $4, $3
7206; MIPS32EB-NEXT:    sltiu $2, $1, 1
7207; MIPS32EB-NEXT:    sync
7208; MIPS32EB-NEXT:    jr $ra
7209; MIPS32EB-NEXT:    nop
7210entry:
7211  %pair0 = cmpxchg ptr @a, i32 1, i32 0 seq_cst seq_cst
7212  %0 = extractvalue { i32, i1 } %pair0, 0
7213  %1 = icmp eq i32 %0, 1
7214  %conv = zext i1 %1 to i32
7215  ret i32 %conv
7216}
7217
7218; Check that MIPS32R6 has the correct offset range.
7219; FIXME: At the moment, we don't seem to do addr+offset for any atomic load/store.
7220define i32 @AtomicLoadAdd32_OffGt9Bit(i32 signext %incr) nounwind {
7221; MIPS32-LABEL: AtomicLoadAdd32_OffGt9Bit:
7222; MIPS32:       # %bb.0: # %entry
7223; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
7224; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7225; MIPS32-NEXT:    addu $1, $2, $25
7226; MIPS32-NEXT:    lw $1, %got(x)($1)
7227; MIPS32-NEXT:    addiu $1, $1, 1024
7228; MIPS32-NEXT:  $BB18_1: # %entry
7229; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
7230; MIPS32-NEXT:    ll $2, 0($1)
7231; MIPS32-NEXT:    addu $3, $2, $4
7232; MIPS32-NEXT:    sc $3, 0($1)
7233; MIPS32-NEXT:    beqz $3, $BB18_1
7234; MIPS32-NEXT:    nop
7235; MIPS32-NEXT:  # %bb.2: # %entry
7236; MIPS32-NEXT:    jr $ra
7237; MIPS32-NEXT:    nop
7238;
7239; MIPS32O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7240; MIPS32O0:       # %bb.0: # %entry
7241; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
7242; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7243; MIPS32O0-NEXT:    addu $1, $2, $25
7244; MIPS32O0-NEXT:    lw $1, %got(x)($1)
7245; MIPS32O0-NEXT:    addiu $3, $1, 1024
7246; MIPS32O0-NEXT:  $BB18_1: # %entry
7247; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
7248; MIPS32O0-NEXT:    ll $2, 0($3)
7249; MIPS32O0-NEXT:    addu $1, $2, $4
7250; MIPS32O0-NEXT:    sc $1, 0($3)
7251; MIPS32O0-NEXT:    beqz $1, $BB18_1
7252; MIPS32O0-NEXT:    nop
7253; MIPS32O0-NEXT:  # %bb.2: # %entry
7254; MIPS32O0-NEXT:    jr $ra
7255; MIPS32O0-NEXT:    nop
7256;
7257; MIPS32R2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7258; MIPS32R2:       # %bb.0: # %entry
7259; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
7260; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7261; MIPS32R2-NEXT:    addu $1, $2, $25
7262; MIPS32R2-NEXT:    lw $1, %got(x)($1)
7263; MIPS32R2-NEXT:    addiu $1, $1, 1024
7264; MIPS32R2-NEXT:  $BB18_1: # %entry
7265; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
7266; MIPS32R2-NEXT:    ll $2, 0($1)
7267; MIPS32R2-NEXT:    addu $3, $2, $4
7268; MIPS32R2-NEXT:    sc $3, 0($1)
7269; MIPS32R2-NEXT:    beqz $3, $BB18_1
7270; MIPS32R2-NEXT:    nop
7271; MIPS32R2-NEXT:  # %bb.2: # %entry
7272; MIPS32R2-NEXT:    jr $ra
7273; MIPS32R2-NEXT:    nop
7274;
7275; MIPS32R6-LABEL: AtomicLoadAdd32_OffGt9Bit:
7276; MIPS32R6:       # %bb.0: # %entry
7277; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
7278; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
7279; MIPS32R6-NEXT:    addu $1, $2, $25
7280; MIPS32R6-NEXT:    lw $1, %got(x)($1)
7281; MIPS32R6-NEXT:    addiu $1, $1, 1024
7282; MIPS32R6-NEXT:  $BB18_1: # %entry
7283; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
7284; MIPS32R6-NEXT:    ll $2, 0($1)
7285; MIPS32R6-NEXT:    addu $3, $2, $4
7286; MIPS32R6-NEXT:    sc $3, 0($1)
7287; MIPS32R6-NEXT:    beqzc $3, $BB18_1
7288; MIPS32R6-NEXT:    nop
7289; MIPS32R6-NEXT:  # %bb.2: # %entry
7290; MIPS32R6-NEXT:    jrc $ra
7291;
7292; MIPS32R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7293; MIPS32R6O0:       # %bb.0: # %entry
7294; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
7295; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7296; MIPS32R6O0-NEXT:    addu $1, $2, $25
7297; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
7298; MIPS32R6O0-NEXT:    addiu $3, $1, 1024
7299; MIPS32R6O0-NEXT:  $BB18_1: # %entry
7300; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7301; MIPS32R6O0-NEXT:    ll $2, 0($3)
7302; MIPS32R6O0-NEXT:    addu $1, $2, $4
7303; MIPS32R6O0-NEXT:    sc $1, 0($3)
7304; MIPS32R6O0-NEXT:    beqzc $1, $BB18_1
7305; MIPS32R6O0-NEXT:    nop
7306; MIPS32R6O0-NEXT:  # %bb.2: # %entry
7307; MIPS32R6O0-NEXT:    jrc $ra
7308;
7309; MIPS4-LABEL: AtomicLoadAdd32_OffGt9Bit:
7310; MIPS4:       # %bb.0: # %entry
7311; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7312; MIPS4-NEXT:    daddu $1, $1, $25
7313; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7314; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
7315; MIPS4-NEXT:    daddiu $1, $1, 1024
7316; MIPS4-NEXT:  .LBB18_1: # %entry
7317; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
7318; MIPS4-NEXT:    ll $2, 0($1)
7319; MIPS4-NEXT:    addu $3, $2, $4
7320; MIPS4-NEXT:    sc $3, 0($1)
7321; MIPS4-NEXT:    beqz $3, .LBB18_1
7322; MIPS4-NEXT:    nop
7323; MIPS4-NEXT:  # %bb.2: # %entry
7324; MIPS4-NEXT:    jr $ra
7325; MIPS4-NEXT:    nop
7326;
7327; MIPS64-LABEL: AtomicLoadAdd32_OffGt9Bit:
7328; MIPS64:       # %bb.0: # %entry
7329; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7330; MIPS64-NEXT:    daddu $1, $1, $25
7331; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7332; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
7333; MIPS64-NEXT:    daddiu $1, $1, 1024
7334; MIPS64-NEXT:  .LBB18_1: # %entry
7335; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
7336; MIPS64-NEXT:    ll $2, 0($1)
7337; MIPS64-NEXT:    addu $3, $2, $4
7338; MIPS64-NEXT:    sc $3, 0($1)
7339; MIPS64-NEXT:    beqz $3, .LBB18_1
7340; MIPS64-NEXT:    nop
7341; MIPS64-NEXT:  # %bb.2: # %entry
7342; MIPS64-NEXT:    jr $ra
7343; MIPS64-NEXT:    nop
7344;
7345; MIPS64R2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7346; MIPS64R2:       # %bb.0: # %entry
7347; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7348; MIPS64R2-NEXT:    daddu $1, $1, $25
7349; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7350; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
7351; MIPS64R2-NEXT:    daddiu $1, $1, 1024
7352; MIPS64R2-NEXT:  .LBB18_1: # %entry
7353; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
7354; MIPS64R2-NEXT:    ll $2, 0($1)
7355; MIPS64R2-NEXT:    addu $3, $2, $4
7356; MIPS64R2-NEXT:    sc $3, 0($1)
7357; MIPS64R2-NEXT:    beqz $3, .LBB18_1
7358; MIPS64R2-NEXT:    nop
7359; MIPS64R2-NEXT:  # %bb.2: # %entry
7360; MIPS64R2-NEXT:    jr $ra
7361; MIPS64R2-NEXT:    nop
7362;
7363; MIPS64R6-LABEL: AtomicLoadAdd32_OffGt9Bit:
7364; MIPS64R6:       # %bb.0: # %entry
7365; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7366; MIPS64R6-NEXT:    daddu $1, $1, $25
7367; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7368; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
7369; MIPS64R6-NEXT:    daddiu $1, $1, 1024
7370; MIPS64R6-NEXT:  .LBB18_1: # %entry
7371; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
7372; MIPS64R6-NEXT:    ll $2, 0($1)
7373; MIPS64R6-NEXT:    addu $3, $2, $4
7374; MIPS64R6-NEXT:    sc $3, 0($1)
7375; MIPS64R6-NEXT:    beqzc $3, .LBB18_1
7376; MIPS64R6-NEXT:    nop
7377; MIPS64R6-NEXT:  # %bb.2: # %entry
7378; MIPS64R6-NEXT:    jrc $ra
7379;
7380; MIPS64R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7381; MIPS64R6O0:       # %bb.0: # %entry
7382; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7383; MIPS64R6O0-NEXT:    daddu $1, $1, $25
7384; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7385; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
7386; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
7387; MIPS64R6O0-NEXT:    daddiu $3, $1, 1024
7388; MIPS64R6O0-NEXT:  .LBB18_1: # %entry
7389; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7390; MIPS64R6O0-NEXT:    ll $2, 0($3)
7391; MIPS64R6O0-NEXT:    addu $1, $2, $4
7392; MIPS64R6O0-NEXT:    sc $1, 0($3)
7393; MIPS64R6O0-NEXT:    beqzc $1, .LBB18_1
7394; MIPS64R6O0-NEXT:    nop
7395; MIPS64R6O0-NEXT:  # %bb.2: # %entry
7396; MIPS64R6O0-NEXT:    jrc $ra
7397;
7398; MM32-LABEL: AtomicLoadAdd32_OffGt9Bit:
7399; MM32:       # %bb.0: # %entry
7400; MM32-NEXT:    lui $2, %hi(_gp_disp)
7401; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7402; MM32-NEXT:    addu $2, $2, $25
7403; MM32-NEXT:    lw $1, %got(x)($2)
7404; MM32-NEXT:    addiu $1, $1, 1024
7405; MM32-NEXT:  $BB18_1: # %entry
7406; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
7407; MM32-NEXT:    ll $2, 0($1)
7408; MM32-NEXT:    addu16 $3, $2, $4
7409; MM32-NEXT:    sc $3, 0($1)
7410; MM32-NEXT:    beqzc $3, $BB18_1
7411; MM32-NEXT:  # %bb.2: # %entry
7412; MM32-NEXT:    jrc $ra
7413;
7414; O1-LABEL: AtomicLoadAdd32_OffGt9Bit:
7415; O1:       # %bb.0: # %entry
7416; O1-NEXT:    lui $2, %hi(_gp_disp)
7417; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
7418; O1-NEXT:    addu $1, $2, $25
7419; O1-NEXT:    lw $1, %got(x)($1)
7420; O1-NEXT:    addiu $1, $1, 1024
7421; O1-NEXT:  $BB18_1: # %entry
7422; O1-NEXT:    # =>This Inner Loop Header: Depth=1
7423; O1-NEXT:    ll $2, 0($1)
7424; O1-NEXT:    addu $3, $2, $4
7425; O1-NEXT:    sc $3, 0($1)
7426; O1-NEXT:    beqz $3, $BB18_1
7427; O1-NEXT:    nop
7428; O1-NEXT:  # %bb.2: # %entry
7429; O1-NEXT:    jr $ra
7430; O1-NEXT:    nop
7431;
7432; O2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7433; O2:       # %bb.0: # %entry
7434; O2-NEXT:    lui $2, %hi(_gp_disp)
7435; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7436; O2-NEXT:    addu $1, $2, $25
7437; O2-NEXT:    lw $1, %got(x)($1)
7438; O2-NEXT:    addiu $1, $1, 1024
7439; O2-NEXT:  $BB18_1: # %entry
7440; O2-NEXT:    # =>This Inner Loop Header: Depth=1
7441; O2-NEXT:    ll $2, 0($1)
7442; O2-NEXT:    addu $3, $2, $4
7443; O2-NEXT:    sc $3, 0($1)
7444; O2-NEXT:    beqz $3, $BB18_1
7445; O2-NEXT:    nop
7446; O2-NEXT:  # %bb.2: # %entry
7447; O2-NEXT:    jr $ra
7448; O2-NEXT:    nop
7449;
7450; O3-LABEL: AtomicLoadAdd32_OffGt9Bit:
7451; O3:       # %bb.0: # %entry
7452; O3-NEXT:    lui $2, %hi(_gp_disp)
7453; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
7454; O3-NEXT:    addu $1, $2, $25
7455; O3-NEXT:    lw $1, %got(x)($1)
7456; O3-NEXT:    addiu $1, $1, 1024
7457; O3-NEXT:  $BB18_1: # %entry
7458; O3-NEXT:    # =>This Inner Loop Header: Depth=1
7459; O3-NEXT:    ll $2, 0($1)
7460; O3-NEXT:    addu $3, $2, $4
7461; O3-NEXT:    sc $3, 0($1)
7462; O3-NEXT:    beqz $3, $BB18_1
7463; O3-NEXT:    nop
7464; O3-NEXT:  # %bb.2: # %entry
7465; O3-NEXT:    jr $ra
7466; O3-NEXT:    nop
7467;
7468; MIPS32EB-LABEL: AtomicLoadAdd32_OffGt9Bit:
7469; MIPS32EB:       # %bb.0: # %entry
7470; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
7471; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
7472; MIPS32EB-NEXT:    addu $1, $2, $25
7473; MIPS32EB-NEXT:    lw $1, %got(x)($1)
7474; MIPS32EB-NEXT:    addiu $1, $1, 1024
7475; MIPS32EB-NEXT:  $BB18_1: # %entry
7476; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
7477; MIPS32EB-NEXT:    ll $2, 0($1)
7478; MIPS32EB-NEXT:    addu $3, $2, $4
7479; MIPS32EB-NEXT:    sc $3, 0($1)
7480; MIPS32EB-NEXT:    beqz $3, $BB18_1
7481; MIPS32EB-NEXT:    nop
7482; MIPS32EB-NEXT:  # %bb.2: # %entry
7483; MIPS32EB-NEXT:    jr $ra
7484; MIPS32EB-NEXT:    nop
7485entry:
7486  %0 = atomicrmw add ptr getelementptr(i32, ptr @x, i32 256), i32 %incr monotonic
7487  ret i32 %0
7488
7489}
7490