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 $1, %got(x)($1)
61; MIPS32O0-NEXT:  $BB0_1: # %entry
62; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
63; MIPS32O0-NEXT:    ll $2, 0($1)
64; MIPS32O0-NEXT:    addu $3, $2, $4
65; MIPS32O0-NEXT:    sc $3, 0($1)
66; MIPS32O0-NEXT:    beqz $3, $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:    addiu $sp, $sp, -8
110; MIPS32R6O0-NEXT:    addu $1, $2, $25
111; MIPS32R6O0-NEXT:    move $2, $4
112; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
113; MIPS32R6O0-NEXT:  $BB0_1: # %entry
114; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
115; MIPS32R6O0-NEXT:    ll $3, 0($1)
116; MIPS32R6O0-NEXT:    addu $5, $3, $4
117; MIPS32R6O0-NEXT:    sc $5, 0($1)
118; MIPS32R6O0-NEXT:    beqzc $5, $BB0_1
119; MIPS32R6O0-NEXT:  # %bb.2: # %entry
120; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
121; MIPS32R6O0-NEXT:    move $2, $3
122; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
123; MIPS32R6O0-NEXT:    jrc $ra
124;
125; MIPS4-LABEL: AtomicLoadAdd32:
126; MIPS4:       # %bb.0: # %entry
127; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
128; MIPS4-NEXT:    daddu $1, $1, $25
129; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
130; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
131; MIPS4-NEXT:  .LBB0_1: # %entry
132; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
133; MIPS4-NEXT:    ll $2, 0($1)
134; MIPS4-NEXT:    addu $3, $2, $4
135; MIPS4-NEXT:    sc $3, 0($1)
136; MIPS4-NEXT:    beqz $3, .LBB0_1
137; MIPS4-NEXT:    nop
138; MIPS4-NEXT:  # %bb.2: # %entry
139; MIPS4-NEXT:    jr $ra
140; MIPS4-NEXT:    nop
141;
142; MIPS64-LABEL: AtomicLoadAdd32:
143; MIPS64:       # %bb.0: # %entry
144; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
145; MIPS64-NEXT:    daddu $1, $1, $25
146; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
147; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
148; MIPS64-NEXT:  .LBB0_1: # %entry
149; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
150; MIPS64-NEXT:    ll $2, 0($1)
151; MIPS64-NEXT:    addu $3, $2, $4
152; MIPS64-NEXT:    sc $3, 0($1)
153; MIPS64-NEXT:    beqz $3, .LBB0_1
154; MIPS64-NEXT:    nop
155; MIPS64-NEXT:  # %bb.2: # %entry
156; MIPS64-NEXT:    jr $ra
157; MIPS64-NEXT:    nop
158;
159; MIPS64R2-LABEL: AtomicLoadAdd32:
160; MIPS64R2:       # %bb.0: # %entry
161; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
162; MIPS64R2-NEXT:    daddu $1, $1, $25
163; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
164; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
165; MIPS64R2-NEXT:  .LBB0_1: # %entry
166; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
167; MIPS64R2-NEXT:    ll $2, 0($1)
168; MIPS64R2-NEXT:    addu $3, $2, $4
169; MIPS64R2-NEXT:    sc $3, 0($1)
170; MIPS64R2-NEXT:    beqz $3, .LBB0_1
171; MIPS64R2-NEXT:    nop
172; MIPS64R2-NEXT:  # %bb.2: # %entry
173; MIPS64R2-NEXT:    jr $ra
174; MIPS64R2-NEXT:    nop
175;
176; MIPS64R6-LABEL: AtomicLoadAdd32:
177; MIPS64R6:       # %bb.0: # %entry
178; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
179; MIPS64R6-NEXT:    daddu $1, $1, $25
180; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
181; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
182; MIPS64R6-NEXT:  .LBB0_1: # %entry
183; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
184; MIPS64R6-NEXT:    ll $2, 0($1)
185; MIPS64R6-NEXT:    addu $3, $2, $4
186; MIPS64R6-NEXT:    sc $3, 0($1)
187; MIPS64R6-NEXT:    beqzc $3, .LBB0_1
188; MIPS64R6-NEXT:    nop
189; MIPS64R6-NEXT:  # %bb.2: # %entry
190; MIPS64R6-NEXT:    jrc $ra
191;
192; MIPS64R6O0-LABEL: AtomicLoadAdd32:
193; MIPS64R6O0:       # %bb.0: # %entry
194; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
195; MIPS64R6O0-NEXT:    daddu $1, $1, $25
196; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
197; MIPS64R6O0-NEXT:    move $2, $4
198; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
199; MIPS64R6O0-NEXT:  .LBB0_1: # %entry
200; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
201; MIPS64R6O0-NEXT:    ll $3, 0($1)
202; MIPS64R6O0-NEXT:    addu $5, $3, $2
203; MIPS64R6O0-NEXT:    sc $5, 0($1)
204; MIPS64R6O0-NEXT:    beqzc $5, .LBB0_1
205; MIPS64R6O0-NEXT:  # %bb.2: # %entry
206; MIPS64R6O0-NEXT:    move $2, $3
207; MIPS64R6O0-NEXT:    jrc $ra
208;
209; MM32-LABEL: AtomicLoadAdd32:
210; MM32:       # %bb.0: # %entry
211; MM32-NEXT:    lui $2, %hi(_gp_disp)
212; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
213; MM32-NEXT:    addu $2, $2, $25
214; MM32-NEXT:    lw $1, %got(x)($2)
215; MM32-NEXT:  $BB0_1: # %entry
216; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
217; MM32-NEXT:    ll $2, 0($1)
218; MM32-NEXT:    addu16 $3, $2, $4
219; MM32-NEXT:    sc $3, 0($1)
220; MM32-NEXT:    beqzc $3, $BB0_1
221; MM32-NEXT:  # %bb.2: # %entry
222; MM32-NEXT:    jrc $ra
223;
224; O1-LABEL: AtomicLoadAdd32:
225; O1:       # %bb.0: # %entry
226; O1-NEXT:    lui $2, %hi(_gp_disp)
227; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
228; O1-NEXT:    addu $1, $2, $25
229; O1-NEXT:    lw $1, %got(x)($1)
230; O1-NEXT:  $BB0_1: # %entry
231; O1-NEXT:    # =>This Inner Loop Header: Depth=1
232; O1-NEXT:    ll $2, 0($1)
233; O1-NEXT:    addu $3, $2, $4
234; O1-NEXT:    sc $3, 0($1)
235; O1-NEXT:    beqz $3, $BB0_1
236; O1-NEXT:    nop
237; O1-NEXT:  # %bb.2: # %entry
238; O1-NEXT:    jr $ra
239; O1-NEXT:    nop
240;
241; O2-LABEL: AtomicLoadAdd32:
242; O2:       # %bb.0: # %entry
243; O2-NEXT:    lui $2, %hi(_gp_disp)
244; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
245; O2-NEXT:    addu $1, $2, $25
246; O2-NEXT:    lw $1, %got(x)($1)
247; O2-NEXT:  $BB0_1: # %entry
248; O2-NEXT:    # =>This Inner Loop Header: Depth=1
249; O2-NEXT:    ll $2, 0($1)
250; O2-NEXT:    addu $3, $2, $4
251; O2-NEXT:    sc $3, 0($1)
252; O2-NEXT:    beqz $3, $BB0_1
253; O2-NEXT:    nop
254; O2-NEXT:  # %bb.2: # %entry
255; O2-NEXT:    jr $ra
256; O2-NEXT:    nop
257;
258; O3-LABEL: AtomicLoadAdd32:
259; O3:       # %bb.0: # %entry
260; O3-NEXT:    lui $2, %hi(_gp_disp)
261; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
262; O3-NEXT:    addu $1, $2, $25
263; O3-NEXT:    lw $1, %got(x)($1)
264; O3-NEXT:  $BB0_1: # %entry
265; O3-NEXT:    # =>This Inner Loop Header: Depth=1
266; O3-NEXT:    ll $2, 0($1)
267; O3-NEXT:    addu $3, $2, $4
268; O3-NEXT:    sc $3, 0($1)
269; O3-NEXT:    beqz $3, $BB0_1
270; O3-NEXT:    nop
271; O3-NEXT:  # %bb.2: # %entry
272; O3-NEXT:    jr $ra
273; O3-NEXT:    nop
274;
275; MIPS32EB-LABEL: AtomicLoadAdd32:
276; MIPS32EB:       # %bb.0: # %entry
277; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
278; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
279; MIPS32EB-NEXT:    addu $1, $2, $25
280; MIPS32EB-NEXT:    lw $1, %got(x)($1)
281; MIPS32EB-NEXT:  $BB0_1: # %entry
282; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
283; MIPS32EB-NEXT:    ll $2, 0($1)
284; MIPS32EB-NEXT:    addu $3, $2, $4
285; MIPS32EB-NEXT:    sc $3, 0($1)
286; MIPS32EB-NEXT:    beqz $3, $BB0_1
287; MIPS32EB-NEXT:    nop
288; MIPS32EB-NEXT:  # %bb.2: # %entry
289; MIPS32EB-NEXT:    jr $ra
290; MIPS32EB-NEXT:    nop
291entry:
292  %0 = atomicrmw add i32* @x, i32 %incr monotonic
293  ret i32 %0
294
295}
296
297define i32 @AtomicLoadSub32(i32 signext %incr) nounwind {
298; MIPS32-LABEL: AtomicLoadSub32:
299; MIPS32:       # %bb.0: # %entry
300; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
301; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
302; MIPS32-NEXT:    addu $1, $2, $25
303; MIPS32-NEXT:    lw $1, %got(x)($1)
304; MIPS32-NEXT:  $BB1_1: # %entry
305; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
306; MIPS32-NEXT:    ll $2, 0($1)
307; MIPS32-NEXT:    subu $3, $2, $4
308; MIPS32-NEXT:    sc $3, 0($1)
309; MIPS32-NEXT:    beqz $3, $BB1_1
310; MIPS32-NEXT:    nop
311; MIPS32-NEXT:  # %bb.2: # %entry
312; MIPS32-NEXT:    jr $ra
313; MIPS32-NEXT:    nop
314;
315; MIPS32O0-LABEL: AtomicLoadSub32:
316; MIPS32O0:       # %bb.0: # %entry
317; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
318; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
319; MIPS32O0-NEXT:    addu $1, $2, $25
320; MIPS32O0-NEXT:    lw $1, %got(x)($1)
321; MIPS32O0-NEXT:  $BB1_1: # %entry
322; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
323; MIPS32O0-NEXT:    ll $2, 0($1)
324; MIPS32O0-NEXT:    subu $3, $2, $4
325; MIPS32O0-NEXT:    sc $3, 0($1)
326; MIPS32O0-NEXT:    beqz $3, $BB1_1
327; MIPS32O0-NEXT:    nop
328; MIPS32O0-NEXT:  # %bb.2: # %entry
329; MIPS32O0-NEXT:    jr $ra
330; MIPS32O0-NEXT:    nop
331;
332; MIPS32R2-LABEL: AtomicLoadSub32:
333; MIPS32R2:       # %bb.0: # %entry
334; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
335; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
336; MIPS32R2-NEXT:    addu $1, $2, $25
337; MIPS32R2-NEXT:    lw $1, %got(x)($1)
338; MIPS32R2-NEXT:  $BB1_1: # %entry
339; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
340; MIPS32R2-NEXT:    ll $2, 0($1)
341; MIPS32R2-NEXT:    subu $3, $2, $4
342; MIPS32R2-NEXT:    sc $3, 0($1)
343; MIPS32R2-NEXT:    beqz $3, $BB1_1
344; MIPS32R2-NEXT:    nop
345; MIPS32R2-NEXT:  # %bb.2: # %entry
346; MIPS32R2-NEXT:    jr $ra
347; MIPS32R2-NEXT:    nop
348;
349; MIPS32R6-LABEL: AtomicLoadSub32:
350; MIPS32R6:       # %bb.0: # %entry
351; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
352; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
353; MIPS32R6-NEXT:    addu $1, $2, $25
354; MIPS32R6-NEXT:    lw $1, %got(x)($1)
355; MIPS32R6-NEXT:  $BB1_1: # %entry
356; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
357; MIPS32R6-NEXT:    ll $2, 0($1)
358; MIPS32R6-NEXT:    subu $3, $2, $4
359; MIPS32R6-NEXT:    sc $3, 0($1)
360; MIPS32R6-NEXT:    beqzc $3, $BB1_1
361; MIPS32R6-NEXT:    nop
362; MIPS32R6-NEXT:  # %bb.2: # %entry
363; MIPS32R6-NEXT:    jrc $ra
364;
365; MIPS32R6O0-LABEL: AtomicLoadSub32:
366; MIPS32R6O0:       # %bb.0: # %entry
367; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
368; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
369; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
370; MIPS32R6O0-NEXT:    addu $1, $2, $25
371; MIPS32R6O0-NEXT:    move $2, $4
372; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
373; MIPS32R6O0-NEXT:  $BB1_1: # %entry
374; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
375; MIPS32R6O0-NEXT:    ll $3, 0($1)
376; MIPS32R6O0-NEXT:    subu $5, $3, $4
377; MIPS32R6O0-NEXT:    sc $5, 0($1)
378; MIPS32R6O0-NEXT:    beqzc $5, $BB1_1
379; MIPS32R6O0-NEXT:  # %bb.2: # %entry
380; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
381; MIPS32R6O0-NEXT:    move $2, $3
382; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
383; MIPS32R6O0-NEXT:    jrc $ra
384;
385; MIPS4-LABEL: AtomicLoadSub32:
386; MIPS4:       # %bb.0: # %entry
387; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
388; MIPS4-NEXT:    daddu $1, $1, $25
389; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
390; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
391; MIPS4-NEXT:  .LBB1_1: # %entry
392; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
393; MIPS4-NEXT:    ll $2, 0($1)
394; MIPS4-NEXT:    subu $3, $2, $4
395; MIPS4-NEXT:    sc $3, 0($1)
396; MIPS4-NEXT:    beqz $3, .LBB1_1
397; MIPS4-NEXT:    nop
398; MIPS4-NEXT:  # %bb.2: # %entry
399; MIPS4-NEXT:    jr $ra
400; MIPS4-NEXT:    nop
401;
402; MIPS64-LABEL: AtomicLoadSub32:
403; MIPS64:       # %bb.0: # %entry
404; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
405; MIPS64-NEXT:    daddu $1, $1, $25
406; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
407; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
408; MIPS64-NEXT:  .LBB1_1: # %entry
409; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
410; MIPS64-NEXT:    ll $2, 0($1)
411; MIPS64-NEXT:    subu $3, $2, $4
412; MIPS64-NEXT:    sc $3, 0($1)
413; MIPS64-NEXT:    beqz $3, .LBB1_1
414; MIPS64-NEXT:    nop
415; MIPS64-NEXT:  # %bb.2: # %entry
416; MIPS64-NEXT:    jr $ra
417; MIPS64-NEXT:    nop
418;
419; MIPS64R2-LABEL: AtomicLoadSub32:
420; MIPS64R2:       # %bb.0: # %entry
421; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
422; MIPS64R2-NEXT:    daddu $1, $1, $25
423; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
424; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
425; MIPS64R2-NEXT:  .LBB1_1: # %entry
426; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
427; MIPS64R2-NEXT:    ll $2, 0($1)
428; MIPS64R2-NEXT:    subu $3, $2, $4
429; MIPS64R2-NEXT:    sc $3, 0($1)
430; MIPS64R2-NEXT:    beqz $3, .LBB1_1
431; MIPS64R2-NEXT:    nop
432; MIPS64R2-NEXT:  # %bb.2: # %entry
433; MIPS64R2-NEXT:    jr $ra
434; MIPS64R2-NEXT:    nop
435;
436; MIPS64R6-LABEL: AtomicLoadSub32:
437; MIPS64R6:       # %bb.0: # %entry
438; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
439; MIPS64R6-NEXT:    daddu $1, $1, $25
440; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
441; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
442; MIPS64R6-NEXT:  .LBB1_1: # %entry
443; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
444; MIPS64R6-NEXT:    ll $2, 0($1)
445; MIPS64R6-NEXT:    subu $3, $2, $4
446; MIPS64R6-NEXT:    sc $3, 0($1)
447; MIPS64R6-NEXT:    beqzc $3, .LBB1_1
448; MIPS64R6-NEXT:    nop
449; MIPS64R6-NEXT:  # %bb.2: # %entry
450; MIPS64R6-NEXT:    jrc $ra
451;
452; MIPS64R6O0-LABEL: AtomicLoadSub32:
453; MIPS64R6O0:       # %bb.0: # %entry
454; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
455; MIPS64R6O0-NEXT:    daddu $1, $1, $25
456; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
457; MIPS64R6O0-NEXT:    move $2, $4
458; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
459; MIPS64R6O0-NEXT:  .LBB1_1: # %entry
460; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
461; MIPS64R6O0-NEXT:    ll $3, 0($1)
462; MIPS64R6O0-NEXT:    subu $5, $3, $2
463; MIPS64R6O0-NEXT:    sc $5, 0($1)
464; MIPS64R6O0-NEXT:    beqzc $5, .LBB1_1
465; MIPS64R6O0-NEXT:  # %bb.2: # %entry
466; MIPS64R6O0-NEXT:    move $2, $3
467; MIPS64R6O0-NEXT:    jrc $ra
468;
469; MM32-LABEL: AtomicLoadSub32:
470; MM32:       # %bb.0: # %entry
471; MM32-NEXT:    lui $2, %hi(_gp_disp)
472; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
473; MM32-NEXT:    addu $2, $2, $25
474; MM32-NEXT:    lw $1, %got(x)($2)
475; MM32-NEXT:  $BB1_1: # %entry
476; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
477; MM32-NEXT:    ll $2, 0($1)
478; MM32-NEXT:    subu16 $3, $2, $4
479; MM32-NEXT:    sc $3, 0($1)
480; MM32-NEXT:    beqzc $3, $BB1_1
481; MM32-NEXT:  # %bb.2: # %entry
482; MM32-NEXT:    jrc $ra
483;
484; O1-LABEL: AtomicLoadSub32:
485; O1:       # %bb.0: # %entry
486; O1-NEXT:    lui $2, %hi(_gp_disp)
487; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
488; O1-NEXT:    addu $1, $2, $25
489; O1-NEXT:    lw $1, %got(x)($1)
490; O1-NEXT:  $BB1_1: # %entry
491; O1-NEXT:    # =>This Inner Loop Header: Depth=1
492; O1-NEXT:    ll $2, 0($1)
493; O1-NEXT:    subu $3, $2, $4
494; O1-NEXT:    sc $3, 0($1)
495; O1-NEXT:    beqz $3, $BB1_1
496; O1-NEXT:    nop
497; O1-NEXT:  # %bb.2: # %entry
498; O1-NEXT:    jr $ra
499; O1-NEXT:    nop
500;
501; O2-LABEL: AtomicLoadSub32:
502; O2:       # %bb.0: # %entry
503; O2-NEXT:    lui $2, %hi(_gp_disp)
504; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
505; O2-NEXT:    addu $1, $2, $25
506; O2-NEXT:    lw $1, %got(x)($1)
507; O2-NEXT:  $BB1_1: # %entry
508; O2-NEXT:    # =>This Inner Loop Header: Depth=1
509; O2-NEXT:    ll $2, 0($1)
510; O2-NEXT:    subu $3, $2, $4
511; O2-NEXT:    sc $3, 0($1)
512; O2-NEXT:    beqz $3, $BB1_1
513; O2-NEXT:    nop
514; O2-NEXT:  # %bb.2: # %entry
515; O2-NEXT:    jr $ra
516; O2-NEXT:    nop
517;
518; O3-LABEL: AtomicLoadSub32:
519; O3:       # %bb.0: # %entry
520; O3-NEXT:    lui $2, %hi(_gp_disp)
521; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
522; O3-NEXT:    addu $1, $2, $25
523; O3-NEXT:    lw $1, %got(x)($1)
524; O3-NEXT:  $BB1_1: # %entry
525; O3-NEXT:    # =>This Inner Loop Header: Depth=1
526; O3-NEXT:    ll $2, 0($1)
527; O3-NEXT:    subu $3, $2, $4
528; O3-NEXT:    sc $3, 0($1)
529; O3-NEXT:    beqz $3, $BB1_1
530; O3-NEXT:    nop
531; O3-NEXT:  # %bb.2: # %entry
532; O3-NEXT:    jr $ra
533; O3-NEXT:    nop
534;
535; MIPS32EB-LABEL: AtomicLoadSub32:
536; MIPS32EB:       # %bb.0: # %entry
537; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
538; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
539; MIPS32EB-NEXT:    addu $1, $2, $25
540; MIPS32EB-NEXT:    lw $1, %got(x)($1)
541; MIPS32EB-NEXT:  $BB1_1: # %entry
542; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
543; MIPS32EB-NEXT:    ll $2, 0($1)
544; MIPS32EB-NEXT:    subu $3, $2, $4
545; MIPS32EB-NEXT:    sc $3, 0($1)
546; MIPS32EB-NEXT:    beqz $3, $BB1_1
547; MIPS32EB-NEXT:    nop
548; MIPS32EB-NEXT:  # %bb.2: # %entry
549; MIPS32EB-NEXT:    jr $ra
550; MIPS32EB-NEXT:    nop
551entry:
552  %0 = atomicrmw sub i32* @x, i32 %incr monotonic
553  ret i32 %0
554
555}
556
557define i32 @AtomicLoadXor32(i32 signext %incr) nounwind {
558; MIPS32-LABEL: AtomicLoadXor32:
559; MIPS32:       # %bb.0: # %entry
560; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
561; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
562; MIPS32-NEXT:    addu $1, $2, $25
563; MIPS32-NEXT:    lw $1, %got(x)($1)
564; MIPS32-NEXT:  $BB2_1: # %entry
565; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
566; MIPS32-NEXT:    ll $2, 0($1)
567; MIPS32-NEXT:    xor $3, $2, $4
568; MIPS32-NEXT:    sc $3, 0($1)
569; MIPS32-NEXT:    beqz $3, $BB2_1
570; MIPS32-NEXT:    nop
571; MIPS32-NEXT:  # %bb.2: # %entry
572; MIPS32-NEXT:    jr $ra
573; MIPS32-NEXT:    nop
574;
575; MIPS32O0-LABEL: AtomicLoadXor32:
576; MIPS32O0:       # %bb.0: # %entry
577; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
578; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
579; MIPS32O0-NEXT:    addu $1, $2, $25
580; MIPS32O0-NEXT:    lw $1, %got(x)($1)
581; MIPS32O0-NEXT:  $BB2_1: # %entry
582; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
583; MIPS32O0-NEXT:    ll $2, 0($1)
584; MIPS32O0-NEXT:    xor $3, $2, $4
585; MIPS32O0-NEXT:    sc $3, 0($1)
586; MIPS32O0-NEXT:    beqz $3, $BB2_1
587; MIPS32O0-NEXT:    nop
588; MIPS32O0-NEXT:  # %bb.2: # %entry
589; MIPS32O0-NEXT:    jr $ra
590; MIPS32O0-NEXT:    nop
591;
592; MIPS32R2-LABEL: AtomicLoadXor32:
593; MIPS32R2:       # %bb.0: # %entry
594; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
595; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
596; MIPS32R2-NEXT:    addu $1, $2, $25
597; MIPS32R2-NEXT:    lw $1, %got(x)($1)
598; MIPS32R2-NEXT:  $BB2_1: # %entry
599; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
600; MIPS32R2-NEXT:    ll $2, 0($1)
601; MIPS32R2-NEXT:    xor $3, $2, $4
602; MIPS32R2-NEXT:    sc $3, 0($1)
603; MIPS32R2-NEXT:    beqz $3, $BB2_1
604; MIPS32R2-NEXT:    nop
605; MIPS32R2-NEXT:  # %bb.2: # %entry
606; MIPS32R2-NEXT:    jr $ra
607; MIPS32R2-NEXT:    nop
608;
609; MIPS32R6-LABEL: AtomicLoadXor32:
610; MIPS32R6:       # %bb.0: # %entry
611; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
612; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
613; MIPS32R6-NEXT:    addu $1, $2, $25
614; MIPS32R6-NEXT:    lw $1, %got(x)($1)
615; MIPS32R6-NEXT:  $BB2_1: # %entry
616; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
617; MIPS32R6-NEXT:    ll $2, 0($1)
618; MIPS32R6-NEXT:    xor $3, $2, $4
619; MIPS32R6-NEXT:    sc $3, 0($1)
620; MIPS32R6-NEXT:    beqzc $3, $BB2_1
621; MIPS32R6-NEXT:    nop
622; MIPS32R6-NEXT:  # %bb.2: # %entry
623; MIPS32R6-NEXT:    jrc $ra
624;
625; MIPS32R6O0-LABEL: AtomicLoadXor32:
626; MIPS32R6O0:       # %bb.0: # %entry
627; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
628; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
629; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
630; MIPS32R6O0-NEXT:    addu $1, $2, $25
631; MIPS32R6O0-NEXT:    move $2, $4
632; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
633; MIPS32R6O0-NEXT:  $BB2_1: # %entry
634; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
635; MIPS32R6O0-NEXT:    ll $3, 0($1)
636; MIPS32R6O0-NEXT:    xor $5, $3, $4
637; MIPS32R6O0-NEXT:    sc $5, 0($1)
638; MIPS32R6O0-NEXT:    beqzc $5, $BB2_1
639; MIPS32R6O0-NEXT:  # %bb.2: # %entry
640; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
641; MIPS32R6O0-NEXT:    move $2, $3
642; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
643; MIPS32R6O0-NEXT:    jrc $ra
644;
645; MIPS4-LABEL: AtomicLoadXor32:
646; MIPS4:       # %bb.0: # %entry
647; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
648; MIPS4-NEXT:    daddu $1, $1, $25
649; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
650; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
651; MIPS4-NEXT:  .LBB2_1: # %entry
652; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
653; MIPS4-NEXT:    ll $2, 0($1)
654; MIPS4-NEXT:    xor $3, $2, $4
655; MIPS4-NEXT:    sc $3, 0($1)
656; MIPS4-NEXT:    beqz $3, .LBB2_1
657; MIPS4-NEXT:    nop
658; MIPS4-NEXT:  # %bb.2: # %entry
659; MIPS4-NEXT:    jr $ra
660; MIPS4-NEXT:    nop
661;
662; MIPS64-LABEL: AtomicLoadXor32:
663; MIPS64:       # %bb.0: # %entry
664; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
665; MIPS64-NEXT:    daddu $1, $1, $25
666; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
667; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
668; MIPS64-NEXT:  .LBB2_1: # %entry
669; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
670; MIPS64-NEXT:    ll $2, 0($1)
671; MIPS64-NEXT:    xor $3, $2, $4
672; MIPS64-NEXT:    sc $3, 0($1)
673; MIPS64-NEXT:    beqz $3, .LBB2_1
674; MIPS64-NEXT:    nop
675; MIPS64-NEXT:  # %bb.2: # %entry
676; MIPS64-NEXT:    jr $ra
677; MIPS64-NEXT:    nop
678;
679; MIPS64R2-LABEL: AtomicLoadXor32:
680; MIPS64R2:       # %bb.0: # %entry
681; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
682; MIPS64R2-NEXT:    daddu $1, $1, $25
683; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
684; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
685; MIPS64R2-NEXT:  .LBB2_1: # %entry
686; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
687; MIPS64R2-NEXT:    ll $2, 0($1)
688; MIPS64R2-NEXT:    xor $3, $2, $4
689; MIPS64R2-NEXT:    sc $3, 0($1)
690; MIPS64R2-NEXT:    beqz $3, .LBB2_1
691; MIPS64R2-NEXT:    nop
692; MIPS64R2-NEXT:  # %bb.2: # %entry
693; MIPS64R2-NEXT:    jr $ra
694; MIPS64R2-NEXT:    nop
695;
696; MIPS64R6-LABEL: AtomicLoadXor32:
697; MIPS64R6:       # %bb.0: # %entry
698; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
699; MIPS64R6-NEXT:    daddu $1, $1, $25
700; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
701; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
702; MIPS64R6-NEXT:  .LBB2_1: # %entry
703; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
704; MIPS64R6-NEXT:    ll $2, 0($1)
705; MIPS64R6-NEXT:    xor $3, $2, $4
706; MIPS64R6-NEXT:    sc $3, 0($1)
707; MIPS64R6-NEXT:    beqzc $3, .LBB2_1
708; MIPS64R6-NEXT:    nop
709; MIPS64R6-NEXT:  # %bb.2: # %entry
710; MIPS64R6-NEXT:    jrc $ra
711;
712; MIPS64R6O0-LABEL: AtomicLoadXor32:
713; MIPS64R6O0:       # %bb.0: # %entry
714; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
715; MIPS64R6O0-NEXT:    daddu $1, $1, $25
716; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
717; MIPS64R6O0-NEXT:    move $2, $4
718; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
719; MIPS64R6O0-NEXT:  .LBB2_1: # %entry
720; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
721; MIPS64R6O0-NEXT:    ll $3, 0($1)
722; MIPS64R6O0-NEXT:    xor $5, $3, $2
723; MIPS64R6O0-NEXT:    sc $5, 0($1)
724; MIPS64R6O0-NEXT:    beqzc $5, .LBB2_1
725; MIPS64R6O0-NEXT:  # %bb.2: # %entry
726; MIPS64R6O0-NEXT:    move $2, $3
727; MIPS64R6O0-NEXT:    jrc $ra
728;
729; MM32-LABEL: AtomicLoadXor32:
730; MM32:       # %bb.0: # %entry
731; MM32-NEXT:    lui $2, %hi(_gp_disp)
732; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
733; MM32-NEXT:    addu $2, $2, $25
734; MM32-NEXT:    lw $1, %got(x)($2)
735; MM32-NEXT:  $BB2_1: # %entry
736; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
737; MM32-NEXT:    ll $2, 0($1)
738; MM32-NEXT:    xor $3, $2, $4
739; MM32-NEXT:    sc $3, 0($1)
740; MM32-NEXT:    beqzc $3, $BB2_1
741; MM32-NEXT:  # %bb.2: # %entry
742; MM32-NEXT:    jrc $ra
743;
744; O1-LABEL: AtomicLoadXor32:
745; O1:       # %bb.0: # %entry
746; O1-NEXT:    lui $2, %hi(_gp_disp)
747; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
748; O1-NEXT:    addu $1, $2, $25
749; O1-NEXT:    lw $1, %got(x)($1)
750; O1-NEXT:  $BB2_1: # %entry
751; O1-NEXT:    # =>This Inner Loop Header: Depth=1
752; O1-NEXT:    ll $2, 0($1)
753; O1-NEXT:    xor $3, $2, $4
754; O1-NEXT:    sc $3, 0($1)
755; O1-NEXT:    beqz $3, $BB2_1
756; O1-NEXT:    nop
757; O1-NEXT:  # %bb.2: # %entry
758; O1-NEXT:    jr $ra
759; O1-NEXT:    nop
760;
761; O2-LABEL: AtomicLoadXor32:
762; O2:       # %bb.0: # %entry
763; O2-NEXT:    lui $2, %hi(_gp_disp)
764; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
765; O2-NEXT:    addu $1, $2, $25
766; O2-NEXT:    lw $1, %got(x)($1)
767; O2-NEXT:  $BB2_1: # %entry
768; O2-NEXT:    # =>This Inner Loop Header: Depth=1
769; O2-NEXT:    ll $2, 0($1)
770; O2-NEXT:    xor $3, $2, $4
771; O2-NEXT:    sc $3, 0($1)
772; O2-NEXT:    beqz $3, $BB2_1
773; O2-NEXT:    nop
774; O2-NEXT:  # %bb.2: # %entry
775; O2-NEXT:    jr $ra
776; O2-NEXT:    nop
777;
778; O3-LABEL: AtomicLoadXor32:
779; O3:       # %bb.0: # %entry
780; O3-NEXT:    lui $2, %hi(_gp_disp)
781; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
782; O3-NEXT:    addu $1, $2, $25
783; O3-NEXT:    lw $1, %got(x)($1)
784; O3-NEXT:  $BB2_1: # %entry
785; O3-NEXT:    # =>This Inner Loop Header: Depth=1
786; O3-NEXT:    ll $2, 0($1)
787; O3-NEXT:    xor $3, $2, $4
788; O3-NEXT:    sc $3, 0($1)
789; O3-NEXT:    beqz $3, $BB2_1
790; O3-NEXT:    nop
791; O3-NEXT:  # %bb.2: # %entry
792; O3-NEXT:    jr $ra
793; O3-NEXT:    nop
794;
795; MIPS32EB-LABEL: AtomicLoadXor32:
796; MIPS32EB:       # %bb.0: # %entry
797; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
798; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
799; MIPS32EB-NEXT:    addu $1, $2, $25
800; MIPS32EB-NEXT:    lw $1, %got(x)($1)
801; MIPS32EB-NEXT:  $BB2_1: # %entry
802; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
803; MIPS32EB-NEXT:    ll $2, 0($1)
804; MIPS32EB-NEXT:    xor $3, $2, $4
805; MIPS32EB-NEXT:    sc $3, 0($1)
806; MIPS32EB-NEXT:    beqz $3, $BB2_1
807; MIPS32EB-NEXT:    nop
808; MIPS32EB-NEXT:  # %bb.2: # %entry
809; MIPS32EB-NEXT:    jr $ra
810; MIPS32EB-NEXT:    nop
811entry:
812  %0 = atomicrmw xor i32* @x, i32 %incr monotonic
813  ret i32 %0
814}
815
816define i32 @AtomicLoadOr32(i32 signext %incr) nounwind {
817; MIPS32-LABEL: AtomicLoadOr32:
818; MIPS32:       # %bb.0: # %entry
819; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
820; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
821; MIPS32-NEXT:    addu $1, $2, $25
822; MIPS32-NEXT:    lw $1, %got(x)($1)
823; MIPS32-NEXT:  $BB3_1: # %entry
824; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
825; MIPS32-NEXT:    ll $2, 0($1)
826; MIPS32-NEXT:    or $3, $2, $4
827; MIPS32-NEXT:    sc $3, 0($1)
828; MIPS32-NEXT:    beqz $3, $BB3_1
829; MIPS32-NEXT:    nop
830; MIPS32-NEXT:  # %bb.2: # %entry
831; MIPS32-NEXT:    jr $ra
832; MIPS32-NEXT:    nop
833;
834; MIPS32O0-LABEL: AtomicLoadOr32:
835; MIPS32O0:       # %bb.0: # %entry
836; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
837; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
838; MIPS32O0-NEXT:    addu $1, $2, $25
839; MIPS32O0-NEXT:    lw $1, %got(x)($1)
840; MIPS32O0-NEXT:  $BB3_1: # %entry
841; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
842; MIPS32O0-NEXT:    ll $2, 0($1)
843; MIPS32O0-NEXT:    or $3, $2, $4
844; MIPS32O0-NEXT:    sc $3, 0($1)
845; MIPS32O0-NEXT:    beqz $3, $BB3_1
846; MIPS32O0-NEXT:    nop
847; MIPS32O0-NEXT:  # %bb.2: # %entry
848; MIPS32O0-NEXT:    jr $ra
849; MIPS32O0-NEXT:    nop
850;
851; MIPS32R2-LABEL: AtomicLoadOr32:
852; MIPS32R2:       # %bb.0: # %entry
853; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
854; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
855; MIPS32R2-NEXT:    addu $1, $2, $25
856; MIPS32R2-NEXT:    lw $1, %got(x)($1)
857; MIPS32R2-NEXT:  $BB3_1: # %entry
858; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
859; MIPS32R2-NEXT:    ll $2, 0($1)
860; MIPS32R2-NEXT:    or $3, $2, $4
861; MIPS32R2-NEXT:    sc $3, 0($1)
862; MIPS32R2-NEXT:    beqz $3, $BB3_1
863; MIPS32R2-NEXT:    nop
864; MIPS32R2-NEXT:  # %bb.2: # %entry
865; MIPS32R2-NEXT:    jr $ra
866; MIPS32R2-NEXT:    nop
867;
868; MIPS32R6-LABEL: AtomicLoadOr32:
869; MIPS32R6:       # %bb.0: # %entry
870; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
871; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
872; MIPS32R6-NEXT:    addu $1, $2, $25
873; MIPS32R6-NEXT:    lw $1, %got(x)($1)
874; MIPS32R6-NEXT:  $BB3_1: # %entry
875; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
876; MIPS32R6-NEXT:    ll $2, 0($1)
877; MIPS32R6-NEXT:    or $3, $2, $4
878; MIPS32R6-NEXT:    sc $3, 0($1)
879; MIPS32R6-NEXT:    beqzc $3, $BB3_1
880; MIPS32R6-NEXT:    nop
881; MIPS32R6-NEXT:  # %bb.2: # %entry
882; MIPS32R6-NEXT:    jrc $ra
883;
884; MIPS32R6O0-LABEL: AtomicLoadOr32:
885; MIPS32R6O0:       # %bb.0: # %entry
886; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
887; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
888; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
889; MIPS32R6O0-NEXT:    addu $1, $2, $25
890; MIPS32R6O0-NEXT:    move $2, $4
891; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
892; MIPS32R6O0-NEXT:  $BB3_1: # %entry
893; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
894; MIPS32R6O0-NEXT:    ll $3, 0($1)
895; MIPS32R6O0-NEXT:    or $5, $3, $4
896; MIPS32R6O0-NEXT:    sc $5, 0($1)
897; MIPS32R6O0-NEXT:    beqzc $5, $BB3_1
898; MIPS32R6O0-NEXT:  # %bb.2: # %entry
899; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
900; MIPS32R6O0-NEXT:    move $2, $3
901; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
902; MIPS32R6O0-NEXT:    jrc $ra
903;
904; MIPS4-LABEL: AtomicLoadOr32:
905; MIPS4:       # %bb.0: # %entry
906; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
907; MIPS4-NEXT:    daddu $1, $1, $25
908; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
909; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
910; MIPS4-NEXT:  .LBB3_1: # %entry
911; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
912; MIPS4-NEXT:    ll $2, 0($1)
913; MIPS4-NEXT:    or $3, $2, $4
914; MIPS4-NEXT:    sc $3, 0($1)
915; MIPS4-NEXT:    beqz $3, .LBB3_1
916; MIPS4-NEXT:    nop
917; MIPS4-NEXT:  # %bb.2: # %entry
918; MIPS4-NEXT:    jr $ra
919; MIPS4-NEXT:    nop
920;
921; MIPS64-LABEL: AtomicLoadOr32:
922; MIPS64:       # %bb.0: # %entry
923; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
924; MIPS64-NEXT:    daddu $1, $1, $25
925; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
926; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
927; MIPS64-NEXT:  .LBB3_1: # %entry
928; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
929; MIPS64-NEXT:    ll $2, 0($1)
930; MIPS64-NEXT:    or $3, $2, $4
931; MIPS64-NEXT:    sc $3, 0($1)
932; MIPS64-NEXT:    beqz $3, .LBB3_1
933; MIPS64-NEXT:    nop
934; MIPS64-NEXT:  # %bb.2: # %entry
935; MIPS64-NEXT:    jr $ra
936; MIPS64-NEXT:    nop
937;
938; MIPS64R2-LABEL: AtomicLoadOr32:
939; MIPS64R2:       # %bb.0: # %entry
940; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
941; MIPS64R2-NEXT:    daddu $1, $1, $25
942; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
943; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
944; MIPS64R2-NEXT:  .LBB3_1: # %entry
945; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
946; MIPS64R2-NEXT:    ll $2, 0($1)
947; MIPS64R2-NEXT:    or $3, $2, $4
948; MIPS64R2-NEXT:    sc $3, 0($1)
949; MIPS64R2-NEXT:    beqz $3, .LBB3_1
950; MIPS64R2-NEXT:    nop
951; MIPS64R2-NEXT:  # %bb.2: # %entry
952; MIPS64R2-NEXT:    jr $ra
953; MIPS64R2-NEXT:    nop
954;
955; MIPS64R6-LABEL: AtomicLoadOr32:
956; MIPS64R6:       # %bb.0: # %entry
957; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
958; MIPS64R6-NEXT:    daddu $1, $1, $25
959; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
960; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
961; MIPS64R6-NEXT:  .LBB3_1: # %entry
962; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
963; MIPS64R6-NEXT:    ll $2, 0($1)
964; MIPS64R6-NEXT:    or $3, $2, $4
965; MIPS64R6-NEXT:    sc $3, 0($1)
966; MIPS64R6-NEXT:    beqzc $3, .LBB3_1
967; MIPS64R6-NEXT:    nop
968; MIPS64R6-NEXT:  # %bb.2: # %entry
969; MIPS64R6-NEXT:    jrc $ra
970;
971; MIPS64R6O0-LABEL: AtomicLoadOr32:
972; MIPS64R6O0:       # %bb.0: # %entry
973; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
974; MIPS64R6O0-NEXT:    daddu $1, $1, $25
975; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
976; MIPS64R6O0-NEXT:    move $2, $4
977; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
978; MIPS64R6O0-NEXT:  .LBB3_1: # %entry
979; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
980; MIPS64R6O0-NEXT:    ll $3, 0($1)
981; MIPS64R6O0-NEXT:    or $5, $3, $2
982; MIPS64R6O0-NEXT:    sc $5, 0($1)
983; MIPS64R6O0-NEXT:    beqzc $5, .LBB3_1
984; MIPS64R6O0-NEXT:  # %bb.2: # %entry
985; MIPS64R6O0-NEXT:    move $2, $3
986; MIPS64R6O0-NEXT:    jrc $ra
987;
988; MM32-LABEL: AtomicLoadOr32:
989; MM32:       # %bb.0: # %entry
990; MM32-NEXT:    lui $2, %hi(_gp_disp)
991; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
992; MM32-NEXT:    addu $2, $2, $25
993; MM32-NEXT:    lw $1, %got(x)($2)
994; MM32-NEXT:  $BB3_1: # %entry
995; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
996; MM32-NEXT:    ll $2, 0($1)
997; MM32-NEXT:    or $3, $2, $4
998; MM32-NEXT:    sc $3, 0($1)
999; MM32-NEXT:    beqzc $3, $BB3_1
1000; MM32-NEXT:  # %bb.2: # %entry
1001; MM32-NEXT:    jrc $ra
1002;
1003; O1-LABEL: AtomicLoadOr32:
1004; O1:       # %bb.0: # %entry
1005; O1-NEXT:    lui $2, %hi(_gp_disp)
1006; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1007; O1-NEXT:    addu $1, $2, $25
1008; O1-NEXT:    lw $1, %got(x)($1)
1009; O1-NEXT:  $BB3_1: # %entry
1010; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1011; O1-NEXT:    ll $2, 0($1)
1012; O1-NEXT:    or $3, $2, $4
1013; O1-NEXT:    sc $3, 0($1)
1014; O1-NEXT:    beqz $3, $BB3_1
1015; O1-NEXT:    nop
1016; O1-NEXT:  # %bb.2: # %entry
1017; O1-NEXT:    jr $ra
1018; O1-NEXT:    nop
1019;
1020; O2-LABEL: AtomicLoadOr32:
1021; O2:       # %bb.0: # %entry
1022; O2-NEXT:    lui $2, %hi(_gp_disp)
1023; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1024; O2-NEXT:    addu $1, $2, $25
1025; O2-NEXT:    lw $1, %got(x)($1)
1026; O2-NEXT:  $BB3_1: # %entry
1027; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1028; O2-NEXT:    ll $2, 0($1)
1029; O2-NEXT:    or $3, $2, $4
1030; O2-NEXT:    sc $3, 0($1)
1031; O2-NEXT:    beqz $3, $BB3_1
1032; O2-NEXT:    nop
1033; O2-NEXT:  # %bb.2: # %entry
1034; O2-NEXT:    jr $ra
1035; O2-NEXT:    nop
1036;
1037; O3-LABEL: AtomicLoadOr32:
1038; O3:       # %bb.0: # %entry
1039; O3-NEXT:    lui $2, %hi(_gp_disp)
1040; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1041; O3-NEXT:    addu $1, $2, $25
1042; O3-NEXT:    lw $1, %got(x)($1)
1043; O3-NEXT:  $BB3_1: # %entry
1044; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1045; O3-NEXT:    ll $2, 0($1)
1046; O3-NEXT:    or $3, $2, $4
1047; O3-NEXT:    sc $3, 0($1)
1048; O3-NEXT:    beqz $3, $BB3_1
1049; O3-NEXT:    nop
1050; O3-NEXT:  # %bb.2: # %entry
1051; O3-NEXT:    jr $ra
1052; O3-NEXT:    nop
1053;
1054; MIPS32EB-LABEL: AtomicLoadOr32:
1055; MIPS32EB:       # %bb.0: # %entry
1056; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1057; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1058; MIPS32EB-NEXT:    addu $1, $2, $25
1059; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1060; MIPS32EB-NEXT:  $BB3_1: # %entry
1061; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1062; MIPS32EB-NEXT:    ll $2, 0($1)
1063; MIPS32EB-NEXT:    or $3, $2, $4
1064; MIPS32EB-NEXT:    sc $3, 0($1)
1065; MIPS32EB-NEXT:    beqz $3, $BB3_1
1066; MIPS32EB-NEXT:    nop
1067; MIPS32EB-NEXT:  # %bb.2: # %entry
1068; MIPS32EB-NEXT:    jr $ra
1069; MIPS32EB-NEXT:    nop
1070entry:
1071  %0 = atomicrmw or i32* @x, i32 %incr monotonic
1072  ret i32 %0
1073}
1074
1075define i32 @AtomicLoadAnd32(i32 signext %incr) nounwind {
1076; MIPS32-LABEL: AtomicLoadAnd32:
1077; MIPS32:       # %bb.0: # %entry
1078; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1079; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1080; MIPS32-NEXT:    addu $1, $2, $25
1081; MIPS32-NEXT:    lw $1, %got(x)($1)
1082; MIPS32-NEXT:  $BB4_1: # %entry
1083; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1084; MIPS32-NEXT:    ll $2, 0($1)
1085; MIPS32-NEXT:    and $3, $2, $4
1086; MIPS32-NEXT:    sc $3, 0($1)
1087; MIPS32-NEXT:    beqz $3, $BB4_1
1088; MIPS32-NEXT:    nop
1089; MIPS32-NEXT:  # %bb.2: # %entry
1090; MIPS32-NEXT:    jr $ra
1091; MIPS32-NEXT:    nop
1092;
1093; MIPS32O0-LABEL: AtomicLoadAnd32:
1094; MIPS32O0:       # %bb.0: # %entry
1095; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1096; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1097; MIPS32O0-NEXT:    addu $1, $2, $25
1098; MIPS32O0-NEXT:    lw $1, %got(x)($1)
1099; MIPS32O0-NEXT:  $BB4_1: # %entry
1100; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1101; MIPS32O0-NEXT:    ll $2, 0($1)
1102; MIPS32O0-NEXT:    and $3, $2, $4
1103; MIPS32O0-NEXT:    sc $3, 0($1)
1104; MIPS32O0-NEXT:    beqz $3, $BB4_1
1105; MIPS32O0-NEXT:    nop
1106; MIPS32O0-NEXT:  # %bb.2: # %entry
1107; MIPS32O0-NEXT:    jr $ra
1108; MIPS32O0-NEXT:    nop
1109;
1110; MIPS32R2-LABEL: AtomicLoadAnd32:
1111; MIPS32R2:       # %bb.0: # %entry
1112; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1113; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1114; MIPS32R2-NEXT:    addu $1, $2, $25
1115; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1116; MIPS32R2-NEXT:  $BB4_1: # %entry
1117; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1118; MIPS32R2-NEXT:    ll $2, 0($1)
1119; MIPS32R2-NEXT:    and $3, $2, $4
1120; MIPS32R2-NEXT:    sc $3, 0($1)
1121; MIPS32R2-NEXT:    beqz $3, $BB4_1
1122; MIPS32R2-NEXT:    nop
1123; MIPS32R2-NEXT:  # %bb.2: # %entry
1124; MIPS32R2-NEXT:    jr $ra
1125; MIPS32R2-NEXT:    nop
1126;
1127; MIPS32R6-LABEL: AtomicLoadAnd32:
1128; MIPS32R6:       # %bb.0: # %entry
1129; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1130; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1131; MIPS32R6-NEXT:    addu $1, $2, $25
1132; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1133; MIPS32R6-NEXT:  $BB4_1: # %entry
1134; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1135; MIPS32R6-NEXT:    ll $2, 0($1)
1136; MIPS32R6-NEXT:    and $3, $2, $4
1137; MIPS32R6-NEXT:    sc $3, 0($1)
1138; MIPS32R6-NEXT:    beqzc $3, $BB4_1
1139; MIPS32R6-NEXT:    nop
1140; MIPS32R6-NEXT:  # %bb.2: # %entry
1141; MIPS32R6-NEXT:    jrc $ra
1142;
1143; MIPS32R6O0-LABEL: AtomicLoadAnd32:
1144; MIPS32R6O0:       # %bb.0: # %entry
1145; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1146; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1147; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
1148; MIPS32R6O0-NEXT:    addu $1, $2, $25
1149; MIPS32R6O0-NEXT:    move $2, $4
1150; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
1151; MIPS32R6O0-NEXT:  $BB4_1: # %entry
1152; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1153; MIPS32R6O0-NEXT:    ll $3, 0($1)
1154; MIPS32R6O0-NEXT:    and $5, $3, $4
1155; MIPS32R6O0-NEXT:    sc $5, 0($1)
1156; MIPS32R6O0-NEXT:    beqzc $5, $BB4_1
1157; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1158; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
1159; MIPS32R6O0-NEXT:    move $2, $3
1160; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
1161; MIPS32R6O0-NEXT:    jrc $ra
1162;
1163; MIPS4-LABEL: AtomicLoadAnd32:
1164; MIPS4:       # %bb.0: # %entry
1165; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1166; MIPS4-NEXT:    daddu $1, $1, $25
1167; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1168; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1169; MIPS4-NEXT:  .LBB4_1: # %entry
1170; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1171; MIPS4-NEXT:    ll $2, 0($1)
1172; MIPS4-NEXT:    and $3, $2, $4
1173; MIPS4-NEXT:    sc $3, 0($1)
1174; MIPS4-NEXT:    beqz $3, .LBB4_1
1175; MIPS4-NEXT:    nop
1176; MIPS4-NEXT:  # %bb.2: # %entry
1177; MIPS4-NEXT:    jr $ra
1178; MIPS4-NEXT:    nop
1179;
1180; MIPS64-LABEL: AtomicLoadAnd32:
1181; MIPS64:       # %bb.0: # %entry
1182; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1183; MIPS64-NEXT:    daddu $1, $1, $25
1184; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1185; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1186; MIPS64-NEXT:  .LBB4_1: # %entry
1187; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1188; MIPS64-NEXT:    ll $2, 0($1)
1189; MIPS64-NEXT:    and $3, $2, $4
1190; MIPS64-NEXT:    sc $3, 0($1)
1191; MIPS64-NEXT:    beqz $3, .LBB4_1
1192; MIPS64-NEXT:    nop
1193; MIPS64-NEXT:  # %bb.2: # %entry
1194; MIPS64-NEXT:    jr $ra
1195; MIPS64-NEXT:    nop
1196;
1197; MIPS64R2-LABEL: AtomicLoadAnd32:
1198; MIPS64R2:       # %bb.0: # %entry
1199; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1200; MIPS64R2-NEXT:    daddu $1, $1, $25
1201; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1202; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1203; MIPS64R2-NEXT:  .LBB4_1: # %entry
1204; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1205; MIPS64R2-NEXT:    ll $2, 0($1)
1206; MIPS64R2-NEXT:    and $3, $2, $4
1207; MIPS64R2-NEXT:    sc $3, 0($1)
1208; MIPS64R2-NEXT:    beqz $3, .LBB4_1
1209; MIPS64R2-NEXT:    nop
1210; MIPS64R2-NEXT:  # %bb.2: # %entry
1211; MIPS64R2-NEXT:    jr $ra
1212; MIPS64R2-NEXT:    nop
1213;
1214; MIPS64R6-LABEL: AtomicLoadAnd32:
1215; MIPS64R6:       # %bb.0: # %entry
1216; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1217; MIPS64R6-NEXT:    daddu $1, $1, $25
1218; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1219; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1220; MIPS64R6-NEXT:  .LBB4_1: # %entry
1221; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1222; MIPS64R6-NEXT:    ll $2, 0($1)
1223; MIPS64R6-NEXT:    and $3, $2, $4
1224; MIPS64R6-NEXT:    sc $3, 0($1)
1225; MIPS64R6-NEXT:    beqzc $3, .LBB4_1
1226; MIPS64R6-NEXT:    nop
1227; MIPS64R6-NEXT:  # %bb.2: # %entry
1228; MIPS64R6-NEXT:    jrc $ra
1229;
1230; MIPS64R6O0-LABEL: AtomicLoadAnd32:
1231; MIPS64R6O0:       # %bb.0: # %entry
1232; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1233; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1234; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1235; MIPS64R6O0-NEXT:    move $2, $4
1236; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
1237; MIPS64R6O0-NEXT:  .LBB4_1: # %entry
1238; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1239; MIPS64R6O0-NEXT:    ll $3, 0($1)
1240; MIPS64R6O0-NEXT:    and $5, $3, $2
1241; MIPS64R6O0-NEXT:    sc $5, 0($1)
1242; MIPS64R6O0-NEXT:    beqzc $5, .LBB4_1
1243; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1244; MIPS64R6O0-NEXT:    move $2, $3
1245; MIPS64R6O0-NEXT:    jrc $ra
1246;
1247; MM32-LABEL: AtomicLoadAnd32:
1248; MM32:       # %bb.0: # %entry
1249; MM32-NEXT:    lui $2, %hi(_gp_disp)
1250; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1251; MM32-NEXT:    addu $2, $2, $25
1252; MM32-NEXT:    lw $1, %got(x)($2)
1253; MM32-NEXT:  $BB4_1: # %entry
1254; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1255; MM32-NEXT:    ll $2, 0($1)
1256; MM32-NEXT:    and $3, $2, $4
1257; MM32-NEXT:    sc $3, 0($1)
1258; MM32-NEXT:    beqzc $3, $BB4_1
1259; MM32-NEXT:  # %bb.2: # %entry
1260; MM32-NEXT:    jrc $ra
1261;
1262; O1-LABEL: AtomicLoadAnd32:
1263; O1:       # %bb.0: # %entry
1264; O1-NEXT:    lui $2, %hi(_gp_disp)
1265; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1266; O1-NEXT:    addu $1, $2, $25
1267; O1-NEXT:    lw $1, %got(x)($1)
1268; O1-NEXT:  $BB4_1: # %entry
1269; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1270; O1-NEXT:    ll $2, 0($1)
1271; O1-NEXT:    and $3, $2, $4
1272; O1-NEXT:    sc $3, 0($1)
1273; O1-NEXT:    beqz $3, $BB4_1
1274; O1-NEXT:    nop
1275; O1-NEXT:  # %bb.2: # %entry
1276; O1-NEXT:    jr $ra
1277; O1-NEXT:    nop
1278;
1279; O2-LABEL: AtomicLoadAnd32:
1280; O2:       # %bb.0: # %entry
1281; O2-NEXT:    lui $2, %hi(_gp_disp)
1282; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1283; O2-NEXT:    addu $1, $2, $25
1284; O2-NEXT:    lw $1, %got(x)($1)
1285; O2-NEXT:  $BB4_1: # %entry
1286; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1287; O2-NEXT:    ll $2, 0($1)
1288; O2-NEXT:    and $3, $2, $4
1289; O2-NEXT:    sc $3, 0($1)
1290; O2-NEXT:    beqz $3, $BB4_1
1291; O2-NEXT:    nop
1292; O2-NEXT:  # %bb.2: # %entry
1293; O2-NEXT:    jr $ra
1294; O2-NEXT:    nop
1295;
1296; O3-LABEL: AtomicLoadAnd32:
1297; O3:       # %bb.0: # %entry
1298; O3-NEXT:    lui $2, %hi(_gp_disp)
1299; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1300; O3-NEXT:    addu $1, $2, $25
1301; O3-NEXT:    lw $1, %got(x)($1)
1302; O3-NEXT:  $BB4_1: # %entry
1303; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1304; O3-NEXT:    ll $2, 0($1)
1305; O3-NEXT:    and $3, $2, $4
1306; O3-NEXT:    sc $3, 0($1)
1307; O3-NEXT:    beqz $3, $BB4_1
1308; O3-NEXT:    nop
1309; O3-NEXT:  # %bb.2: # %entry
1310; O3-NEXT:    jr $ra
1311; O3-NEXT:    nop
1312;
1313; MIPS32EB-LABEL: AtomicLoadAnd32:
1314; MIPS32EB:       # %bb.0: # %entry
1315; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1316; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1317; MIPS32EB-NEXT:    addu $1, $2, $25
1318; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1319; MIPS32EB-NEXT:  $BB4_1: # %entry
1320; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1321; MIPS32EB-NEXT:    ll $2, 0($1)
1322; MIPS32EB-NEXT:    and $3, $2, $4
1323; MIPS32EB-NEXT:    sc $3, 0($1)
1324; MIPS32EB-NEXT:    beqz $3, $BB4_1
1325; MIPS32EB-NEXT:    nop
1326; MIPS32EB-NEXT:  # %bb.2: # %entry
1327; MIPS32EB-NEXT:    jr $ra
1328; MIPS32EB-NEXT:    nop
1329entry:
1330  %0 = atomicrmw and i32* @x, i32 %incr monotonic
1331  ret i32 %0
1332}
1333
1334define i32 @AtomicLoadNand32(i32 signext %incr) nounwind {
1335; MIPS32-LABEL: AtomicLoadNand32:
1336; MIPS32:       # %bb.0: # %entry
1337; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1338; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1339; MIPS32-NEXT:    addu $1, $2, $25
1340; MIPS32-NEXT:    lw $1, %got(x)($1)
1341; MIPS32-NEXT:  $BB5_1: # %entry
1342; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1343; MIPS32-NEXT:    ll $2, 0($1)
1344; MIPS32-NEXT:    and $3, $2, $4
1345; MIPS32-NEXT:    nor $3, $zero, $3
1346; MIPS32-NEXT:    sc $3, 0($1)
1347; MIPS32-NEXT:    beqz $3, $BB5_1
1348; MIPS32-NEXT:    nop
1349; MIPS32-NEXT:  # %bb.2: # %entry
1350; MIPS32-NEXT:    jr $ra
1351; MIPS32-NEXT:    nop
1352;
1353; MIPS32O0-LABEL: AtomicLoadNand32:
1354; MIPS32O0:       # %bb.0: # %entry
1355; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1356; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1357; MIPS32O0-NEXT:    addu $1, $2, $25
1358; MIPS32O0-NEXT:    lw $1, %got(x)($1)
1359; MIPS32O0-NEXT:  $BB5_1: # %entry
1360; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1361; MIPS32O0-NEXT:    ll $2, 0($1)
1362; MIPS32O0-NEXT:    and $3, $2, $4
1363; MIPS32O0-NEXT:    nor $3, $zero, $3
1364; MIPS32O0-NEXT:    sc $3, 0($1)
1365; MIPS32O0-NEXT:    beqz $3, $BB5_1
1366; MIPS32O0-NEXT:    nop
1367; MIPS32O0-NEXT:  # %bb.2: # %entry
1368; MIPS32O0-NEXT:    jr $ra
1369; MIPS32O0-NEXT:    nop
1370;
1371; MIPS32R2-LABEL: AtomicLoadNand32:
1372; MIPS32R2:       # %bb.0: # %entry
1373; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1374; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1375; MIPS32R2-NEXT:    addu $1, $2, $25
1376; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1377; MIPS32R2-NEXT:  $BB5_1: # %entry
1378; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1379; MIPS32R2-NEXT:    ll $2, 0($1)
1380; MIPS32R2-NEXT:    and $3, $2, $4
1381; MIPS32R2-NEXT:    nor $3, $zero, $3
1382; MIPS32R2-NEXT:    sc $3, 0($1)
1383; MIPS32R2-NEXT:    beqz $3, $BB5_1
1384; MIPS32R2-NEXT:    nop
1385; MIPS32R2-NEXT:  # %bb.2: # %entry
1386; MIPS32R2-NEXT:    jr $ra
1387; MIPS32R2-NEXT:    nop
1388;
1389; MIPS32R6-LABEL: AtomicLoadNand32:
1390; MIPS32R6:       # %bb.0: # %entry
1391; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1392; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1393; MIPS32R6-NEXT:    addu $1, $2, $25
1394; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1395; MIPS32R6-NEXT:  $BB5_1: # %entry
1396; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1397; MIPS32R6-NEXT:    ll $2, 0($1)
1398; MIPS32R6-NEXT:    and $3, $2, $4
1399; MIPS32R6-NEXT:    nor $3, $zero, $3
1400; MIPS32R6-NEXT:    sc $3, 0($1)
1401; MIPS32R6-NEXT:    beqzc $3, $BB5_1
1402; MIPS32R6-NEXT:    nop
1403; MIPS32R6-NEXT:  # %bb.2: # %entry
1404; MIPS32R6-NEXT:    jrc $ra
1405;
1406; MIPS32R6O0-LABEL: AtomicLoadNand32:
1407; MIPS32R6O0:       # %bb.0: # %entry
1408; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1409; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1410; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
1411; MIPS32R6O0-NEXT:    addu $1, $2, $25
1412; MIPS32R6O0-NEXT:    move $2, $4
1413; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
1414; MIPS32R6O0-NEXT:  $BB5_1: # %entry
1415; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1416; MIPS32R6O0-NEXT:    ll $3, 0($1)
1417; MIPS32R6O0-NEXT:    and $5, $3, $4
1418; MIPS32R6O0-NEXT:    nor $5, $zero, $5
1419; MIPS32R6O0-NEXT:    sc $5, 0($1)
1420; MIPS32R6O0-NEXT:    beqzc $5, $BB5_1
1421; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1422; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
1423; MIPS32R6O0-NEXT:    move $2, $3
1424; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
1425; MIPS32R6O0-NEXT:    jrc $ra
1426;
1427; MIPS4-LABEL: AtomicLoadNand32:
1428; MIPS4:       # %bb.0: # %entry
1429; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1430; MIPS4-NEXT:    daddu $1, $1, $25
1431; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1432; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1433; MIPS4-NEXT:  .LBB5_1: # %entry
1434; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1435; MIPS4-NEXT:    ll $2, 0($1)
1436; MIPS4-NEXT:    and $3, $2, $4
1437; MIPS4-NEXT:    nor $3, $zero, $3
1438; MIPS4-NEXT:    sc $3, 0($1)
1439; MIPS4-NEXT:    beqz $3, .LBB5_1
1440; MIPS4-NEXT:    nop
1441; MIPS4-NEXT:  # %bb.2: # %entry
1442; MIPS4-NEXT:    jr $ra
1443; MIPS4-NEXT:    nop
1444;
1445; MIPS64-LABEL: AtomicLoadNand32:
1446; MIPS64:       # %bb.0: # %entry
1447; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1448; MIPS64-NEXT:    daddu $1, $1, $25
1449; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1450; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1451; MIPS64-NEXT:  .LBB5_1: # %entry
1452; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1453; MIPS64-NEXT:    ll $2, 0($1)
1454; MIPS64-NEXT:    and $3, $2, $4
1455; MIPS64-NEXT:    nor $3, $zero, $3
1456; MIPS64-NEXT:    sc $3, 0($1)
1457; MIPS64-NEXT:    beqz $3, .LBB5_1
1458; MIPS64-NEXT:    nop
1459; MIPS64-NEXT:  # %bb.2: # %entry
1460; MIPS64-NEXT:    jr $ra
1461; MIPS64-NEXT:    nop
1462;
1463; MIPS64R2-LABEL: AtomicLoadNand32:
1464; MIPS64R2:       # %bb.0: # %entry
1465; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1466; MIPS64R2-NEXT:    daddu $1, $1, $25
1467; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1468; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1469; MIPS64R2-NEXT:  .LBB5_1: # %entry
1470; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1471; MIPS64R2-NEXT:    ll $2, 0($1)
1472; MIPS64R2-NEXT:    and $3, $2, $4
1473; MIPS64R2-NEXT:    nor $3, $zero, $3
1474; MIPS64R2-NEXT:    sc $3, 0($1)
1475; MIPS64R2-NEXT:    beqz $3, .LBB5_1
1476; MIPS64R2-NEXT:    nop
1477; MIPS64R2-NEXT:  # %bb.2: # %entry
1478; MIPS64R2-NEXT:    jr $ra
1479; MIPS64R2-NEXT:    nop
1480;
1481; MIPS64R6-LABEL: AtomicLoadNand32:
1482; MIPS64R6:       # %bb.0: # %entry
1483; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1484; MIPS64R6-NEXT:    daddu $1, $1, $25
1485; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1486; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1487; MIPS64R6-NEXT:  .LBB5_1: # %entry
1488; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1489; MIPS64R6-NEXT:    ll $2, 0($1)
1490; MIPS64R6-NEXT:    and $3, $2, $4
1491; MIPS64R6-NEXT:    nor $3, $zero, $3
1492; MIPS64R6-NEXT:    sc $3, 0($1)
1493; MIPS64R6-NEXT:    beqzc $3, .LBB5_1
1494; MIPS64R6-NEXT:    nop
1495; MIPS64R6-NEXT:  # %bb.2: # %entry
1496; MIPS64R6-NEXT:    jrc $ra
1497;
1498; MIPS64R6O0-LABEL: AtomicLoadNand32:
1499; MIPS64R6O0:       # %bb.0: # %entry
1500; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1501; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1502; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1503; MIPS64R6O0-NEXT:    move $2, $4
1504; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
1505; MIPS64R6O0-NEXT:  .LBB5_1: # %entry
1506; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1507; MIPS64R6O0-NEXT:    ll $3, 0($1)
1508; MIPS64R6O0-NEXT:    and $5, $3, $2
1509; MIPS64R6O0-NEXT:    nor $5, $zero, $5
1510; MIPS64R6O0-NEXT:    sc $5, 0($1)
1511; MIPS64R6O0-NEXT:    beqzc $5, .LBB5_1
1512; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1513; MIPS64R6O0-NEXT:    move $2, $3
1514; MIPS64R6O0-NEXT:    jrc $ra
1515;
1516; MM32-LABEL: AtomicLoadNand32:
1517; MM32:       # %bb.0: # %entry
1518; MM32-NEXT:    lui $2, %hi(_gp_disp)
1519; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1520; MM32-NEXT:    addu $2, $2, $25
1521; MM32-NEXT:    lw $1, %got(x)($2)
1522; MM32-NEXT:  $BB5_1: # %entry
1523; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1524; MM32-NEXT:    ll $2, 0($1)
1525; MM32-NEXT:    and $3, $2, $4
1526; MM32-NEXT:    nor $3, $zero, $3
1527; MM32-NEXT:    sc $3, 0($1)
1528; MM32-NEXT:    beqzc $3, $BB5_1
1529; MM32-NEXT:  # %bb.2: # %entry
1530; MM32-NEXT:    jrc $ra
1531;
1532; O1-LABEL: AtomicLoadNand32:
1533; O1:       # %bb.0: # %entry
1534; O1-NEXT:    lui $2, %hi(_gp_disp)
1535; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1536; O1-NEXT:    addu $1, $2, $25
1537; O1-NEXT:    lw $1, %got(x)($1)
1538; O1-NEXT:  $BB5_1: # %entry
1539; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1540; O1-NEXT:    ll $2, 0($1)
1541; O1-NEXT:    and $3, $2, $4
1542; O1-NEXT:    nor $3, $zero, $3
1543; O1-NEXT:    sc $3, 0($1)
1544; O1-NEXT:    beqz $3, $BB5_1
1545; O1-NEXT:    nop
1546; O1-NEXT:  # %bb.2: # %entry
1547; O1-NEXT:    jr $ra
1548; O1-NEXT:    nop
1549;
1550; O2-LABEL: AtomicLoadNand32:
1551; O2:       # %bb.0: # %entry
1552; O2-NEXT:    lui $2, %hi(_gp_disp)
1553; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1554; O2-NEXT:    addu $1, $2, $25
1555; O2-NEXT:    lw $1, %got(x)($1)
1556; O2-NEXT:  $BB5_1: # %entry
1557; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1558; O2-NEXT:    ll $2, 0($1)
1559; O2-NEXT:    and $3, $2, $4
1560; O2-NEXT:    nor $3, $zero, $3
1561; O2-NEXT:    sc $3, 0($1)
1562; O2-NEXT:    beqz $3, $BB5_1
1563; O2-NEXT:    nop
1564; O2-NEXT:  # %bb.2: # %entry
1565; O2-NEXT:    jr $ra
1566; O2-NEXT:    nop
1567;
1568; O3-LABEL: AtomicLoadNand32:
1569; O3:       # %bb.0: # %entry
1570; O3-NEXT:    lui $2, %hi(_gp_disp)
1571; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1572; O3-NEXT:    addu $1, $2, $25
1573; O3-NEXT:    lw $1, %got(x)($1)
1574; O3-NEXT:  $BB5_1: # %entry
1575; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1576; O3-NEXT:    ll $2, 0($1)
1577; O3-NEXT:    and $3, $2, $4
1578; O3-NEXT:    nor $3, $zero, $3
1579; O3-NEXT:    sc $3, 0($1)
1580; O3-NEXT:    beqz $3, $BB5_1
1581; O3-NEXT:    nop
1582; O3-NEXT:  # %bb.2: # %entry
1583; O3-NEXT:    jr $ra
1584; O3-NEXT:    nop
1585;
1586; MIPS32EB-LABEL: AtomicLoadNand32:
1587; MIPS32EB:       # %bb.0: # %entry
1588; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1589; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1590; MIPS32EB-NEXT:    addu $1, $2, $25
1591; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1592; MIPS32EB-NEXT:  $BB5_1: # %entry
1593; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1594; MIPS32EB-NEXT:    ll $2, 0($1)
1595; MIPS32EB-NEXT:    and $3, $2, $4
1596; MIPS32EB-NEXT:    nor $3, $zero, $3
1597; MIPS32EB-NEXT:    sc $3, 0($1)
1598; MIPS32EB-NEXT:    beqz $3, $BB5_1
1599; MIPS32EB-NEXT:    nop
1600; MIPS32EB-NEXT:  # %bb.2: # %entry
1601; MIPS32EB-NEXT:    jr $ra
1602; MIPS32EB-NEXT:    nop
1603entry:
1604  %0 = atomicrmw nand i32* @x, i32 %incr monotonic
1605  ret i32 %0
1606
1607}
1608
1609define i32 @AtomicSwap32(i32 signext %newval) nounwind {
1610; MIPS32-LABEL: AtomicSwap32:
1611; MIPS32:       # %bb.0: # %entry
1612; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1613; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1614; MIPS32-NEXT:    addiu $sp, $sp, -8
1615; MIPS32-NEXT:    addu $1, $2, $25
1616; MIPS32-NEXT:    sw $4, 4($sp)
1617; MIPS32-NEXT:    lw $1, %got(x)($1)
1618; MIPS32-NEXT:  $BB6_1: # %entry
1619; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1620; MIPS32-NEXT:    ll $2, 0($1)
1621; MIPS32-NEXT:    move $3, $4
1622; MIPS32-NEXT:    sc $3, 0($1)
1623; MIPS32-NEXT:    beqz $3, $BB6_1
1624; MIPS32-NEXT:    nop
1625; MIPS32-NEXT:  # %bb.2: # %entry
1626; MIPS32-NEXT:    jr $ra
1627; MIPS32-NEXT:    addiu $sp, $sp, 8
1628;
1629; MIPS32O0-LABEL: AtomicSwap32:
1630; MIPS32O0:       # %bb.0: # %entry
1631; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1632; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1633; MIPS32O0-NEXT:    addiu $sp, $sp, -8
1634; MIPS32O0-NEXT:    addu $1, $2, $25
1635; MIPS32O0-NEXT:    sw $4, 4($sp)
1636; MIPS32O0-NEXT:    lw $2, 4($sp)
1637; MIPS32O0-NEXT:    lw $1, %got(x)($1)
1638; MIPS32O0-NEXT:  $BB6_1: # %entry
1639; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1640; MIPS32O0-NEXT:    ll $3, 0($1)
1641; MIPS32O0-NEXT:    move $4, $2
1642; MIPS32O0-NEXT:    sc $4, 0($1)
1643; MIPS32O0-NEXT:    beqz $4, $BB6_1
1644; MIPS32O0-NEXT:    nop
1645; MIPS32O0-NEXT:  # %bb.2: # %entry
1646; MIPS32O0-NEXT:    move $2, $3
1647; MIPS32O0-NEXT:    addiu $sp, $sp, 8
1648; MIPS32O0-NEXT:    jr $ra
1649; MIPS32O0-NEXT:    nop
1650;
1651; MIPS32R2-LABEL: AtomicSwap32:
1652; MIPS32R2:       # %bb.0: # %entry
1653; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1654; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1655; MIPS32R2-NEXT:    addiu $sp, $sp, -8
1656; MIPS32R2-NEXT:    addu $1, $2, $25
1657; MIPS32R2-NEXT:    sw $4, 4($sp)
1658; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1659; MIPS32R2-NEXT:  $BB6_1: # %entry
1660; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1661; MIPS32R2-NEXT:    ll $2, 0($1)
1662; MIPS32R2-NEXT:    move $3, $4
1663; MIPS32R2-NEXT:    sc $3, 0($1)
1664; MIPS32R2-NEXT:    beqz $3, $BB6_1
1665; MIPS32R2-NEXT:    nop
1666; MIPS32R2-NEXT:  # %bb.2: # %entry
1667; MIPS32R2-NEXT:    jr $ra
1668; MIPS32R2-NEXT:    addiu $sp, $sp, 8
1669;
1670; MIPS32R6-LABEL: AtomicSwap32:
1671; MIPS32R6:       # %bb.0: # %entry
1672; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1673; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1674; MIPS32R6-NEXT:    addiu $sp, $sp, -8
1675; MIPS32R6-NEXT:    addu $1, $2, $25
1676; MIPS32R6-NEXT:    sw $4, 4($sp)
1677; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1678; MIPS32R6-NEXT:  $BB6_1: # %entry
1679; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1680; MIPS32R6-NEXT:    ll $2, 0($1)
1681; MIPS32R6-NEXT:    move $3, $4
1682; MIPS32R6-NEXT:    sc $3, 0($1)
1683; MIPS32R6-NEXT:    beqzc $3, $BB6_1
1684; MIPS32R6-NEXT:    nop
1685; MIPS32R6-NEXT:  # %bb.2: # %entry
1686; MIPS32R6-NEXT:    jr $ra
1687; MIPS32R6-NEXT:    addiu $sp, $sp, 8
1688;
1689; MIPS32R6O0-LABEL: AtomicSwap32:
1690; MIPS32R6O0:       # %bb.0: # %entry
1691; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1692; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1693; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
1694; MIPS32R6O0-NEXT:    addu $1, $2, $25
1695; MIPS32R6O0-NEXT:    move $2, $4
1696; MIPS32R6O0-NEXT:    sw $4, 4($sp)
1697; MIPS32R6O0-NEXT:    lw $3, 4($sp)
1698; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
1699; MIPS32R6O0-NEXT:  $BB6_1: # %entry
1700; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1701; MIPS32R6O0-NEXT:    ll $4, 0($1)
1702; MIPS32R6O0-NEXT:    move $5, $3
1703; MIPS32R6O0-NEXT:    sc $5, 0($1)
1704; MIPS32R6O0-NEXT:    beqzc $5, $BB6_1
1705; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1706; MIPS32R6O0-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
1707; MIPS32R6O0-NEXT:    move $2, $4
1708; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
1709; MIPS32R6O0-NEXT:    jrc $ra
1710;
1711; MIPS4-LABEL: AtomicSwap32:
1712; MIPS4:       # %bb.0: # %entry
1713; MIPS4-NEXT:    daddiu $sp, $sp, -16
1714; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1715; MIPS4-NEXT:    daddu $1, $1, $25
1716; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1717; MIPS4-NEXT:    sw $4, 12($sp)
1718; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1719; MIPS4-NEXT:  .LBB6_1: # %entry
1720; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1721; MIPS4-NEXT:    ll $2, 0($1)
1722; MIPS4-NEXT:    move $3, $4
1723; MIPS4-NEXT:    sc $3, 0($1)
1724; MIPS4-NEXT:    beqz $3, .LBB6_1
1725; MIPS4-NEXT:    nop
1726; MIPS4-NEXT:  # %bb.2: # %entry
1727; MIPS4-NEXT:    jr $ra
1728; MIPS4-NEXT:    daddiu $sp, $sp, 16
1729;
1730; MIPS64-LABEL: AtomicSwap32:
1731; MIPS64:       # %bb.0: # %entry
1732; MIPS64-NEXT:    daddiu $sp, $sp, -16
1733; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1734; MIPS64-NEXT:    daddu $1, $1, $25
1735; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1736; MIPS64-NEXT:    sw $4, 12($sp)
1737; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1738; MIPS64-NEXT:  .LBB6_1: # %entry
1739; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1740; MIPS64-NEXT:    ll $2, 0($1)
1741; MIPS64-NEXT:    move $3, $4
1742; MIPS64-NEXT:    sc $3, 0($1)
1743; MIPS64-NEXT:    beqz $3, .LBB6_1
1744; MIPS64-NEXT:    nop
1745; MIPS64-NEXT:  # %bb.2: # %entry
1746; MIPS64-NEXT:    jr $ra
1747; MIPS64-NEXT:    daddiu $sp, $sp, 16
1748;
1749; MIPS64R2-LABEL: AtomicSwap32:
1750; MIPS64R2:       # %bb.0: # %entry
1751; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
1752; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1753; MIPS64R2-NEXT:    daddu $1, $1, $25
1754; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1755; MIPS64R2-NEXT:    sw $4, 12($sp)
1756; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1757; MIPS64R2-NEXT:  .LBB6_1: # %entry
1758; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1759; MIPS64R2-NEXT:    ll $2, 0($1)
1760; MIPS64R2-NEXT:    move $3, $4
1761; MIPS64R2-NEXT:    sc $3, 0($1)
1762; MIPS64R2-NEXT:    beqz $3, .LBB6_1
1763; MIPS64R2-NEXT:    nop
1764; MIPS64R2-NEXT:  # %bb.2: # %entry
1765; MIPS64R2-NEXT:    jr $ra
1766; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
1767;
1768; MIPS64R6-LABEL: AtomicSwap32:
1769; MIPS64R6:       # %bb.0: # %entry
1770; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
1771; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1772; MIPS64R6-NEXT:    daddu $1, $1, $25
1773; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1774; MIPS64R6-NEXT:    sw $4, 12($sp)
1775; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1776; MIPS64R6-NEXT:  .LBB6_1: # %entry
1777; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1778; MIPS64R6-NEXT:    ll $2, 0($1)
1779; MIPS64R6-NEXT:    move $3, $4
1780; MIPS64R6-NEXT:    sc $3, 0($1)
1781; MIPS64R6-NEXT:    beqzc $3, .LBB6_1
1782; MIPS64R6-NEXT:    nop
1783; MIPS64R6-NEXT:  # %bb.2: # %entry
1784; MIPS64R6-NEXT:    jr $ra
1785; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
1786;
1787; MIPS64R6O0-LABEL: AtomicSwap32:
1788; MIPS64R6O0:       # %bb.0: # %entry
1789; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
1790; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1791; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1792; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1793; MIPS64R6O0-NEXT:    move $2, $4
1794; MIPS64R6O0-NEXT:    sw $2, 12($sp)
1795; MIPS64R6O0-NEXT:    lw $2, 12($sp)
1796; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
1797; MIPS64R6O0-NEXT:  .LBB6_1: # %entry
1798; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1799; MIPS64R6O0-NEXT:    ll $3, 0($1)
1800; MIPS64R6O0-NEXT:    move $5, $2
1801; MIPS64R6O0-NEXT:    sc $5, 0($1)
1802; MIPS64R6O0-NEXT:    beqzc $5, .LBB6_1
1803; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1804; MIPS64R6O0-NEXT:    move $2, $3
1805; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
1806; MIPS64R6O0-NEXT:    jrc $ra
1807;
1808; MM32-LABEL: AtomicSwap32:
1809; MM32:       # %bb.0: # %entry
1810; MM32-NEXT:    lui $2, %hi(_gp_disp)
1811; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1812; MM32-NEXT:    addiu $sp, $sp, -8
1813; MM32-NEXT:    addu $2, $2, $25
1814; MM32-NEXT:    sw $4, 4($sp)
1815; MM32-NEXT:    lw $1, %got(x)($2)
1816; MM32-NEXT:  $BB6_1: # %entry
1817; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1818; MM32-NEXT:    ll $2, 0($1)
1819; MM32-NEXT:    move $3, $4
1820; MM32-NEXT:    sc $3, 0($1)
1821; MM32-NEXT:    beqzc $3, $BB6_1
1822; MM32-NEXT:  # %bb.2: # %entry
1823; MM32-NEXT:    addiusp 8
1824; MM32-NEXT:    jrc $ra
1825;
1826; O1-LABEL: AtomicSwap32:
1827; O1:       # %bb.0: # %entry
1828; O1-NEXT:    lui $2, %hi(_gp_disp)
1829; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1830; O1-NEXT:    addiu $sp, $sp, -8
1831; O1-NEXT:    addu $1, $2, $25
1832; O1-NEXT:    sw $4, 4($sp)
1833; O1-NEXT:    lw $1, %got(x)($1)
1834; O1-NEXT:  $BB6_1: # %entry
1835; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1836; O1-NEXT:    ll $2, 0($1)
1837; O1-NEXT:    move $3, $4
1838; O1-NEXT:    sc $3, 0($1)
1839; O1-NEXT:    beqz $3, $BB6_1
1840; O1-NEXT:    nop
1841; O1-NEXT:  # %bb.2: # %entry
1842; O1-NEXT:    jr $ra
1843; O1-NEXT:    addiu $sp, $sp, 8
1844;
1845; O2-LABEL: AtomicSwap32:
1846; O2:       # %bb.0: # %entry
1847; O2-NEXT:    lui $2, %hi(_gp_disp)
1848; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1849; O2-NEXT:    addiu $sp, $sp, -8
1850; O2-NEXT:    addu $1, $2, $25
1851; O2-NEXT:    sw $4, 4($sp)
1852; O2-NEXT:    lw $1, %got(x)($1)
1853; O2-NEXT:  $BB6_1: # %entry
1854; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1855; O2-NEXT:    ll $2, 0($1)
1856; O2-NEXT:    move $3, $4
1857; O2-NEXT:    sc $3, 0($1)
1858; O2-NEXT:    beqz $3, $BB6_1
1859; O2-NEXT:    nop
1860; O2-NEXT:  # %bb.2: # %entry
1861; O2-NEXT:    jr $ra
1862; O2-NEXT:    addiu $sp, $sp, 8
1863;
1864; O3-LABEL: AtomicSwap32:
1865; O3:       # %bb.0: # %entry
1866; O3-NEXT:    lui $2, %hi(_gp_disp)
1867; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1868; O3-NEXT:    addiu $sp, $sp, -8
1869; O3-NEXT:    addu $1, $2, $25
1870; O3-NEXT:    sw $4, 4($sp)
1871; O3-NEXT:    lw $1, %got(x)($1)
1872; O3-NEXT:  $BB6_1: # %entry
1873; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1874; O3-NEXT:    ll $2, 0($1)
1875; O3-NEXT:    move $3, $4
1876; O3-NEXT:    sc $3, 0($1)
1877; O3-NEXT:    beqz $3, $BB6_1
1878; O3-NEXT:    nop
1879; O3-NEXT:  # %bb.2: # %entry
1880; O3-NEXT:    jr $ra
1881; O3-NEXT:    addiu $sp, $sp, 8
1882;
1883; MIPS32EB-LABEL: AtomicSwap32:
1884; MIPS32EB:       # %bb.0: # %entry
1885; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1886; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1887; MIPS32EB-NEXT:    addiu $sp, $sp, -8
1888; MIPS32EB-NEXT:    addu $1, $2, $25
1889; MIPS32EB-NEXT:    sw $4, 4($sp)
1890; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1891; MIPS32EB-NEXT:  $BB6_1: # %entry
1892; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1893; MIPS32EB-NEXT:    ll $2, 0($1)
1894; MIPS32EB-NEXT:    move $3, $4
1895; MIPS32EB-NEXT:    sc $3, 0($1)
1896; MIPS32EB-NEXT:    beqz $3, $BB6_1
1897; MIPS32EB-NEXT:    nop
1898; MIPS32EB-NEXT:  # %bb.2: # %entry
1899; MIPS32EB-NEXT:    jr $ra
1900; MIPS32EB-NEXT:    addiu $sp, $sp, 8
1901entry:
1902  %newval.addr = alloca i32, align 4
1903  store i32 %newval, i32* %newval.addr, align 4
1904  %tmp = load i32, i32* %newval.addr, align 4
1905  %0 = atomicrmw xchg i32* @x, i32 %tmp monotonic
1906  ret i32 %0
1907
1908}
1909
1910define i32 @AtomicCmpSwap32(i32 signext %oldval, i32 signext %newval) nounwind {
1911; MIPS32-LABEL: AtomicCmpSwap32:
1912; MIPS32:       # %bb.0: # %entry
1913; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1914; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1915; MIPS32-NEXT:    addiu $sp, $sp, -8
1916; MIPS32-NEXT:    addu $1, $2, $25
1917; MIPS32-NEXT:    sw $5, 4($sp)
1918; MIPS32-NEXT:    lw $1, %got(x)($1)
1919; MIPS32-NEXT:  $BB7_1: # %entry
1920; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1921; MIPS32-NEXT:    ll $2, 0($1)
1922; MIPS32-NEXT:    bne $2, $4, $BB7_3
1923; MIPS32-NEXT:    nop
1924; MIPS32-NEXT:  # %bb.2: # %entry
1925; MIPS32-NEXT:    # in Loop: Header=BB7_1 Depth=1
1926; MIPS32-NEXT:    move $3, $5
1927; MIPS32-NEXT:    sc $3, 0($1)
1928; MIPS32-NEXT:    beqz $3, $BB7_1
1929; MIPS32-NEXT:    nop
1930; MIPS32-NEXT:  $BB7_3: # %entry
1931; MIPS32-NEXT:    jr $ra
1932; MIPS32-NEXT:    addiu $sp, $sp, 8
1933;
1934; MIPS32O0-LABEL: AtomicCmpSwap32:
1935; MIPS32O0:       # %bb.0: # %entry
1936; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1937; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1938; MIPS32O0-NEXT:    addiu $sp, $sp, -8
1939; MIPS32O0-NEXT:    addu $1, $2, $25
1940; MIPS32O0-NEXT:    sw $5, 4($sp)
1941; MIPS32O0-NEXT:    lw $2, 4($sp)
1942; MIPS32O0-NEXT:    lw $1, %got(x)($1)
1943; MIPS32O0-NEXT:    move $3, $4
1944; MIPS32O0-NEXT:  $BB7_1: # %entry
1945; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1946; MIPS32O0-NEXT:    ll $5, 0($1)
1947; MIPS32O0-NEXT:    bne $5, $3, $BB7_3
1948; MIPS32O0-NEXT:    nop
1949; MIPS32O0-NEXT:  # %bb.2: # %entry
1950; MIPS32O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
1951; MIPS32O0-NEXT:    move $6, $2
1952; MIPS32O0-NEXT:    sc $6, 0($1)
1953; MIPS32O0-NEXT:    beqz $6, $BB7_1
1954; MIPS32O0-NEXT:    nop
1955; MIPS32O0-NEXT:  $BB7_3: # %entry
1956; MIPS32O0-NEXT:    xor $1, $5, $4
1957; MIPS32O0-NEXT:    sltiu $1, $1, 1
1958; MIPS32O0-NEXT:    move $2, $5
1959; MIPS32O0-NEXT:    sw $1, 0($sp) # 4-byte Folded Spill
1960; MIPS32O0-NEXT:    addiu $sp, $sp, 8
1961; MIPS32O0-NEXT:    jr $ra
1962; MIPS32O0-NEXT:    nop
1963;
1964; MIPS32R2-LABEL: AtomicCmpSwap32:
1965; MIPS32R2:       # %bb.0: # %entry
1966; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1967; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1968; MIPS32R2-NEXT:    addiu $sp, $sp, -8
1969; MIPS32R2-NEXT:    addu $1, $2, $25
1970; MIPS32R2-NEXT:    sw $5, 4($sp)
1971; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1972; MIPS32R2-NEXT:  $BB7_1: # %entry
1973; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1974; MIPS32R2-NEXT:    ll $2, 0($1)
1975; MIPS32R2-NEXT:    bne $2, $4, $BB7_3
1976; MIPS32R2-NEXT:    nop
1977; MIPS32R2-NEXT:  # %bb.2: # %entry
1978; MIPS32R2-NEXT:    # in Loop: Header=BB7_1 Depth=1
1979; MIPS32R2-NEXT:    move $3, $5
1980; MIPS32R2-NEXT:    sc $3, 0($1)
1981; MIPS32R2-NEXT:    beqz $3, $BB7_1
1982; MIPS32R2-NEXT:    nop
1983; MIPS32R2-NEXT:  $BB7_3: # %entry
1984; MIPS32R2-NEXT:    jr $ra
1985; MIPS32R2-NEXT:    addiu $sp, $sp, 8
1986;
1987; MIPS32R6-LABEL: AtomicCmpSwap32:
1988; MIPS32R6:       # %bb.0: # %entry
1989; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1990; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1991; MIPS32R6-NEXT:    addiu $sp, $sp, -8
1992; MIPS32R6-NEXT:    addu $1, $2, $25
1993; MIPS32R6-NEXT:    sw $5, 4($sp)
1994; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1995; MIPS32R6-NEXT:  $BB7_1: # %entry
1996; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1997; MIPS32R6-NEXT:    ll $2, 0($1)
1998; MIPS32R6-NEXT:    bnec $2, $4, $BB7_3
1999; MIPS32R6-NEXT:  # %bb.2: # %entry
2000; MIPS32R6-NEXT:    # in Loop: Header=BB7_1 Depth=1
2001; MIPS32R6-NEXT:    move $3, $5
2002; MIPS32R6-NEXT:    sc $3, 0($1)
2003; MIPS32R6-NEXT:    beqzc $3, $BB7_1
2004; MIPS32R6-NEXT:    nop
2005; MIPS32R6-NEXT:  $BB7_3: # %entry
2006; MIPS32R6-NEXT:    jr $ra
2007; MIPS32R6-NEXT:    addiu $sp, $sp, 8
2008;
2009; MIPS32R6O0-LABEL: AtomicCmpSwap32:
2010; MIPS32R6O0:       # %bb.0: # %entry
2011; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
2012; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2013; MIPS32R6O0-NEXT:    addiu $sp, $sp, -16
2014; MIPS32R6O0-NEXT:    addu $1, $2, $25
2015; MIPS32R6O0-NEXT:    move $2, $5
2016; MIPS32R6O0-NEXT:    move $3, $4
2017; MIPS32R6O0-NEXT:    sw $5, 12($sp)
2018; MIPS32R6O0-NEXT:    lw $5, 12($sp)
2019; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
2020; MIPS32R6O0-NEXT:  $BB7_1: # %entry
2021; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2022; MIPS32R6O0-NEXT:    ll $6, 0($1)
2023; MIPS32R6O0-NEXT:    bnec $6, $4, $BB7_3
2024; MIPS32R6O0-NEXT:  # %bb.2: # %entry
2025; MIPS32R6O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
2026; MIPS32R6O0-NEXT:    move $7, $5
2027; MIPS32R6O0-NEXT:    sc $7, 0($1)
2028; MIPS32R6O0-NEXT:    beqzc $7, $BB7_1
2029; MIPS32R6O0-NEXT:  $BB7_3: # %entry
2030; MIPS32R6O0-NEXT:    sw $2, 8($sp) # 4-byte Folded Spill
2031; MIPS32R6O0-NEXT:    move $2, $6
2032; MIPS32R6O0-NEXT:    sw $3, 4($sp) # 4-byte Folded Spill
2033; MIPS32R6O0-NEXT:    addiu $sp, $sp, 16
2034; MIPS32R6O0-NEXT:    jrc $ra
2035;
2036; MIPS4-LABEL: AtomicCmpSwap32:
2037; MIPS4:       # %bb.0: # %entry
2038; MIPS4-NEXT:    daddiu $sp, $sp, -16
2039; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2040; MIPS4-NEXT:    daddu $1, $1, $25
2041; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2042; MIPS4-NEXT:    sw $5, 12($sp)
2043; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
2044; MIPS4-NEXT:  .LBB7_1: # %entry
2045; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2046; MIPS4-NEXT:    ll $2, 0($1)
2047; MIPS4-NEXT:    bne $2, $4, .LBB7_3
2048; MIPS4-NEXT:    nop
2049; MIPS4-NEXT:  # %bb.2: # %entry
2050; MIPS4-NEXT:    # in Loop: Header=BB7_1 Depth=1
2051; MIPS4-NEXT:    move $3, $5
2052; MIPS4-NEXT:    sc $3, 0($1)
2053; MIPS4-NEXT:    beqz $3, .LBB7_1
2054; MIPS4-NEXT:    nop
2055; MIPS4-NEXT:  .LBB7_3: # %entry
2056; MIPS4-NEXT:    jr $ra
2057; MIPS4-NEXT:    daddiu $sp, $sp, 16
2058;
2059; MIPS64-LABEL: AtomicCmpSwap32:
2060; MIPS64:       # %bb.0: # %entry
2061; MIPS64-NEXT:    daddiu $sp, $sp, -16
2062; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2063; MIPS64-NEXT:    daddu $1, $1, $25
2064; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2065; MIPS64-NEXT:    sw $5, 12($sp)
2066; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
2067; MIPS64-NEXT:  .LBB7_1: # %entry
2068; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2069; MIPS64-NEXT:    ll $2, 0($1)
2070; MIPS64-NEXT:    bne $2, $4, .LBB7_3
2071; MIPS64-NEXT:    nop
2072; MIPS64-NEXT:  # %bb.2: # %entry
2073; MIPS64-NEXT:    # in Loop: Header=BB7_1 Depth=1
2074; MIPS64-NEXT:    move $3, $5
2075; MIPS64-NEXT:    sc $3, 0($1)
2076; MIPS64-NEXT:    beqz $3, .LBB7_1
2077; MIPS64-NEXT:    nop
2078; MIPS64-NEXT:  .LBB7_3: # %entry
2079; MIPS64-NEXT:    jr $ra
2080; MIPS64-NEXT:    daddiu $sp, $sp, 16
2081;
2082; MIPS64R2-LABEL: AtomicCmpSwap32:
2083; MIPS64R2:       # %bb.0: # %entry
2084; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
2085; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2086; MIPS64R2-NEXT:    daddu $1, $1, $25
2087; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2088; MIPS64R2-NEXT:    sw $5, 12($sp)
2089; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
2090; MIPS64R2-NEXT:  .LBB7_1: # %entry
2091; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
2092; MIPS64R2-NEXT:    ll $2, 0($1)
2093; MIPS64R2-NEXT:    bne $2, $4, .LBB7_3
2094; MIPS64R2-NEXT:    nop
2095; MIPS64R2-NEXT:  # %bb.2: # %entry
2096; MIPS64R2-NEXT:    # in Loop: Header=BB7_1 Depth=1
2097; MIPS64R2-NEXT:    move $3, $5
2098; MIPS64R2-NEXT:    sc $3, 0($1)
2099; MIPS64R2-NEXT:    beqz $3, .LBB7_1
2100; MIPS64R2-NEXT:    nop
2101; MIPS64R2-NEXT:  .LBB7_3: # %entry
2102; MIPS64R2-NEXT:    jr $ra
2103; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
2104;
2105; MIPS64R6-LABEL: AtomicCmpSwap32:
2106; MIPS64R6:       # %bb.0: # %entry
2107; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
2108; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2109; MIPS64R6-NEXT:    daddu $1, $1, $25
2110; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2111; MIPS64R6-NEXT:    sw $5, 12($sp)
2112; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
2113; MIPS64R6-NEXT:  .LBB7_1: # %entry
2114; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
2115; MIPS64R6-NEXT:    ll $2, 0($1)
2116; MIPS64R6-NEXT:    bnec $2, $4, .LBB7_3
2117; MIPS64R6-NEXT:  # %bb.2: # %entry
2118; MIPS64R6-NEXT:    # in Loop: Header=BB7_1 Depth=1
2119; MIPS64R6-NEXT:    move $3, $5
2120; MIPS64R6-NEXT:    sc $3, 0($1)
2121; MIPS64R6-NEXT:    beqzc $3, .LBB7_1
2122; MIPS64R6-NEXT:    nop
2123; MIPS64R6-NEXT:  .LBB7_3: # %entry
2124; MIPS64R6-NEXT:    jr $ra
2125; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
2126;
2127; MIPS64R6O0-LABEL: AtomicCmpSwap32:
2128; MIPS64R6O0:       # %bb.0: # %entry
2129; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
2130; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2131; MIPS64R6O0-NEXT:    daddu $1, $1, $25
2132; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2133; MIPS64R6O0-NEXT:    move $2, $4
2134; MIPS64R6O0-NEXT:    move $3, $5
2135; MIPS64R6O0-NEXT:    sw $3, 12($sp)
2136; MIPS64R6O0-NEXT:    lw $3, 12($sp)
2137; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
2138; MIPS64R6O0-NEXT:  .LBB7_1: # %entry
2139; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2140; MIPS64R6O0-NEXT:    ll $6, 0($1)
2141; MIPS64R6O0-NEXT:    bnec $6, $2, .LBB7_3
2142; MIPS64R6O0-NEXT:  # %bb.2: # %entry
2143; MIPS64R6O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
2144; MIPS64R6O0-NEXT:    move $7, $3
2145; MIPS64R6O0-NEXT:    sc $7, 0($1)
2146; MIPS64R6O0-NEXT:    beqzc $7, .LBB7_1
2147; MIPS64R6O0-NEXT:  .LBB7_3: # %entry
2148; MIPS64R6O0-NEXT:    move $2, $6
2149; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
2150; MIPS64R6O0-NEXT:    jrc $ra
2151;
2152; MM32-LABEL: AtomicCmpSwap32:
2153; MM32:       # %bb.0: # %entry
2154; MM32-NEXT:    lui $2, %hi(_gp_disp)
2155; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2156; MM32-NEXT:    addiu $sp, $sp, -8
2157; MM32-NEXT:    addu $2, $2, $25
2158; MM32-NEXT:    sw $5, 4($sp)
2159; MM32-NEXT:    lw $1, %got(x)($2)
2160; MM32-NEXT:  $BB7_1: # %entry
2161; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
2162; MM32-NEXT:    ll $2, 0($1)
2163; MM32-NEXT:    bne $2, $4, $BB7_3
2164; MM32-NEXT:    nop
2165; MM32-NEXT:  # %bb.2: # %entry
2166; MM32-NEXT:    # in Loop: Header=BB7_1 Depth=1
2167; MM32-NEXT:    move $3, $5
2168; MM32-NEXT:    sc $3, 0($1)
2169; MM32-NEXT:    beqzc $3, $BB7_1
2170; MM32-NEXT:  $BB7_3: # %entry
2171; MM32-NEXT:    addiusp 8
2172; MM32-NEXT:    jrc $ra
2173;
2174; O1-LABEL: AtomicCmpSwap32:
2175; O1:       # %bb.0: # %entry
2176; O1-NEXT:    lui $2, %hi(_gp_disp)
2177; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
2178; O1-NEXT:    addiu $sp, $sp, -8
2179; O1-NEXT:    addu $1, $2, $25
2180; O1-NEXT:    sw $5, 4($sp)
2181; O1-NEXT:    lw $1, %got(x)($1)
2182; O1-NEXT:  $BB7_1: # %entry
2183; O1-NEXT:    # =>This Inner Loop Header: Depth=1
2184; O1-NEXT:    ll $2, 0($1)
2185; O1-NEXT:    bne $2, $4, $BB7_3
2186; O1-NEXT:    nop
2187; O1-NEXT:  # %bb.2: # %entry
2188; O1-NEXT:    # in Loop: Header=BB7_1 Depth=1
2189; O1-NEXT:    move $3, $5
2190; O1-NEXT:    sc $3, 0($1)
2191; O1-NEXT:    beqz $3, $BB7_1
2192; O1-NEXT:    nop
2193; O1-NEXT:  $BB7_3: # %entry
2194; O1-NEXT:    jr $ra
2195; O1-NEXT:    addiu $sp, $sp, 8
2196;
2197; O2-LABEL: AtomicCmpSwap32:
2198; O2:       # %bb.0: # %entry
2199; O2-NEXT:    lui $2, %hi(_gp_disp)
2200; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2201; O2-NEXT:    addiu $sp, $sp, -8
2202; O2-NEXT:    addu $1, $2, $25
2203; O2-NEXT:    sw $5, 4($sp)
2204; O2-NEXT:    lw $1, %got(x)($1)
2205; O2-NEXT:  $BB7_1: # %entry
2206; O2-NEXT:    # =>This Inner Loop Header: Depth=1
2207; O2-NEXT:    ll $2, 0($1)
2208; O2-NEXT:    bne $2, $4, $BB7_3
2209; O2-NEXT:    nop
2210; O2-NEXT:  # %bb.2: # %entry
2211; O2-NEXT:    # in Loop: Header=BB7_1 Depth=1
2212; O2-NEXT:    move $3, $5
2213; O2-NEXT:    sc $3, 0($1)
2214; O2-NEXT:    beqz $3, $BB7_1
2215; O2-NEXT:    nop
2216; O2-NEXT:  $BB7_3: # %entry
2217; O2-NEXT:    jr $ra
2218; O2-NEXT:    addiu $sp, $sp, 8
2219;
2220; O3-LABEL: AtomicCmpSwap32:
2221; O3:       # %bb.0: # %entry
2222; O3-NEXT:    lui $2, %hi(_gp_disp)
2223; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
2224; O3-NEXT:    addiu $sp, $sp, -8
2225; O3-NEXT:    addu $1, $2, $25
2226; O3-NEXT:    sw $5, 4($sp)
2227; O3-NEXT:    lw $1, %got(x)($1)
2228; O3-NEXT:  $BB7_1: # %entry
2229; O3-NEXT:    # =>This Inner Loop Header: Depth=1
2230; O3-NEXT:    ll $2, 0($1)
2231; O3-NEXT:    bne $2, $4, $BB7_3
2232; O3-NEXT:    nop
2233; O3-NEXT:  # %bb.2: # %entry
2234; O3-NEXT:    # in Loop: Header=BB7_1 Depth=1
2235; O3-NEXT:    move $3, $5
2236; O3-NEXT:    sc $3, 0($1)
2237; O3-NEXT:    beqz $3, $BB7_1
2238; O3-NEXT:    nop
2239; O3-NEXT:  $BB7_3: # %entry
2240; O3-NEXT:    jr $ra
2241; O3-NEXT:    addiu $sp, $sp, 8
2242;
2243; MIPS32EB-LABEL: AtomicCmpSwap32:
2244; MIPS32EB:       # %bb.0: # %entry
2245; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
2246; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
2247; MIPS32EB-NEXT:    addiu $sp, $sp, -8
2248; MIPS32EB-NEXT:    addu $1, $2, $25
2249; MIPS32EB-NEXT:    sw $5, 4($sp)
2250; MIPS32EB-NEXT:    lw $1, %got(x)($1)
2251; MIPS32EB-NEXT:  $BB7_1: # %entry
2252; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
2253; MIPS32EB-NEXT:    ll $2, 0($1)
2254; MIPS32EB-NEXT:    bne $2, $4, $BB7_3
2255; MIPS32EB-NEXT:    nop
2256; MIPS32EB-NEXT:  # %bb.2: # %entry
2257; MIPS32EB-NEXT:    # in Loop: Header=BB7_1 Depth=1
2258; MIPS32EB-NEXT:    move $3, $5
2259; MIPS32EB-NEXT:    sc $3, 0($1)
2260; MIPS32EB-NEXT:    beqz $3, $BB7_1
2261; MIPS32EB-NEXT:    nop
2262; MIPS32EB-NEXT:  $BB7_3: # %entry
2263; MIPS32EB-NEXT:    jr $ra
2264; MIPS32EB-NEXT:    addiu $sp, $sp, 8
2265entry:
2266  %newval.addr = alloca i32, align 4
2267  store i32 %newval, i32* %newval.addr, align 4
2268  %tmp = load i32, i32* %newval.addr, align 4
2269  %0 = cmpxchg i32* @x, i32 %oldval, i32 %tmp monotonic monotonic
2270  %1 = extractvalue { i32, i1 } %0, 0
2271  ret i32 %1
2272
2273}
2274
2275@y = common global i8 0, align 1
2276
2277define signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind {
2278; MIPS32-LABEL: AtomicLoadAdd8:
2279; MIPS32:       # %bb.0: # %entry
2280; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
2281; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2282; MIPS32-NEXT:    addu $1, $2, $25
2283; MIPS32-NEXT:    lw $1, %got(y)($1)
2284; MIPS32-NEXT:    addiu $2, $zero, -4
2285; MIPS32-NEXT:    and $2, $1, $2
2286; MIPS32-NEXT:    andi $1, $1, 3
2287; MIPS32-NEXT:    sll $3, $1, 3
2288; MIPS32-NEXT:    ori $1, $zero, 255
2289; MIPS32-NEXT:    sllv $5, $1, $3
2290; MIPS32-NEXT:    nor $6, $zero, $5
2291; MIPS32-NEXT:    sllv $4, $4, $3
2292; MIPS32-NEXT:  $BB8_1: # %entry
2293; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
2294; MIPS32-NEXT:    ll $7, 0($2)
2295; MIPS32-NEXT:    addu $8, $7, $4
2296; MIPS32-NEXT:    and $8, $8, $5
2297; MIPS32-NEXT:    and $9, $7, $6
2298; MIPS32-NEXT:    or $9, $9, $8
2299; MIPS32-NEXT:    sc $9, 0($2)
2300; MIPS32-NEXT:    beqz $9, $BB8_1
2301; MIPS32-NEXT:    nop
2302; MIPS32-NEXT:  # %bb.2: # %entry
2303; MIPS32-NEXT:    and $1, $7, $5
2304; MIPS32-NEXT:    srlv $1, $1, $3
2305; MIPS32-NEXT:    sll $1, $1, 24
2306; MIPS32-NEXT:    sra $1, $1, 24
2307; MIPS32-NEXT:  # %bb.3: # %entry
2308; MIPS32-NEXT:    sll $1, $1, 24
2309; MIPS32-NEXT:    jr $ra
2310; MIPS32-NEXT:    sra $2, $1, 24
2311;
2312; MIPS32O0-LABEL: AtomicLoadAdd8:
2313; MIPS32O0:       # %bb.0: # %entry
2314; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
2315; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2316; MIPS32O0-NEXT:    addiu $sp, $sp, -8
2317; MIPS32O0-NEXT:    addu $1, $2, $25
2318; MIPS32O0-NEXT:    lw $1, %got(y)($1)
2319; MIPS32O0-NEXT:    addiu $2, $zero, -4
2320; MIPS32O0-NEXT:    and $2, $1, $2
2321; MIPS32O0-NEXT:    andi $1, $1, 3
2322; MIPS32O0-NEXT:    sll $1, $1, 3
2323; MIPS32O0-NEXT:    ori $3, $zero, 255
2324; MIPS32O0-NEXT:    sllv $3, $3, $1
2325; MIPS32O0-NEXT:    nor $5, $zero, $3
2326; MIPS32O0-NEXT:    sllv $4, $4, $1
2327; MIPS32O0-NEXT:  $BB8_1: # %entry
2328; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
2329; MIPS32O0-NEXT:    ll $7, 0($2)
2330; MIPS32O0-NEXT:    addu $8, $7, $4
2331; MIPS32O0-NEXT:    and $8, $8, $3
2332; MIPS32O0-NEXT:    and $9, $7, $5
2333; MIPS32O0-NEXT:    or $9, $9, $8
2334; MIPS32O0-NEXT:    sc $9, 0($2)
2335; MIPS32O0-NEXT:    beqz $9, $BB8_1
2336; MIPS32O0-NEXT:    nop
2337; MIPS32O0-NEXT:  # %bb.2: # %entry
2338; MIPS32O0-NEXT:    and $6, $7, $3
2339; MIPS32O0-NEXT:    srlv $6, $6, $1
2340; MIPS32O0-NEXT:    sll $6, $6, 24
2341; MIPS32O0-NEXT:    sra $6, $6, 24
2342; MIPS32O0-NEXT:  # %bb.3: # %entry
2343; MIPS32O0-NEXT:    sw $6, 4($sp) # 4-byte Folded Spill
2344; MIPS32O0-NEXT:  # %bb.4: # %entry
2345; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2346; MIPS32O0-NEXT:    sll $2, $1, 24
2347; MIPS32O0-NEXT:    sra $2, $2, 24
2348; MIPS32O0-NEXT:    addiu $sp, $sp, 8
2349; MIPS32O0-NEXT:    jr $ra
2350; MIPS32O0-NEXT:    nop
2351;
2352; MIPS32R2-LABEL: AtomicLoadAdd8:
2353; MIPS32R2:       # %bb.0: # %entry
2354; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
2355; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2356; MIPS32R2-NEXT:    addu $1, $2, $25
2357; MIPS32R2-NEXT:    lw $1, %got(y)($1)
2358; MIPS32R2-NEXT:    addiu $2, $zero, -4
2359; MIPS32R2-NEXT:    and $2, $1, $2
2360; MIPS32R2-NEXT:    andi $1, $1, 3
2361; MIPS32R2-NEXT:    sll $3, $1, 3
2362; MIPS32R2-NEXT:    ori $1, $zero, 255
2363; MIPS32R2-NEXT:    sllv $5, $1, $3
2364; MIPS32R2-NEXT:    nor $6, $zero, $5
2365; MIPS32R2-NEXT:    sllv $4, $4, $3
2366; MIPS32R2-NEXT:  $BB8_1: # %entry
2367; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
2368; MIPS32R2-NEXT:    ll $7, 0($2)
2369; MIPS32R2-NEXT:    addu $8, $7, $4
2370; MIPS32R2-NEXT:    and $8, $8, $5
2371; MIPS32R2-NEXT:    and $9, $7, $6
2372; MIPS32R2-NEXT:    or $9, $9, $8
2373; MIPS32R2-NEXT:    sc $9, 0($2)
2374; MIPS32R2-NEXT:    beqz $9, $BB8_1
2375; MIPS32R2-NEXT:    nop
2376; MIPS32R2-NEXT:  # %bb.2: # %entry
2377; MIPS32R2-NEXT:    and $1, $7, $5
2378; MIPS32R2-NEXT:    srlv $1, $1, $3
2379; MIPS32R2-NEXT:    seb $1, $1
2380; MIPS32R2-NEXT:  # %bb.3: # %entry
2381; MIPS32R2-NEXT:    jr $ra
2382; MIPS32R2-NEXT:    seb $2, $1
2383;
2384; MIPS32R6-LABEL: AtomicLoadAdd8:
2385; MIPS32R6:       # %bb.0: # %entry
2386; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
2387; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
2388; MIPS32R6-NEXT:    addu $1, $2, $25
2389; MIPS32R6-NEXT:    lw $1, %got(y)($1)
2390; MIPS32R6-NEXT:    addiu $2, $zero, -4
2391; MIPS32R6-NEXT:    and $2, $1, $2
2392; MIPS32R6-NEXT:    andi $1, $1, 3
2393; MIPS32R6-NEXT:    sll $3, $1, 3
2394; MIPS32R6-NEXT:    ori $1, $zero, 255
2395; MIPS32R6-NEXT:    sllv $5, $1, $3
2396; MIPS32R6-NEXT:    nor $6, $zero, $5
2397; MIPS32R6-NEXT:    sllv $4, $4, $3
2398; MIPS32R6-NEXT:  $BB8_1: # %entry
2399; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
2400; MIPS32R6-NEXT:    ll $7, 0($2)
2401; MIPS32R6-NEXT:    addu $8, $7, $4
2402; MIPS32R6-NEXT:    and $8, $8, $5
2403; MIPS32R6-NEXT:    and $9, $7, $6
2404; MIPS32R6-NEXT:    or $9, $9, $8
2405; MIPS32R6-NEXT:    sc $9, 0($2)
2406; MIPS32R6-NEXT:    beqzc $9, $BB8_1
2407; MIPS32R6-NEXT:  # %bb.2: # %entry
2408; MIPS32R6-NEXT:    and $1, $7, $5
2409; MIPS32R6-NEXT:    srlv $1, $1, $3
2410; MIPS32R6-NEXT:    seb $1, $1
2411; MIPS32R6-NEXT:  # %bb.3: # %entry
2412; MIPS32R6-NEXT:    jr $ra
2413; MIPS32R6-NEXT:    seb $2, $1
2414;
2415; MIPS32R6O0-LABEL: AtomicLoadAdd8:
2416; MIPS32R6O0:       # %bb.0: # %entry
2417; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
2418; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2419; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
2420; MIPS32R6O0-NEXT:    addu $1, $2, $25
2421; MIPS32R6O0-NEXT:    move $2, $4
2422; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
2423; MIPS32R6O0-NEXT:    addiu $3, $zero, -4
2424; MIPS32R6O0-NEXT:    and $3, $1, $3
2425; MIPS32R6O0-NEXT:    andi $1, $1, 3
2426; MIPS32R6O0-NEXT:    sll $1, $1, 3
2427; MIPS32R6O0-NEXT:    ori $5, $zero, 255
2428; MIPS32R6O0-NEXT:    sllv $5, $5, $1
2429; MIPS32R6O0-NEXT:    nor $6, $zero, $5
2430; MIPS32R6O0-NEXT:    sllv $4, $4, $1
2431; MIPS32R6O0-NEXT:  $BB8_1: # %entry
2432; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2433; MIPS32R6O0-NEXT:    ll $8, 0($3)
2434; MIPS32R6O0-NEXT:    addu $9, $8, $4
2435; MIPS32R6O0-NEXT:    and $9, $9, $5
2436; MIPS32R6O0-NEXT:    and $10, $8, $6
2437; MIPS32R6O0-NEXT:    or $10, $10, $9
2438; MIPS32R6O0-NEXT:    sc $10, 0($3)
2439; MIPS32R6O0-NEXT:    beqzc $10, $BB8_1
2440; MIPS32R6O0-NEXT:  # %bb.2: # %entry
2441; MIPS32R6O0-NEXT:    and $7, $8, $5
2442; MIPS32R6O0-NEXT:    srlv $7, $7, $1
2443; MIPS32R6O0-NEXT:    seb $7, $7
2444; MIPS32R6O0-NEXT:  # %bb.3: # %entry
2445; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
2446; MIPS32R6O0-NEXT:    sw $7, 0($sp) # 4-byte Folded Spill
2447; MIPS32R6O0-NEXT:  # %bb.4: # %entry
2448; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
2449; MIPS32R6O0-NEXT:    seb $2, $1
2450; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
2451; MIPS32R6O0-NEXT:    jrc $ra
2452;
2453; MIPS4-LABEL: AtomicLoadAdd8:
2454; MIPS4:       # %bb.0: # %entry
2455; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2456; MIPS4-NEXT:    daddu $1, $1, $25
2457; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2458; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
2459; MIPS4-NEXT:    daddiu $2, $zero, -4
2460; MIPS4-NEXT:    and $2, $1, $2
2461; MIPS4-NEXT:    andi $1, $1, 3
2462; MIPS4-NEXT:    sll $3, $1, 3
2463; MIPS4-NEXT:    ori $1, $zero, 255
2464; MIPS4-NEXT:    sllv $5, $1, $3
2465; MIPS4-NEXT:    nor $6, $zero, $5
2466; MIPS4-NEXT:    sllv $4, $4, $3
2467; MIPS4-NEXT:  .LBB8_1: # %entry
2468; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2469; MIPS4-NEXT:    ll $7, 0($2)
2470; MIPS4-NEXT:    addu $8, $7, $4
2471; MIPS4-NEXT:    and $8, $8, $5
2472; MIPS4-NEXT:    and $9, $7, $6
2473; MIPS4-NEXT:    or $9, $9, $8
2474; MIPS4-NEXT:    sc $9, 0($2)
2475; MIPS4-NEXT:    beqz $9, .LBB8_1
2476; MIPS4-NEXT:    nop
2477; MIPS4-NEXT:  # %bb.2: # %entry
2478; MIPS4-NEXT:    and $1, $7, $5
2479; MIPS4-NEXT:    srlv $1, $1, $3
2480; MIPS4-NEXT:    sll $1, $1, 24
2481; MIPS4-NEXT:    sra $1, $1, 24
2482; MIPS4-NEXT:  # %bb.3: # %entry
2483; MIPS4-NEXT:    sll $1, $1, 24
2484; MIPS4-NEXT:    jr $ra
2485; MIPS4-NEXT:    sra $2, $1, 24
2486;
2487; MIPS64-LABEL: AtomicLoadAdd8:
2488; MIPS64:       # %bb.0: # %entry
2489; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2490; MIPS64-NEXT:    daddu $1, $1, $25
2491; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2492; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
2493; MIPS64-NEXT:    daddiu $2, $zero, -4
2494; MIPS64-NEXT:    and $2, $1, $2
2495; MIPS64-NEXT:    andi $1, $1, 3
2496; MIPS64-NEXT:    sll $3, $1, 3
2497; MIPS64-NEXT:    ori $1, $zero, 255
2498; MIPS64-NEXT:    sllv $5, $1, $3
2499; MIPS64-NEXT:    nor $6, $zero, $5
2500; MIPS64-NEXT:    sllv $4, $4, $3
2501; MIPS64-NEXT:  .LBB8_1: # %entry
2502; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2503; MIPS64-NEXT:    ll $7, 0($2)
2504; MIPS64-NEXT:    addu $8, $7, $4
2505; MIPS64-NEXT:    and $8, $8, $5
2506; MIPS64-NEXT:    and $9, $7, $6
2507; MIPS64-NEXT:    or $9, $9, $8
2508; MIPS64-NEXT:    sc $9, 0($2)
2509; MIPS64-NEXT:    beqz $9, .LBB8_1
2510; MIPS64-NEXT:    nop
2511; MIPS64-NEXT:  # %bb.2: # %entry
2512; MIPS64-NEXT:    and $1, $7, $5
2513; MIPS64-NEXT:    srlv $1, $1, $3
2514; MIPS64-NEXT:    sll $1, $1, 24
2515; MIPS64-NEXT:    sra $1, $1, 24
2516; MIPS64-NEXT:  # %bb.3: # %entry
2517; MIPS64-NEXT:    sll $1, $1, 24
2518; MIPS64-NEXT:    jr $ra
2519; MIPS64-NEXT:    sra $2, $1, 24
2520;
2521; MIPS64R2-LABEL: AtomicLoadAdd8:
2522; MIPS64R2:       # %bb.0: # %entry
2523; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2524; MIPS64R2-NEXT:    daddu $1, $1, $25
2525; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2526; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
2527; MIPS64R2-NEXT:    daddiu $2, $zero, -4
2528; MIPS64R2-NEXT:    and $2, $1, $2
2529; MIPS64R2-NEXT:    andi $1, $1, 3
2530; MIPS64R2-NEXT:    sll $3, $1, 3
2531; MIPS64R2-NEXT:    ori $1, $zero, 255
2532; MIPS64R2-NEXT:    sllv $5, $1, $3
2533; MIPS64R2-NEXT:    nor $6, $zero, $5
2534; MIPS64R2-NEXT:    sllv $4, $4, $3
2535; MIPS64R2-NEXT:  .LBB8_1: # %entry
2536; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
2537; MIPS64R2-NEXT:    ll $7, 0($2)
2538; MIPS64R2-NEXT:    addu $8, $7, $4
2539; MIPS64R2-NEXT:    and $8, $8, $5
2540; MIPS64R2-NEXT:    and $9, $7, $6
2541; MIPS64R2-NEXT:    or $9, $9, $8
2542; MIPS64R2-NEXT:    sc $9, 0($2)
2543; MIPS64R2-NEXT:    beqz $9, .LBB8_1
2544; MIPS64R2-NEXT:    nop
2545; MIPS64R2-NEXT:  # %bb.2: # %entry
2546; MIPS64R2-NEXT:    and $1, $7, $5
2547; MIPS64R2-NEXT:    srlv $1, $1, $3
2548; MIPS64R2-NEXT:    seb $1, $1
2549; MIPS64R2-NEXT:  # %bb.3: # %entry
2550; MIPS64R2-NEXT:    jr $ra
2551; MIPS64R2-NEXT:    seb $2, $1
2552;
2553; MIPS64R6-LABEL: AtomicLoadAdd8:
2554; MIPS64R6:       # %bb.0: # %entry
2555; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2556; MIPS64R6-NEXT:    daddu $1, $1, $25
2557; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2558; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
2559; MIPS64R6-NEXT:    daddiu $2, $zero, -4
2560; MIPS64R6-NEXT:    and $2, $1, $2
2561; MIPS64R6-NEXT:    andi $1, $1, 3
2562; MIPS64R6-NEXT:    sll $3, $1, 3
2563; MIPS64R6-NEXT:    ori $1, $zero, 255
2564; MIPS64R6-NEXT:    sllv $5, $1, $3
2565; MIPS64R6-NEXT:    nor $6, $zero, $5
2566; MIPS64R6-NEXT:    sllv $4, $4, $3
2567; MIPS64R6-NEXT:  .LBB8_1: # %entry
2568; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
2569; MIPS64R6-NEXT:    ll $7, 0($2)
2570; MIPS64R6-NEXT:    addu $8, $7, $4
2571; MIPS64R6-NEXT:    and $8, $8, $5
2572; MIPS64R6-NEXT:    and $9, $7, $6
2573; MIPS64R6-NEXT:    or $9, $9, $8
2574; MIPS64R6-NEXT:    sc $9, 0($2)
2575; MIPS64R6-NEXT:    beqzc $9, .LBB8_1
2576; MIPS64R6-NEXT:  # %bb.2: # %entry
2577; MIPS64R6-NEXT:    and $1, $7, $5
2578; MIPS64R6-NEXT:    srlv $1, $1, $3
2579; MIPS64R6-NEXT:    seb $1, $1
2580; MIPS64R6-NEXT:  # %bb.3: # %entry
2581; MIPS64R6-NEXT:    jr $ra
2582; MIPS64R6-NEXT:    seb $2, $1
2583;
2584; MIPS64R6O0-LABEL: AtomicLoadAdd8:
2585; MIPS64R6O0:       # %bb.0: # %entry
2586; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
2587; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2588; MIPS64R6O0-NEXT:    daddu $1, $1, $25
2589; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2590; MIPS64R6O0-NEXT:    move $2, $4
2591; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
2592; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
2593; MIPS64R6O0-NEXT:    and $3, $1, $3
2594; MIPS64R6O0-NEXT:    andi $5, $1, 3
2595; MIPS64R6O0-NEXT:    xori $5, $5, 3
2596; MIPS64R6O0-NEXT:    sll $5, $5, 3
2597; MIPS64R6O0-NEXT:    ori $6, $zero, 255
2598; MIPS64R6O0-NEXT:    sllv $6, $6, $5
2599; MIPS64R6O0-NEXT:    nor $7, $zero, $6
2600; MIPS64R6O0-NEXT:    sllv $2, $2, $5
2601; MIPS64R6O0-NEXT:  .LBB8_1: # %entry
2602; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2603; MIPS64R6O0-NEXT:    ll $9, 0($3)
2604; MIPS64R6O0-NEXT:    addu $10, $9, $2
2605; MIPS64R6O0-NEXT:    and $10, $10, $6
2606; MIPS64R6O0-NEXT:    and $11, $9, $7
2607; MIPS64R6O0-NEXT:    or $11, $11, $10
2608; MIPS64R6O0-NEXT:    sc $11, 0($3)
2609; MIPS64R6O0-NEXT:    beqzc $11, .LBB8_1
2610; MIPS64R6O0-NEXT:  # %bb.2: # %entry
2611; MIPS64R6O0-NEXT:    and $8, $9, $6
2612; MIPS64R6O0-NEXT:    srlv $8, $8, $5
2613; MIPS64R6O0-NEXT:    seb $8, $8
2614; MIPS64R6O0-NEXT:  # %bb.3: # %entry
2615; MIPS64R6O0-NEXT:    sw $8, 12($sp) # 4-byte Folded Spill
2616; MIPS64R6O0-NEXT:  # %bb.4: # %entry
2617; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
2618; MIPS64R6O0-NEXT:    seb $2, $1
2619; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
2620; MIPS64R6O0-NEXT:    jrc $ra
2621;
2622; MM32-LABEL: AtomicLoadAdd8:
2623; MM32:       # %bb.0: # %entry
2624; MM32-NEXT:    lui $2, %hi(_gp_disp)
2625; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2626; MM32-NEXT:    addu $2, $2, $25
2627; MM32-NEXT:    lw $1, %got(y)($2)
2628; MM32-NEXT:    addiu $2, $zero, -4
2629; MM32-NEXT:    and $2, $1, $2
2630; MM32-NEXT:    andi $1, $1, 3
2631; MM32-NEXT:    sll $3, $1, 3
2632; MM32-NEXT:    ori $1, $zero, 255
2633; MM32-NEXT:    sllv $5, $1, $3
2634; MM32-NEXT:    nor $6, $zero, $5
2635; MM32-NEXT:    sllv $4, $4, $3
2636; MM32-NEXT:  $BB8_1: # %entry
2637; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
2638; MM32-NEXT:    ll $7, 0($2)
2639; MM32-NEXT:    addu $8, $7, $4
2640; MM32-NEXT:    and $8, $8, $5
2641; MM32-NEXT:    and $9, $7, $6
2642; MM32-NEXT:    or $9, $9, $8
2643; MM32-NEXT:    sc $9, 0($2)
2644; MM32-NEXT:    beqzc $9, $BB8_1
2645; MM32-NEXT:  # %bb.2: # %entry
2646; MM32-NEXT:    and $1, $7, $5
2647; MM32-NEXT:    srlv $1, $1, $3
2648; MM32-NEXT:    seb $1, $1
2649; MM32-NEXT:  # %bb.3: # %entry
2650; MM32-NEXT:    jr $ra
2651; MM32-NEXT:    seb $2, $1
2652;
2653; O1-LABEL: AtomicLoadAdd8:
2654; O1:       # %bb.0: # %entry
2655; O1-NEXT:    lui $2, %hi(_gp_disp)
2656; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
2657; O1-NEXT:    addu $1, $2, $25
2658; O1-NEXT:    lw $1, %got(y)($1)
2659; O1-NEXT:    addiu $2, $zero, -4
2660; O1-NEXT:    and $2, $1, $2
2661; O1-NEXT:    andi $1, $1, 3
2662; O1-NEXT:    sll $3, $1, 3
2663; O1-NEXT:    ori $1, $zero, 255
2664; O1-NEXT:    sllv $5, $1, $3
2665; O1-NEXT:    nor $6, $zero, $5
2666; O1-NEXT:    sllv $4, $4, $3
2667; O1-NEXT:  $BB8_1: # %entry
2668; O1-NEXT:    # =>This Inner Loop Header: Depth=1
2669; O1-NEXT:    ll $7, 0($2)
2670; O1-NEXT:    addu $8, $7, $4
2671; O1-NEXT:    and $8, $8, $5
2672; O1-NEXT:    and $9, $7, $6
2673; O1-NEXT:    or $9, $9, $8
2674; O1-NEXT:    sc $9, 0($2)
2675; O1-NEXT:    beqz $9, $BB8_1
2676; O1-NEXT:    nop
2677; O1-NEXT:  # %bb.2: # %entry
2678; O1-NEXT:    and $1, $7, $5
2679; O1-NEXT:    srlv $1, $1, $3
2680; O1-NEXT:    sll $1, $1, 24
2681; O1-NEXT:    sra $1, $1, 24
2682; O1-NEXT:  # %bb.3: # %entry
2683; O1-NEXT:    sll $1, $1, 24
2684; O1-NEXT:    jr $ra
2685; O1-NEXT:    sra $2, $1, 24
2686;
2687; O2-LABEL: AtomicLoadAdd8:
2688; O2:       # %bb.0: # %entry
2689; O2-NEXT:    lui $2, %hi(_gp_disp)
2690; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2691; O2-NEXT:    addu $1, $2, $25
2692; O2-NEXT:    lw $1, %got(y)($1)
2693; O2-NEXT:    addiu $2, $zero, -4
2694; O2-NEXT:    and $2, $1, $2
2695; O2-NEXT:    andi $1, $1, 3
2696; O2-NEXT:    sll $3, $1, 3
2697; O2-NEXT:    ori $1, $zero, 255
2698; O2-NEXT:    sllv $5, $1, $3
2699; O2-NEXT:    nor $6, $zero, $5
2700; O2-NEXT:    sllv $4, $4, $3
2701; O2-NEXT:  $BB8_1: # %entry
2702; O2-NEXT:    # =>This Inner Loop Header: Depth=1
2703; O2-NEXT:    ll $7, 0($2)
2704; O2-NEXT:    addu $8, $7, $4
2705; O2-NEXT:    and $8, $8, $5
2706; O2-NEXT:    and $9, $7, $6
2707; O2-NEXT:    or $9, $9, $8
2708; O2-NEXT:    sc $9, 0($2)
2709; O2-NEXT:    beqz $9, $BB8_1
2710; O2-NEXT:    nop
2711; O2-NEXT:  # %bb.2: # %entry
2712; O2-NEXT:    and $1, $7, $5
2713; O2-NEXT:    srlv $1, $1, $3
2714; O2-NEXT:    sll $1, $1, 24
2715; O2-NEXT:    sra $1, $1, 24
2716; O2-NEXT:  # %bb.3: # %entry
2717; O2-NEXT:    sll $1, $1, 24
2718; O2-NEXT:    jr $ra
2719; O2-NEXT:    sra $2, $1, 24
2720;
2721; O3-LABEL: AtomicLoadAdd8:
2722; O3:       # %bb.0: # %entry
2723; O3-NEXT:    lui $2, %hi(_gp_disp)
2724; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
2725; O3-NEXT:    addu $1, $2, $25
2726; O3-NEXT:    addiu $2, $zero, -4
2727; O3-NEXT:    lw $1, %got(y)($1)
2728; O3-NEXT:    and $2, $1, $2
2729; O3-NEXT:    andi $1, $1, 3
2730; O3-NEXT:    sll $3, $1, 3
2731; O3-NEXT:    ori $1, $zero, 255
2732; O3-NEXT:    sllv $5, $1, $3
2733; O3-NEXT:    sllv $4, $4, $3
2734; O3-NEXT:    nor $6, $zero, $5
2735; O3-NEXT:  $BB8_1: # %entry
2736; O3-NEXT:    # =>This Inner Loop Header: Depth=1
2737; O3-NEXT:    ll $7, 0($2)
2738; O3-NEXT:    addu $8, $7, $4
2739; O3-NEXT:    and $8, $8, $5
2740; O3-NEXT:    and $9, $7, $6
2741; O3-NEXT:    or $9, $9, $8
2742; O3-NEXT:    sc $9, 0($2)
2743; O3-NEXT:    beqz $9, $BB8_1
2744; O3-NEXT:    nop
2745; O3-NEXT:  # %bb.2: # %entry
2746; O3-NEXT:    and $1, $7, $5
2747; O3-NEXT:    srlv $1, $1, $3
2748; O3-NEXT:    sll $1, $1, 24
2749; O3-NEXT:    sra $1, $1, 24
2750; O3-NEXT:  # %bb.3: # %entry
2751; O3-NEXT:    sll $1, $1, 24
2752; O3-NEXT:    jr $ra
2753; O3-NEXT:    sra $2, $1, 24
2754;
2755; MIPS32EB-LABEL: AtomicLoadAdd8:
2756; MIPS32EB:       # %bb.0: # %entry
2757; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
2758; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
2759; MIPS32EB-NEXT:    addu $1, $2, $25
2760; MIPS32EB-NEXT:    lw $1, %got(y)($1)
2761; MIPS32EB-NEXT:    addiu $2, $zero, -4
2762; MIPS32EB-NEXT:    and $2, $1, $2
2763; MIPS32EB-NEXT:    andi $1, $1, 3
2764; MIPS32EB-NEXT:    xori $1, $1, 3
2765; MIPS32EB-NEXT:    sll $3, $1, 3
2766; MIPS32EB-NEXT:    ori $1, $zero, 255
2767; MIPS32EB-NEXT:    sllv $5, $1, $3
2768; MIPS32EB-NEXT:    nor $6, $zero, $5
2769; MIPS32EB-NEXT:    sllv $4, $4, $3
2770; MIPS32EB-NEXT:  $BB8_1: # %entry
2771; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
2772; MIPS32EB-NEXT:    ll $7, 0($2)
2773; MIPS32EB-NEXT:    addu $8, $7, $4
2774; MIPS32EB-NEXT:    and $8, $8, $5
2775; MIPS32EB-NEXT:    and $9, $7, $6
2776; MIPS32EB-NEXT:    or $9, $9, $8
2777; MIPS32EB-NEXT:    sc $9, 0($2)
2778; MIPS32EB-NEXT:    beqz $9, $BB8_1
2779; MIPS32EB-NEXT:    nop
2780; MIPS32EB-NEXT:  # %bb.2: # %entry
2781; MIPS32EB-NEXT:    and $1, $7, $5
2782; MIPS32EB-NEXT:    srlv $1, $1, $3
2783; MIPS32EB-NEXT:    sll $1, $1, 24
2784; MIPS32EB-NEXT:    sra $1, $1, 24
2785; MIPS32EB-NEXT:  # %bb.3: # %entry
2786; MIPS32EB-NEXT:    sll $1, $1, 24
2787; MIPS32EB-NEXT:    jr $ra
2788; MIPS32EB-NEXT:    sra $2, $1, 24
2789entry:
2790  %0 = atomicrmw add i8* @y, i8 %incr monotonic
2791  ret i8 %0
2792}
2793
2794define signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind {
2795; MIPS32-LABEL: AtomicLoadSub8:
2796; MIPS32:       # %bb.0: # %entry
2797; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
2798; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2799; MIPS32-NEXT:    addu $1, $2, $25
2800; MIPS32-NEXT:    lw $1, %got(y)($1)
2801; MIPS32-NEXT:    addiu $2, $zero, -4
2802; MIPS32-NEXT:    and $2, $1, $2
2803; MIPS32-NEXT:    andi $1, $1, 3
2804; MIPS32-NEXT:    sll $3, $1, 3
2805; MIPS32-NEXT:    ori $1, $zero, 255
2806; MIPS32-NEXT:    sllv $5, $1, $3
2807; MIPS32-NEXT:    nor $6, $zero, $5
2808; MIPS32-NEXT:    sllv $4, $4, $3
2809; MIPS32-NEXT:  $BB9_1: # %entry
2810; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
2811; MIPS32-NEXT:    ll $7, 0($2)
2812; MIPS32-NEXT:    subu $8, $7, $4
2813; MIPS32-NEXT:    and $8, $8, $5
2814; MIPS32-NEXT:    and $9, $7, $6
2815; MIPS32-NEXT:    or $9, $9, $8
2816; MIPS32-NEXT:    sc $9, 0($2)
2817; MIPS32-NEXT:    beqz $9, $BB9_1
2818; MIPS32-NEXT:    nop
2819; MIPS32-NEXT:  # %bb.2: # %entry
2820; MIPS32-NEXT:    and $1, $7, $5
2821; MIPS32-NEXT:    srlv $1, $1, $3
2822; MIPS32-NEXT:    sll $1, $1, 24
2823; MIPS32-NEXT:    sra $1, $1, 24
2824; MIPS32-NEXT:  # %bb.3: # %entry
2825; MIPS32-NEXT:    sll $1, $1, 24
2826; MIPS32-NEXT:    jr $ra
2827; MIPS32-NEXT:    sra $2, $1, 24
2828;
2829; MIPS32O0-LABEL: AtomicLoadSub8:
2830; MIPS32O0:       # %bb.0: # %entry
2831; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
2832; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2833; MIPS32O0-NEXT:    addiu $sp, $sp, -8
2834; MIPS32O0-NEXT:    addu $1, $2, $25
2835; MIPS32O0-NEXT:    lw $1, %got(y)($1)
2836; MIPS32O0-NEXT:    addiu $2, $zero, -4
2837; MIPS32O0-NEXT:    and $2, $1, $2
2838; MIPS32O0-NEXT:    andi $1, $1, 3
2839; MIPS32O0-NEXT:    sll $1, $1, 3
2840; MIPS32O0-NEXT:    ori $3, $zero, 255
2841; MIPS32O0-NEXT:    sllv $3, $3, $1
2842; MIPS32O0-NEXT:    nor $5, $zero, $3
2843; MIPS32O0-NEXT:    sllv $4, $4, $1
2844; MIPS32O0-NEXT:  $BB9_1: # %entry
2845; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
2846; MIPS32O0-NEXT:    ll $7, 0($2)
2847; MIPS32O0-NEXT:    subu $8, $7, $4
2848; MIPS32O0-NEXT:    and $8, $8, $3
2849; MIPS32O0-NEXT:    and $9, $7, $5
2850; MIPS32O0-NEXT:    or $9, $9, $8
2851; MIPS32O0-NEXT:    sc $9, 0($2)
2852; MIPS32O0-NEXT:    beqz $9, $BB9_1
2853; MIPS32O0-NEXT:    nop
2854; MIPS32O0-NEXT:  # %bb.2: # %entry
2855; MIPS32O0-NEXT:    and $6, $7, $3
2856; MIPS32O0-NEXT:    srlv $6, $6, $1
2857; MIPS32O0-NEXT:    sll $6, $6, 24
2858; MIPS32O0-NEXT:    sra $6, $6, 24
2859; MIPS32O0-NEXT:  # %bb.3: # %entry
2860; MIPS32O0-NEXT:    sw $6, 4($sp) # 4-byte Folded Spill
2861; MIPS32O0-NEXT:  # %bb.4: # %entry
2862; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2863; MIPS32O0-NEXT:    sll $2, $1, 24
2864; MIPS32O0-NEXT:    sra $2, $2, 24
2865; MIPS32O0-NEXT:    addiu $sp, $sp, 8
2866; MIPS32O0-NEXT:    jr $ra
2867; MIPS32O0-NEXT:    nop
2868;
2869; MIPS32R2-LABEL: AtomicLoadSub8:
2870; MIPS32R2:       # %bb.0: # %entry
2871; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
2872; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2873; MIPS32R2-NEXT:    addu $1, $2, $25
2874; MIPS32R2-NEXT:    lw $1, %got(y)($1)
2875; MIPS32R2-NEXT:    addiu $2, $zero, -4
2876; MIPS32R2-NEXT:    and $2, $1, $2
2877; MIPS32R2-NEXT:    andi $1, $1, 3
2878; MIPS32R2-NEXT:    sll $3, $1, 3
2879; MIPS32R2-NEXT:    ori $1, $zero, 255
2880; MIPS32R2-NEXT:    sllv $5, $1, $3
2881; MIPS32R2-NEXT:    nor $6, $zero, $5
2882; MIPS32R2-NEXT:    sllv $4, $4, $3
2883; MIPS32R2-NEXT:  $BB9_1: # %entry
2884; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
2885; MIPS32R2-NEXT:    ll $7, 0($2)
2886; MIPS32R2-NEXT:    subu $8, $7, $4
2887; MIPS32R2-NEXT:    and $8, $8, $5
2888; MIPS32R2-NEXT:    and $9, $7, $6
2889; MIPS32R2-NEXT:    or $9, $9, $8
2890; MIPS32R2-NEXT:    sc $9, 0($2)
2891; MIPS32R2-NEXT:    beqz $9, $BB9_1
2892; MIPS32R2-NEXT:    nop
2893; MIPS32R2-NEXT:  # %bb.2: # %entry
2894; MIPS32R2-NEXT:    and $1, $7, $5
2895; MIPS32R2-NEXT:    srlv $1, $1, $3
2896; MIPS32R2-NEXT:    seb $1, $1
2897; MIPS32R2-NEXT:  # %bb.3: # %entry
2898; MIPS32R2-NEXT:    jr $ra
2899; MIPS32R2-NEXT:    seb $2, $1
2900;
2901; MIPS32R6-LABEL: AtomicLoadSub8:
2902; MIPS32R6:       # %bb.0: # %entry
2903; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
2904; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
2905; MIPS32R6-NEXT:    addu $1, $2, $25
2906; MIPS32R6-NEXT:    lw $1, %got(y)($1)
2907; MIPS32R6-NEXT:    addiu $2, $zero, -4
2908; MIPS32R6-NEXT:    and $2, $1, $2
2909; MIPS32R6-NEXT:    andi $1, $1, 3
2910; MIPS32R6-NEXT:    sll $3, $1, 3
2911; MIPS32R6-NEXT:    ori $1, $zero, 255
2912; MIPS32R6-NEXT:    sllv $5, $1, $3
2913; MIPS32R6-NEXT:    nor $6, $zero, $5
2914; MIPS32R6-NEXT:    sllv $4, $4, $3
2915; MIPS32R6-NEXT:  $BB9_1: # %entry
2916; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
2917; MIPS32R6-NEXT:    ll $7, 0($2)
2918; MIPS32R6-NEXT:    subu $8, $7, $4
2919; MIPS32R6-NEXT:    and $8, $8, $5
2920; MIPS32R6-NEXT:    and $9, $7, $6
2921; MIPS32R6-NEXT:    or $9, $9, $8
2922; MIPS32R6-NEXT:    sc $9, 0($2)
2923; MIPS32R6-NEXT:    beqzc $9, $BB9_1
2924; MIPS32R6-NEXT:  # %bb.2: # %entry
2925; MIPS32R6-NEXT:    and $1, $7, $5
2926; MIPS32R6-NEXT:    srlv $1, $1, $3
2927; MIPS32R6-NEXT:    seb $1, $1
2928; MIPS32R6-NEXT:  # %bb.3: # %entry
2929; MIPS32R6-NEXT:    jr $ra
2930; MIPS32R6-NEXT:    seb $2, $1
2931;
2932; MIPS32R6O0-LABEL: AtomicLoadSub8:
2933; MIPS32R6O0:       # %bb.0: # %entry
2934; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
2935; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2936; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
2937; MIPS32R6O0-NEXT:    addu $1, $2, $25
2938; MIPS32R6O0-NEXT:    move $2, $4
2939; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
2940; MIPS32R6O0-NEXT:    addiu $3, $zero, -4
2941; MIPS32R6O0-NEXT:    and $3, $1, $3
2942; MIPS32R6O0-NEXT:    andi $1, $1, 3
2943; MIPS32R6O0-NEXT:    sll $1, $1, 3
2944; MIPS32R6O0-NEXT:    ori $5, $zero, 255
2945; MIPS32R6O0-NEXT:    sllv $5, $5, $1
2946; MIPS32R6O0-NEXT:    nor $6, $zero, $5
2947; MIPS32R6O0-NEXT:    sllv $4, $4, $1
2948; MIPS32R6O0-NEXT:  $BB9_1: # %entry
2949; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2950; MIPS32R6O0-NEXT:    ll $8, 0($3)
2951; MIPS32R6O0-NEXT:    subu $9, $8, $4
2952; MIPS32R6O0-NEXT:    and $9, $9, $5
2953; MIPS32R6O0-NEXT:    and $10, $8, $6
2954; MIPS32R6O0-NEXT:    or $10, $10, $9
2955; MIPS32R6O0-NEXT:    sc $10, 0($3)
2956; MIPS32R6O0-NEXT:    beqzc $10, $BB9_1
2957; MIPS32R6O0-NEXT:  # %bb.2: # %entry
2958; MIPS32R6O0-NEXT:    and $7, $8, $5
2959; MIPS32R6O0-NEXT:    srlv $7, $7, $1
2960; MIPS32R6O0-NEXT:    seb $7, $7
2961; MIPS32R6O0-NEXT:  # %bb.3: # %entry
2962; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
2963; MIPS32R6O0-NEXT:    sw $7, 0($sp) # 4-byte Folded Spill
2964; MIPS32R6O0-NEXT:  # %bb.4: # %entry
2965; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
2966; MIPS32R6O0-NEXT:    seb $2, $1
2967; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
2968; MIPS32R6O0-NEXT:    jrc $ra
2969;
2970; MIPS4-LABEL: AtomicLoadSub8:
2971; MIPS4:       # %bb.0: # %entry
2972; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
2973; MIPS4-NEXT:    daddu $1, $1, $25
2974; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
2975; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
2976; MIPS4-NEXT:    daddiu $2, $zero, -4
2977; MIPS4-NEXT:    and $2, $1, $2
2978; MIPS4-NEXT:    andi $1, $1, 3
2979; MIPS4-NEXT:    sll $3, $1, 3
2980; MIPS4-NEXT:    ori $1, $zero, 255
2981; MIPS4-NEXT:    sllv $5, $1, $3
2982; MIPS4-NEXT:    nor $6, $zero, $5
2983; MIPS4-NEXT:    sllv $4, $4, $3
2984; MIPS4-NEXT:  .LBB9_1: # %entry
2985; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2986; MIPS4-NEXT:    ll $7, 0($2)
2987; MIPS4-NEXT:    subu $8, $7, $4
2988; MIPS4-NEXT:    and $8, $8, $5
2989; MIPS4-NEXT:    and $9, $7, $6
2990; MIPS4-NEXT:    or $9, $9, $8
2991; MIPS4-NEXT:    sc $9, 0($2)
2992; MIPS4-NEXT:    beqz $9, .LBB9_1
2993; MIPS4-NEXT:    nop
2994; MIPS4-NEXT:  # %bb.2: # %entry
2995; MIPS4-NEXT:    and $1, $7, $5
2996; MIPS4-NEXT:    srlv $1, $1, $3
2997; MIPS4-NEXT:    sll $1, $1, 24
2998; MIPS4-NEXT:    sra $1, $1, 24
2999; MIPS4-NEXT:  # %bb.3: # %entry
3000; MIPS4-NEXT:    sll $1, $1, 24
3001; MIPS4-NEXT:    jr $ra
3002; MIPS4-NEXT:    sra $2, $1, 24
3003;
3004; MIPS64-LABEL: AtomicLoadSub8:
3005; MIPS64:       # %bb.0: # %entry
3006; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3007; MIPS64-NEXT:    daddu $1, $1, $25
3008; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3009; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
3010; MIPS64-NEXT:    daddiu $2, $zero, -4
3011; MIPS64-NEXT:    and $2, $1, $2
3012; MIPS64-NEXT:    andi $1, $1, 3
3013; MIPS64-NEXT:    sll $3, $1, 3
3014; MIPS64-NEXT:    ori $1, $zero, 255
3015; MIPS64-NEXT:    sllv $5, $1, $3
3016; MIPS64-NEXT:    nor $6, $zero, $5
3017; MIPS64-NEXT:    sllv $4, $4, $3
3018; MIPS64-NEXT:  .LBB9_1: # %entry
3019; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
3020; MIPS64-NEXT:    ll $7, 0($2)
3021; MIPS64-NEXT:    subu $8, $7, $4
3022; MIPS64-NEXT:    and $8, $8, $5
3023; MIPS64-NEXT:    and $9, $7, $6
3024; MIPS64-NEXT:    or $9, $9, $8
3025; MIPS64-NEXT:    sc $9, 0($2)
3026; MIPS64-NEXT:    beqz $9, .LBB9_1
3027; MIPS64-NEXT:    nop
3028; MIPS64-NEXT:  # %bb.2: # %entry
3029; MIPS64-NEXT:    and $1, $7, $5
3030; MIPS64-NEXT:    srlv $1, $1, $3
3031; MIPS64-NEXT:    sll $1, $1, 24
3032; MIPS64-NEXT:    sra $1, $1, 24
3033; MIPS64-NEXT:  # %bb.3: # %entry
3034; MIPS64-NEXT:    sll $1, $1, 24
3035; MIPS64-NEXT:    jr $ra
3036; MIPS64-NEXT:    sra $2, $1, 24
3037;
3038; MIPS64R2-LABEL: AtomicLoadSub8:
3039; MIPS64R2:       # %bb.0: # %entry
3040; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3041; MIPS64R2-NEXT:    daddu $1, $1, $25
3042; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3043; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
3044; MIPS64R2-NEXT:    daddiu $2, $zero, -4
3045; MIPS64R2-NEXT:    and $2, $1, $2
3046; MIPS64R2-NEXT:    andi $1, $1, 3
3047; MIPS64R2-NEXT:    sll $3, $1, 3
3048; MIPS64R2-NEXT:    ori $1, $zero, 255
3049; MIPS64R2-NEXT:    sllv $5, $1, $3
3050; MIPS64R2-NEXT:    nor $6, $zero, $5
3051; MIPS64R2-NEXT:    sllv $4, $4, $3
3052; MIPS64R2-NEXT:  .LBB9_1: # %entry
3053; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
3054; MIPS64R2-NEXT:    ll $7, 0($2)
3055; MIPS64R2-NEXT:    subu $8, $7, $4
3056; MIPS64R2-NEXT:    and $8, $8, $5
3057; MIPS64R2-NEXT:    and $9, $7, $6
3058; MIPS64R2-NEXT:    or $9, $9, $8
3059; MIPS64R2-NEXT:    sc $9, 0($2)
3060; MIPS64R2-NEXT:    beqz $9, .LBB9_1
3061; MIPS64R2-NEXT:    nop
3062; MIPS64R2-NEXT:  # %bb.2: # %entry
3063; MIPS64R2-NEXT:    and $1, $7, $5
3064; MIPS64R2-NEXT:    srlv $1, $1, $3
3065; MIPS64R2-NEXT:    seb $1, $1
3066; MIPS64R2-NEXT:  # %bb.3: # %entry
3067; MIPS64R2-NEXT:    jr $ra
3068; MIPS64R2-NEXT:    seb $2, $1
3069;
3070; MIPS64R6-LABEL: AtomicLoadSub8:
3071; MIPS64R6:       # %bb.0: # %entry
3072; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3073; MIPS64R6-NEXT:    daddu $1, $1, $25
3074; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3075; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
3076; MIPS64R6-NEXT:    daddiu $2, $zero, -4
3077; MIPS64R6-NEXT:    and $2, $1, $2
3078; MIPS64R6-NEXT:    andi $1, $1, 3
3079; MIPS64R6-NEXT:    sll $3, $1, 3
3080; MIPS64R6-NEXT:    ori $1, $zero, 255
3081; MIPS64R6-NEXT:    sllv $5, $1, $3
3082; MIPS64R6-NEXT:    nor $6, $zero, $5
3083; MIPS64R6-NEXT:    sllv $4, $4, $3
3084; MIPS64R6-NEXT:  .LBB9_1: # %entry
3085; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
3086; MIPS64R6-NEXT:    ll $7, 0($2)
3087; MIPS64R6-NEXT:    subu $8, $7, $4
3088; MIPS64R6-NEXT:    and $8, $8, $5
3089; MIPS64R6-NEXT:    and $9, $7, $6
3090; MIPS64R6-NEXT:    or $9, $9, $8
3091; MIPS64R6-NEXT:    sc $9, 0($2)
3092; MIPS64R6-NEXT:    beqzc $9, .LBB9_1
3093; MIPS64R6-NEXT:  # %bb.2: # %entry
3094; MIPS64R6-NEXT:    and $1, $7, $5
3095; MIPS64R6-NEXT:    srlv $1, $1, $3
3096; MIPS64R6-NEXT:    seb $1, $1
3097; MIPS64R6-NEXT:  # %bb.3: # %entry
3098; MIPS64R6-NEXT:    jr $ra
3099; MIPS64R6-NEXT:    seb $2, $1
3100;
3101; MIPS64R6O0-LABEL: AtomicLoadSub8:
3102; MIPS64R6O0:       # %bb.0: # %entry
3103; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
3104; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3105; MIPS64R6O0-NEXT:    daddu $1, $1, $25
3106; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3107; MIPS64R6O0-NEXT:    move $2, $4
3108; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
3109; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
3110; MIPS64R6O0-NEXT:    and $3, $1, $3
3111; MIPS64R6O0-NEXT:    andi $5, $1, 3
3112; MIPS64R6O0-NEXT:    xori $5, $5, 3
3113; MIPS64R6O0-NEXT:    sll $5, $5, 3
3114; MIPS64R6O0-NEXT:    ori $6, $zero, 255
3115; MIPS64R6O0-NEXT:    sllv $6, $6, $5
3116; MIPS64R6O0-NEXT:    nor $7, $zero, $6
3117; MIPS64R6O0-NEXT:    sllv $2, $2, $5
3118; MIPS64R6O0-NEXT:  .LBB9_1: # %entry
3119; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3120; MIPS64R6O0-NEXT:    ll $9, 0($3)
3121; MIPS64R6O0-NEXT:    subu $10, $9, $2
3122; MIPS64R6O0-NEXT:    and $10, $10, $6
3123; MIPS64R6O0-NEXT:    and $11, $9, $7
3124; MIPS64R6O0-NEXT:    or $11, $11, $10
3125; MIPS64R6O0-NEXT:    sc $11, 0($3)
3126; MIPS64R6O0-NEXT:    beqzc $11, .LBB9_1
3127; MIPS64R6O0-NEXT:  # %bb.2: # %entry
3128; MIPS64R6O0-NEXT:    and $8, $9, $6
3129; MIPS64R6O0-NEXT:    srlv $8, $8, $5
3130; MIPS64R6O0-NEXT:    seb $8, $8
3131; MIPS64R6O0-NEXT:  # %bb.3: # %entry
3132; MIPS64R6O0-NEXT:    sw $8, 12($sp) # 4-byte Folded Spill
3133; MIPS64R6O0-NEXT:  # %bb.4: # %entry
3134; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
3135; MIPS64R6O0-NEXT:    seb $2, $1
3136; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
3137; MIPS64R6O0-NEXT:    jrc $ra
3138;
3139; MM32-LABEL: AtomicLoadSub8:
3140; MM32:       # %bb.0: # %entry
3141; MM32-NEXT:    lui $2, %hi(_gp_disp)
3142; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3143; MM32-NEXT:    addu $2, $2, $25
3144; MM32-NEXT:    lw $1, %got(y)($2)
3145; MM32-NEXT:    addiu $2, $zero, -4
3146; MM32-NEXT:    and $2, $1, $2
3147; MM32-NEXT:    andi $1, $1, 3
3148; MM32-NEXT:    sll $3, $1, 3
3149; MM32-NEXT:    ori $1, $zero, 255
3150; MM32-NEXT:    sllv $5, $1, $3
3151; MM32-NEXT:    nor $6, $zero, $5
3152; MM32-NEXT:    sllv $4, $4, $3
3153; MM32-NEXT:  $BB9_1: # %entry
3154; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
3155; MM32-NEXT:    ll $7, 0($2)
3156; MM32-NEXT:    subu $8, $7, $4
3157; MM32-NEXT:    and $8, $8, $5
3158; MM32-NEXT:    and $9, $7, $6
3159; MM32-NEXT:    or $9, $9, $8
3160; MM32-NEXT:    sc $9, 0($2)
3161; MM32-NEXT:    beqzc $9, $BB9_1
3162; MM32-NEXT:  # %bb.2: # %entry
3163; MM32-NEXT:    and $1, $7, $5
3164; MM32-NEXT:    srlv $1, $1, $3
3165; MM32-NEXT:    seb $1, $1
3166; MM32-NEXT:  # %bb.3: # %entry
3167; MM32-NEXT:    jr $ra
3168; MM32-NEXT:    seb $2, $1
3169;
3170; O1-LABEL: AtomicLoadSub8:
3171; O1:       # %bb.0: # %entry
3172; O1-NEXT:    lui $2, %hi(_gp_disp)
3173; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
3174; O1-NEXT:    addu $1, $2, $25
3175; O1-NEXT:    lw $1, %got(y)($1)
3176; O1-NEXT:    addiu $2, $zero, -4
3177; O1-NEXT:    and $2, $1, $2
3178; O1-NEXT:    andi $1, $1, 3
3179; O1-NEXT:    sll $3, $1, 3
3180; O1-NEXT:    ori $1, $zero, 255
3181; O1-NEXT:    sllv $5, $1, $3
3182; O1-NEXT:    nor $6, $zero, $5
3183; O1-NEXT:    sllv $4, $4, $3
3184; O1-NEXT:  $BB9_1: # %entry
3185; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3186; O1-NEXT:    ll $7, 0($2)
3187; O1-NEXT:    subu $8, $7, $4
3188; O1-NEXT:    and $8, $8, $5
3189; O1-NEXT:    and $9, $7, $6
3190; O1-NEXT:    or $9, $9, $8
3191; O1-NEXT:    sc $9, 0($2)
3192; O1-NEXT:    beqz $9, $BB9_1
3193; O1-NEXT:    nop
3194; O1-NEXT:  # %bb.2: # %entry
3195; O1-NEXT:    and $1, $7, $5
3196; O1-NEXT:    srlv $1, $1, $3
3197; O1-NEXT:    sll $1, $1, 24
3198; O1-NEXT:    sra $1, $1, 24
3199; O1-NEXT:  # %bb.3: # %entry
3200; O1-NEXT:    sll $1, $1, 24
3201; O1-NEXT:    jr $ra
3202; O1-NEXT:    sra $2, $1, 24
3203;
3204; O2-LABEL: AtomicLoadSub8:
3205; O2:       # %bb.0: # %entry
3206; O2-NEXT:    lui $2, %hi(_gp_disp)
3207; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3208; O2-NEXT:    addu $1, $2, $25
3209; O2-NEXT:    lw $1, %got(y)($1)
3210; O2-NEXT:    addiu $2, $zero, -4
3211; O2-NEXT:    and $2, $1, $2
3212; O2-NEXT:    andi $1, $1, 3
3213; O2-NEXT:    sll $3, $1, 3
3214; O2-NEXT:    ori $1, $zero, 255
3215; O2-NEXT:    sllv $5, $1, $3
3216; O2-NEXT:    nor $6, $zero, $5
3217; O2-NEXT:    sllv $4, $4, $3
3218; O2-NEXT:  $BB9_1: # %entry
3219; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3220; O2-NEXT:    ll $7, 0($2)
3221; O2-NEXT:    subu $8, $7, $4
3222; O2-NEXT:    and $8, $8, $5
3223; O2-NEXT:    and $9, $7, $6
3224; O2-NEXT:    or $9, $9, $8
3225; O2-NEXT:    sc $9, 0($2)
3226; O2-NEXT:    beqz $9, $BB9_1
3227; O2-NEXT:    nop
3228; O2-NEXT:  # %bb.2: # %entry
3229; O2-NEXT:    and $1, $7, $5
3230; O2-NEXT:    srlv $1, $1, $3
3231; O2-NEXT:    sll $1, $1, 24
3232; O2-NEXT:    sra $1, $1, 24
3233; O2-NEXT:  # %bb.3: # %entry
3234; O2-NEXT:    sll $1, $1, 24
3235; O2-NEXT:    jr $ra
3236; O2-NEXT:    sra $2, $1, 24
3237;
3238; O3-LABEL: AtomicLoadSub8:
3239; O3:       # %bb.0: # %entry
3240; O3-NEXT:    lui $2, %hi(_gp_disp)
3241; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
3242; O3-NEXT:    addu $1, $2, $25
3243; O3-NEXT:    addiu $2, $zero, -4
3244; O3-NEXT:    lw $1, %got(y)($1)
3245; O3-NEXT:    and $2, $1, $2
3246; O3-NEXT:    andi $1, $1, 3
3247; O3-NEXT:    sll $3, $1, 3
3248; O3-NEXT:    ori $1, $zero, 255
3249; O3-NEXT:    sllv $5, $1, $3
3250; O3-NEXT:    sllv $4, $4, $3
3251; O3-NEXT:    nor $6, $zero, $5
3252; O3-NEXT:  $BB9_1: # %entry
3253; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3254; O3-NEXT:    ll $7, 0($2)
3255; O3-NEXT:    subu $8, $7, $4
3256; O3-NEXT:    and $8, $8, $5
3257; O3-NEXT:    and $9, $7, $6
3258; O3-NEXT:    or $9, $9, $8
3259; O3-NEXT:    sc $9, 0($2)
3260; O3-NEXT:    beqz $9, $BB9_1
3261; O3-NEXT:    nop
3262; O3-NEXT:  # %bb.2: # %entry
3263; O3-NEXT:    and $1, $7, $5
3264; O3-NEXT:    srlv $1, $1, $3
3265; O3-NEXT:    sll $1, $1, 24
3266; O3-NEXT:    sra $1, $1, 24
3267; O3-NEXT:  # %bb.3: # %entry
3268; O3-NEXT:    sll $1, $1, 24
3269; O3-NEXT:    jr $ra
3270; O3-NEXT:    sra $2, $1, 24
3271;
3272; MIPS32EB-LABEL: AtomicLoadSub8:
3273; MIPS32EB:       # %bb.0: # %entry
3274; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
3275; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
3276; MIPS32EB-NEXT:    addu $1, $2, $25
3277; MIPS32EB-NEXT:    lw $1, %got(y)($1)
3278; MIPS32EB-NEXT:    addiu $2, $zero, -4
3279; MIPS32EB-NEXT:    and $2, $1, $2
3280; MIPS32EB-NEXT:    andi $1, $1, 3
3281; MIPS32EB-NEXT:    xori $1, $1, 3
3282; MIPS32EB-NEXT:    sll $3, $1, 3
3283; MIPS32EB-NEXT:    ori $1, $zero, 255
3284; MIPS32EB-NEXT:    sllv $5, $1, $3
3285; MIPS32EB-NEXT:    nor $6, $zero, $5
3286; MIPS32EB-NEXT:    sllv $4, $4, $3
3287; MIPS32EB-NEXT:  $BB9_1: # %entry
3288; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
3289; MIPS32EB-NEXT:    ll $7, 0($2)
3290; MIPS32EB-NEXT:    subu $8, $7, $4
3291; MIPS32EB-NEXT:    and $8, $8, $5
3292; MIPS32EB-NEXT:    and $9, $7, $6
3293; MIPS32EB-NEXT:    or $9, $9, $8
3294; MIPS32EB-NEXT:    sc $9, 0($2)
3295; MIPS32EB-NEXT:    beqz $9, $BB9_1
3296; MIPS32EB-NEXT:    nop
3297; MIPS32EB-NEXT:  # %bb.2: # %entry
3298; MIPS32EB-NEXT:    and $1, $7, $5
3299; MIPS32EB-NEXT:    srlv $1, $1, $3
3300; MIPS32EB-NEXT:    sll $1, $1, 24
3301; MIPS32EB-NEXT:    sra $1, $1, 24
3302; MIPS32EB-NEXT:  # %bb.3: # %entry
3303; MIPS32EB-NEXT:    sll $1, $1, 24
3304; MIPS32EB-NEXT:    jr $ra
3305; MIPS32EB-NEXT:    sra $2, $1, 24
3306entry:
3307  %0 = atomicrmw sub i8* @y, i8 %incr monotonic
3308  ret i8 %0
3309
3310}
3311
3312define signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind {
3313; MIPS32-LABEL: AtomicLoadNand8:
3314; MIPS32:       # %bb.0: # %entry
3315; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
3316; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3317; MIPS32-NEXT:    addu $1, $2, $25
3318; MIPS32-NEXT:    lw $1, %got(y)($1)
3319; MIPS32-NEXT:    addiu $2, $zero, -4
3320; MIPS32-NEXT:    and $2, $1, $2
3321; MIPS32-NEXT:    andi $1, $1, 3
3322; MIPS32-NEXT:    sll $3, $1, 3
3323; MIPS32-NEXT:    ori $1, $zero, 255
3324; MIPS32-NEXT:    sllv $5, $1, $3
3325; MIPS32-NEXT:    nor $6, $zero, $5
3326; MIPS32-NEXT:    sllv $4, $4, $3
3327; MIPS32-NEXT:  $BB10_1: # %entry
3328; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
3329; MIPS32-NEXT:    ll $7, 0($2)
3330; MIPS32-NEXT:    and $8, $7, $4
3331; MIPS32-NEXT:    nor $8, $zero, $8
3332; MIPS32-NEXT:    and $8, $8, $5
3333; MIPS32-NEXT:    and $9, $7, $6
3334; MIPS32-NEXT:    or $9, $9, $8
3335; MIPS32-NEXT:    sc $9, 0($2)
3336; MIPS32-NEXT:    beqz $9, $BB10_1
3337; MIPS32-NEXT:    nop
3338; MIPS32-NEXT:  # %bb.2: # %entry
3339; MIPS32-NEXT:    and $1, $7, $5
3340; MIPS32-NEXT:    srlv $1, $1, $3
3341; MIPS32-NEXT:    sll $1, $1, 24
3342; MIPS32-NEXT:    sra $1, $1, 24
3343; MIPS32-NEXT:  # %bb.3: # %entry
3344; MIPS32-NEXT:    sll $1, $1, 24
3345; MIPS32-NEXT:    jr $ra
3346; MIPS32-NEXT:    sra $2, $1, 24
3347;
3348; MIPS32O0-LABEL: AtomicLoadNand8:
3349; MIPS32O0:       # %bb.0: # %entry
3350; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
3351; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3352; MIPS32O0-NEXT:    addiu $sp, $sp, -8
3353; MIPS32O0-NEXT:    addu $1, $2, $25
3354; MIPS32O0-NEXT:    lw $1, %got(y)($1)
3355; MIPS32O0-NEXT:    addiu $2, $zero, -4
3356; MIPS32O0-NEXT:    and $2, $1, $2
3357; MIPS32O0-NEXT:    andi $1, $1, 3
3358; MIPS32O0-NEXT:    sll $1, $1, 3
3359; MIPS32O0-NEXT:    ori $3, $zero, 255
3360; MIPS32O0-NEXT:    sllv $3, $3, $1
3361; MIPS32O0-NEXT:    nor $5, $zero, $3
3362; MIPS32O0-NEXT:    sllv $4, $4, $1
3363; MIPS32O0-NEXT:  $BB10_1: # %entry
3364; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
3365; MIPS32O0-NEXT:    ll $7, 0($2)
3366; MIPS32O0-NEXT:    and $8, $7, $4
3367; MIPS32O0-NEXT:    nor $8, $zero, $8
3368; MIPS32O0-NEXT:    and $8, $8, $3
3369; MIPS32O0-NEXT:    and $9, $7, $5
3370; MIPS32O0-NEXT:    or $9, $9, $8
3371; MIPS32O0-NEXT:    sc $9, 0($2)
3372; MIPS32O0-NEXT:    beqz $9, $BB10_1
3373; MIPS32O0-NEXT:    nop
3374; MIPS32O0-NEXT:  # %bb.2: # %entry
3375; MIPS32O0-NEXT:    and $6, $7, $3
3376; MIPS32O0-NEXT:    srlv $6, $6, $1
3377; MIPS32O0-NEXT:    sll $6, $6, 24
3378; MIPS32O0-NEXT:    sra $6, $6, 24
3379; MIPS32O0-NEXT:  # %bb.3: # %entry
3380; MIPS32O0-NEXT:    sw $6, 4($sp) # 4-byte Folded Spill
3381; MIPS32O0-NEXT:  # %bb.4: # %entry
3382; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3383; MIPS32O0-NEXT:    sll $2, $1, 24
3384; MIPS32O0-NEXT:    sra $2, $2, 24
3385; MIPS32O0-NEXT:    addiu $sp, $sp, 8
3386; MIPS32O0-NEXT:    jr $ra
3387; MIPS32O0-NEXT:    nop
3388;
3389; MIPS32R2-LABEL: AtomicLoadNand8:
3390; MIPS32R2:       # %bb.0: # %entry
3391; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
3392; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3393; MIPS32R2-NEXT:    addu $1, $2, $25
3394; MIPS32R2-NEXT:    lw $1, %got(y)($1)
3395; MIPS32R2-NEXT:    addiu $2, $zero, -4
3396; MIPS32R2-NEXT:    and $2, $1, $2
3397; MIPS32R2-NEXT:    andi $1, $1, 3
3398; MIPS32R2-NEXT:    sll $3, $1, 3
3399; MIPS32R2-NEXT:    ori $1, $zero, 255
3400; MIPS32R2-NEXT:    sllv $5, $1, $3
3401; MIPS32R2-NEXT:    nor $6, $zero, $5
3402; MIPS32R2-NEXT:    sllv $4, $4, $3
3403; MIPS32R2-NEXT:  $BB10_1: # %entry
3404; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
3405; MIPS32R2-NEXT:    ll $7, 0($2)
3406; MIPS32R2-NEXT:    and $8, $7, $4
3407; MIPS32R2-NEXT:    nor $8, $zero, $8
3408; MIPS32R2-NEXT:    and $8, $8, $5
3409; MIPS32R2-NEXT:    and $9, $7, $6
3410; MIPS32R2-NEXT:    or $9, $9, $8
3411; MIPS32R2-NEXT:    sc $9, 0($2)
3412; MIPS32R2-NEXT:    beqz $9, $BB10_1
3413; MIPS32R2-NEXT:    nop
3414; MIPS32R2-NEXT:  # %bb.2: # %entry
3415; MIPS32R2-NEXT:    and $1, $7, $5
3416; MIPS32R2-NEXT:    srlv $1, $1, $3
3417; MIPS32R2-NEXT:    seb $1, $1
3418; MIPS32R2-NEXT:  # %bb.3: # %entry
3419; MIPS32R2-NEXT:    jr $ra
3420; MIPS32R2-NEXT:    seb $2, $1
3421;
3422; MIPS32R6-LABEL: AtomicLoadNand8:
3423; MIPS32R6:       # %bb.0: # %entry
3424; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
3425; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
3426; MIPS32R6-NEXT:    addu $1, $2, $25
3427; MIPS32R6-NEXT:    lw $1, %got(y)($1)
3428; MIPS32R6-NEXT:    addiu $2, $zero, -4
3429; MIPS32R6-NEXT:    and $2, $1, $2
3430; MIPS32R6-NEXT:    andi $1, $1, 3
3431; MIPS32R6-NEXT:    sll $3, $1, 3
3432; MIPS32R6-NEXT:    ori $1, $zero, 255
3433; MIPS32R6-NEXT:    sllv $5, $1, $3
3434; MIPS32R6-NEXT:    nor $6, $zero, $5
3435; MIPS32R6-NEXT:    sllv $4, $4, $3
3436; MIPS32R6-NEXT:  $BB10_1: # %entry
3437; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
3438; MIPS32R6-NEXT:    ll $7, 0($2)
3439; MIPS32R6-NEXT:    and $8, $7, $4
3440; MIPS32R6-NEXT:    nor $8, $zero, $8
3441; MIPS32R6-NEXT:    and $8, $8, $5
3442; MIPS32R6-NEXT:    and $9, $7, $6
3443; MIPS32R6-NEXT:    or $9, $9, $8
3444; MIPS32R6-NEXT:    sc $9, 0($2)
3445; MIPS32R6-NEXT:    beqzc $9, $BB10_1
3446; MIPS32R6-NEXT:  # %bb.2: # %entry
3447; MIPS32R6-NEXT:    and $1, $7, $5
3448; MIPS32R6-NEXT:    srlv $1, $1, $3
3449; MIPS32R6-NEXT:    seb $1, $1
3450; MIPS32R6-NEXT:  # %bb.3: # %entry
3451; MIPS32R6-NEXT:    jr $ra
3452; MIPS32R6-NEXT:    seb $2, $1
3453;
3454; MIPS32R6O0-LABEL: AtomicLoadNand8:
3455; MIPS32R6O0:       # %bb.0: # %entry
3456; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
3457; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3458; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
3459; MIPS32R6O0-NEXT:    addu $1, $2, $25
3460; MIPS32R6O0-NEXT:    move $2, $4
3461; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
3462; MIPS32R6O0-NEXT:    addiu $3, $zero, -4
3463; MIPS32R6O0-NEXT:    and $3, $1, $3
3464; MIPS32R6O0-NEXT:    andi $1, $1, 3
3465; MIPS32R6O0-NEXT:    sll $1, $1, 3
3466; MIPS32R6O0-NEXT:    ori $5, $zero, 255
3467; MIPS32R6O0-NEXT:    sllv $5, $5, $1
3468; MIPS32R6O0-NEXT:    nor $6, $zero, $5
3469; MIPS32R6O0-NEXT:    sllv $4, $4, $1
3470; MIPS32R6O0-NEXT:  $BB10_1: # %entry
3471; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3472; MIPS32R6O0-NEXT:    ll $8, 0($3)
3473; MIPS32R6O0-NEXT:    and $9, $8, $4
3474; MIPS32R6O0-NEXT:    nor $9, $zero, $9
3475; MIPS32R6O0-NEXT:    and $9, $9, $5
3476; MIPS32R6O0-NEXT:    and $10, $8, $6
3477; MIPS32R6O0-NEXT:    or $10, $10, $9
3478; MIPS32R6O0-NEXT:    sc $10, 0($3)
3479; MIPS32R6O0-NEXT:    beqzc $10, $BB10_1
3480; MIPS32R6O0-NEXT:  # %bb.2: # %entry
3481; MIPS32R6O0-NEXT:    and $7, $8, $5
3482; MIPS32R6O0-NEXT:    srlv $7, $7, $1
3483; MIPS32R6O0-NEXT:    seb $7, $7
3484; MIPS32R6O0-NEXT:  # %bb.3: # %entry
3485; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
3486; MIPS32R6O0-NEXT:    sw $7, 0($sp) # 4-byte Folded Spill
3487; MIPS32R6O0-NEXT:  # %bb.4: # %entry
3488; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
3489; MIPS32R6O0-NEXT:    seb $2, $1
3490; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
3491; MIPS32R6O0-NEXT:    jrc $ra
3492;
3493; MIPS4-LABEL: AtomicLoadNand8:
3494; MIPS4:       # %bb.0: # %entry
3495; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3496; MIPS4-NEXT:    daddu $1, $1, $25
3497; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3498; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
3499; MIPS4-NEXT:    daddiu $2, $zero, -4
3500; MIPS4-NEXT:    and $2, $1, $2
3501; MIPS4-NEXT:    andi $1, $1, 3
3502; MIPS4-NEXT:    sll $3, $1, 3
3503; MIPS4-NEXT:    ori $1, $zero, 255
3504; MIPS4-NEXT:    sllv $5, $1, $3
3505; MIPS4-NEXT:    nor $6, $zero, $5
3506; MIPS4-NEXT:    sllv $4, $4, $3
3507; MIPS4-NEXT:  .LBB10_1: # %entry
3508; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
3509; MIPS4-NEXT:    ll $7, 0($2)
3510; MIPS4-NEXT:    and $8, $7, $4
3511; MIPS4-NEXT:    nor $8, $zero, $8
3512; MIPS4-NEXT:    and $8, $8, $5
3513; MIPS4-NEXT:    and $9, $7, $6
3514; MIPS4-NEXT:    or $9, $9, $8
3515; MIPS4-NEXT:    sc $9, 0($2)
3516; MIPS4-NEXT:    beqz $9, .LBB10_1
3517; MIPS4-NEXT:    nop
3518; MIPS4-NEXT:  # %bb.2: # %entry
3519; MIPS4-NEXT:    and $1, $7, $5
3520; MIPS4-NEXT:    srlv $1, $1, $3
3521; MIPS4-NEXT:    sll $1, $1, 24
3522; MIPS4-NEXT:    sra $1, $1, 24
3523; MIPS4-NEXT:  # %bb.3: # %entry
3524; MIPS4-NEXT:    sll $1, $1, 24
3525; MIPS4-NEXT:    jr $ra
3526; MIPS4-NEXT:    sra $2, $1, 24
3527;
3528; MIPS64-LABEL: AtomicLoadNand8:
3529; MIPS64:       # %bb.0: # %entry
3530; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3531; MIPS64-NEXT:    daddu $1, $1, $25
3532; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3533; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
3534; MIPS64-NEXT:    daddiu $2, $zero, -4
3535; MIPS64-NEXT:    and $2, $1, $2
3536; MIPS64-NEXT:    andi $1, $1, 3
3537; MIPS64-NEXT:    sll $3, $1, 3
3538; MIPS64-NEXT:    ori $1, $zero, 255
3539; MIPS64-NEXT:    sllv $5, $1, $3
3540; MIPS64-NEXT:    nor $6, $zero, $5
3541; MIPS64-NEXT:    sllv $4, $4, $3
3542; MIPS64-NEXT:  .LBB10_1: # %entry
3543; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
3544; MIPS64-NEXT:    ll $7, 0($2)
3545; MIPS64-NEXT:    and $8, $7, $4
3546; MIPS64-NEXT:    nor $8, $zero, $8
3547; MIPS64-NEXT:    and $8, $8, $5
3548; MIPS64-NEXT:    and $9, $7, $6
3549; MIPS64-NEXT:    or $9, $9, $8
3550; MIPS64-NEXT:    sc $9, 0($2)
3551; MIPS64-NEXT:    beqz $9, .LBB10_1
3552; MIPS64-NEXT:    nop
3553; MIPS64-NEXT:  # %bb.2: # %entry
3554; MIPS64-NEXT:    and $1, $7, $5
3555; MIPS64-NEXT:    srlv $1, $1, $3
3556; MIPS64-NEXT:    sll $1, $1, 24
3557; MIPS64-NEXT:    sra $1, $1, 24
3558; MIPS64-NEXT:  # %bb.3: # %entry
3559; MIPS64-NEXT:    sll $1, $1, 24
3560; MIPS64-NEXT:    jr $ra
3561; MIPS64-NEXT:    sra $2, $1, 24
3562;
3563; MIPS64R2-LABEL: AtomicLoadNand8:
3564; MIPS64R2:       # %bb.0: # %entry
3565; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3566; MIPS64R2-NEXT:    daddu $1, $1, $25
3567; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3568; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
3569; MIPS64R2-NEXT:    daddiu $2, $zero, -4
3570; MIPS64R2-NEXT:    and $2, $1, $2
3571; MIPS64R2-NEXT:    andi $1, $1, 3
3572; MIPS64R2-NEXT:    sll $3, $1, 3
3573; MIPS64R2-NEXT:    ori $1, $zero, 255
3574; MIPS64R2-NEXT:    sllv $5, $1, $3
3575; MIPS64R2-NEXT:    nor $6, $zero, $5
3576; MIPS64R2-NEXT:    sllv $4, $4, $3
3577; MIPS64R2-NEXT:  .LBB10_1: # %entry
3578; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
3579; MIPS64R2-NEXT:    ll $7, 0($2)
3580; MIPS64R2-NEXT:    and $8, $7, $4
3581; MIPS64R2-NEXT:    nor $8, $zero, $8
3582; MIPS64R2-NEXT:    and $8, $8, $5
3583; MIPS64R2-NEXT:    and $9, $7, $6
3584; MIPS64R2-NEXT:    or $9, $9, $8
3585; MIPS64R2-NEXT:    sc $9, 0($2)
3586; MIPS64R2-NEXT:    beqz $9, .LBB10_1
3587; MIPS64R2-NEXT:    nop
3588; MIPS64R2-NEXT:  # %bb.2: # %entry
3589; MIPS64R2-NEXT:    and $1, $7, $5
3590; MIPS64R2-NEXT:    srlv $1, $1, $3
3591; MIPS64R2-NEXT:    seb $1, $1
3592; MIPS64R2-NEXT:  # %bb.3: # %entry
3593; MIPS64R2-NEXT:    jr $ra
3594; MIPS64R2-NEXT:    seb $2, $1
3595;
3596; MIPS64R6-LABEL: AtomicLoadNand8:
3597; MIPS64R6:       # %bb.0: # %entry
3598; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3599; MIPS64R6-NEXT:    daddu $1, $1, $25
3600; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3601; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
3602; MIPS64R6-NEXT:    daddiu $2, $zero, -4
3603; MIPS64R6-NEXT:    and $2, $1, $2
3604; MIPS64R6-NEXT:    andi $1, $1, 3
3605; MIPS64R6-NEXT:    sll $3, $1, 3
3606; MIPS64R6-NEXT:    ori $1, $zero, 255
3607; MIPS64R6-NEXT:    sllv $5, $1, $3
3608; MIPS64R6-NEXT:    nor $6, $zero, $5
3609; MIPS64R6-NEXT:    sllv $4, $4, $3
3610; MIPS64R6-NEXT:  .LBB10_1: # %entry
3611; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
3612; MIPS64R6-NEXT:    ll $7, 0($2)
3613; MIPS64R6-NEXT:    and $8, $7, $4
3614; MIPS64R6-NEXT:    nor $8, $zero, $8
3615; MIPS64R6-NEXT:    and $8, $8, $5
3616; MIPS64R6-NEXT:    and $9, $7, $6
3617; MIPS64R6-NEXT:    or $9, $9, $8
3618; MIPS64R6-NEXT:    sc $9, 0($2)
3619; MIPS64R6-NEXT:    beqzc $9, .LBB10_1
3620; MIPS64R6-NEXT:  # %bb.2: # %entry
3621; MIPS64R6-NEXT:    and $1, $7, $5
3622; MIPS64R6-NEXT:    srlv $1, $1, $3
3623; MIPS64R6-NEXT:    seb $1, $1
3624; MIPS64R6-NEXT:  # %bb.3: # %entry
3625; MIPS64R6-NEXT:    jr $ra
3626; MIPS64R6-NEXT:    seb $2, $1
3627;
3628; MIPS64R6O0-LABEL: AtomicLoadNand8:
3629; MIPS64R6O0:       # %bb.0: # %entry
3630; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
3631; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3632; MIPS64R6O0-NEXT:    daddu $1, $1, $25
3633; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3634; MIPS64R6O0-NEXT:    move $2, $4
3635; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
3636; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
3637; MIPS64R6O0-NEXT:    and $3, $1, $3
3638; MIPS64R6O0-NEXT:    andi $5, $1, 3
3639; MIPS64R6O0-NEXT:    xori $5, $5, 3
3640; MIPS64R6O0-NEXT:    sll $5, $5, 3
3641; MIPS64R6O0-NEXT:    ori $6, $zero, 255
3642; MIPS64R6O0-NEXT:    sllv $6, $6, $5
3643; MIPS64R6O0-NEXT:    nor $7, $zero, $6
3644; MIPS64R6O0-NEXT:    sllv $2, $2, $5
3645; MIPS64R6O0-NEXT:  .LBB10_1: # %entry
3646; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3647; MIPS64R6O0-NEXT:    ll $9, 0($3)
3648; MIPS64R6O0-NEXT:    and $10, $9, $2
3649; MIPS64R6O0-NEXT:    nor $10, $zero, $10
3650; MIPS64R6O0-NEXT:    and $10, $10, $6
3651; MIPS64R6O0-NEXT:    and $11, $9, $7
3652; MIPS64R6O0-NEXT:    or $11, $11, $10
3653; MIPS64R6O0-NEXT:    sc $11, 0($3)
3654; MIPS64R6O0-NEXT:    beqzc $11, .LBB10_1
3655; MIPS64R6O0-NEXT:  # %bb.2: # %entry
3656; MIPS64R6O0-NEXT:    and $8, $9, $6
3657; MIPS64R6O0-NEXT:    srlv $8, $8, $5
3658; MIPS64R6O0-NEXT:    seb $8, $8
3659; MIPS64R6O0-NEXT:  # %bb.3: # %entry
3660; MIPS64R6O0-NEXT:    sw $8, 12($sp) # 4-byte Folded Spill
3661; MIPS64R6O0-NEXT:  # %bb.4: # %entry
3662; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
3663; MIPS64R6O0-NEXT:    seb $2, $1
3664; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
3665; MIPS64R6O0-NEXT:    jrc $ra
3666;
3667; MM32-LABEL: AtomicLoadNand8:
3668; MM32:       # %bb.0: # %entry
3669; MM32-NEXT:    lui $2, %hi(_gp_disp)
3670; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3671; MM32-NEXT:    addu $2, $2, $25
3672; MM32-NEXT:    lw $1, %got(y)($2)
3673; MM32-NEXT:    addiu $2, $zero, -4
3674; MM32-NEXT:    and $2, $1, $2
3675; MM32-NEXT:    andi $1, $1, 3
3676; MM32-NEXT:    sll $3, $1, 3
3677; MM32-NEXT:    ori $1, $zero, 255
3678; MM32-NEXT:    sllv $5, $1, $3
3679; MM32-NEXT:    nor $6, $zero, $5
3680; MM32-NEXT:    sllv $4, $4, $3
3681; MM32-NEXT:  $BB10_1: # %entry
3682; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
3683; MM32-NEXT:    ll $7, 0($2)
3684; MM32-NEXT:    and $8, $7, $4
3685; MM32-NEXT:    nor $8, $zero, $8
3686; MM32-NEXT:    and $8, $8, $5
3687; MM32-NEXT:    and $9, $7, $6
3688; MM32-NEXT:    or $9, $9, $8
3689; MM32-NEXT:    sc $9, 0($2)
3690; MM32-NEXT:    beqzc $9, $BB10_1
3691; MM32-NEXT:  # %bb.2: # %entry
3692; MM32-NEXT:    and $1, $7, $5
3693; MM32-NEXT:    srlv $1, $1, $3
3694; MM32-NEXT:    seb $1, $1
3695; MM32-NEXT:  # %bb.3: # %entry
3696; MM32-NEXT:    jr $ra
3697; MM32-NEXT:    seb $2, $1
3698;
3699; O1-LABEL: AtomicLoadNand8:
3700; O1:       # %bb.0: # %entry
3701; O1-NEXT:    lui $2, %hi(_gp_disp)
3702; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
3703; O1-NEXT:    addu $1, $2, $25
3704; O1-NEXT:    lw $1, %got(y)($1)
3705; O1-NEXT:    addiu $2, $zero, -4
3706; O1-NEXT:    and $2, $1, $2
3707; O1-NEXT:    andi $1, $1, 3
3708; O1-NEXT:    sll $3, $1, 3
3709; O1-NEXT:    ori $1, $zero, 255
3710; O1-NEXT:    sllv $5, $1, $3
3711; O1-NEXT:    nor $6, $zero, $5
3712; O1-NEXT:    sllv $4, $4, $3
3713; O1-NEXT:  $BB10_1: # %entry
3714; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3715; O1-NEXT:    ll $7, 0($2)
3716; O1-NEXT:    and $8, $7, $4
3717; O1-NEXT:    nor $8, $zero, $8
3718; O1-NEXT:    and $8, $8, $5
3719; O1-NEXT:    and $9, $7, $6
3720; O1-NEXT:    or $9, $9, $8
3721; O1-NEXT:    sc $9, 0($2)
3722; O1-NEXT:    beqz $9, $BB10_1
3723; O1-NEXT:    nop
3724; O1-NEXT:  # %bb.2: # %entry
3725; O1-NEXT:    and $1, $7, $5
3726; O1-NEXT:    srlv $1, $1, $3
3727; O1-NEXT:    sll $1, $1, 24
3728; O1-NEXT:    sra $1, $1, 24
3729; O1-NEXT:  # %bb.3: # %entry
3730; O1-NEXT:    sll $1, $1, 24
3731; O1-NEXT:    jr $ra
3732; O1-NEXT:    sra $2, $1, 24
3733;
3734; O2-LABEL: AtomicLoadNand8:
3735; O2:       # %bb.0: # %entry
3736; O2-NEXT:    lui $2, %hi(_gp_disp)
3737; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3738; O2-NEXT:    addu $1, $2, $25
3739; O2-NEXT:    lw $1, %got(y)($1)
3740; O2-NEXT:    addiu $2, $zero, -4
3741; O2-NEXT:    and $2, $1, $2
3742; O2-NEXT:    andi $1, $1, 3
3743; O2-NEXT:    sll $3, $1, 3
3744; O2-NEXT:    ori $1, $zero, 255
3745; O2-NEXT:    sllv $5, $1, $3
3746; O2-NEXT:    nor $6, $zero, $5
3747; O2-NEXT:    sllv $4, $4, $3
3748; O2-NEXT:  $BB10_1: # %entry
3749; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3750; O2-NEXT:    ll $7, 0($2)
3751; O2-NEXT:    and $8, $7, $4
3752; O2-NEXT:    nor $8, $zero, $8
3753; O2-NEXT:    and $8, $8, $5
3754; O2-NEXT:    and $9, $7, $6
3755; O2-NEXT:    or $9, $9, $8
3756; O2-NEXT:    sc $9, 0($2)
3757; O2-NEXT:    beqz $9, $BB10_1
3758; O2-NEXT:    nop
3759; O2-NEXT:  # %bb.2: # %entry
3760; O2-NEXT:    and $1, $7, $5
3761; O2-NEXT:    srlv $1, $1, $3
3762; O2-NEXT:    sll $1, $1, 24
3763; O2-NEXT:    sra $1, $1, 24
3764; O2-NEXT:  # %bb.3: # %entry
3765; O2-NEXT:    sll $1, $1, 24
3766; O2-NEXT:    jr $ra
3767; O2-NEXT:    sra $2, $1, 24
3768;
3769; O3-LABEL: AtomicLoadNand8:
3770; O3:       # %bb.0: # %entry
3771; O3-NEXT:    lui $2, %hi(_gp_disp)
3772; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
3773; O3-NEXT:    addu $1, $2, $25
3774; O3-NEXT:    addiu $2, $zero, -4
3775; O3-NEXT:    lw $1, %got(y)($1)
3776; O3-NEXT:    and $2, $1, $2
3777; O3-NEXT:    andi $1, $1, 3
3778; O3-NEXT:    sll $3, $1, 3
3779; O3-NEXT:    ori $1, $zero, 255
3780; O3-NEXT:    sllv $5, $1, $3
3781; O3-NEXT:    sllv $4, $4, $3
3782; O3-NEXT:    nor $6, $zero, $5
3783; O3-NEXT:  $BB10_1: # %entry
3784; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3785; O3-NEXT:    ll $7, 0($2)
3786; O3-NEXT:    and $8, $7, $4
3787; O3-NEXT:    nor $8, $zero, $8
3788; O3-NEXT:    and $8, $8, $5
3789; O3-NEXT:    and $9, $7, $6
3790; O3-NEXT:    or $9, $9, $8
3791; O3-NEXT:    sc $9, 0($2)
3792; O3-NEXT:    beqz $9, $BB10_1
3793; O3-NEXT:    nop
3794; O3-NEXT:  # %bb.2: # %entry
3795; O3-NEXT:    and $1, $7, $5
3796; O3-NEXT:    srlv $1, $1, $3
3797; O3-NEXT:    sll $1, $1, 24
3798; O3-NEXT:    sra $1, $1, 24
3799; O3-NEXT:  # %bb.3: # %entry
3800; O3-NEXT:    sll $1, $1, 24
3801; O3-NEXT:    jr $ra
3802; O3-NEXT:    sra $2, $1, 24
3803;
3804; MIPS32EB-LABEL: AtomicLoadNand8:
3805; MIPS32EB:       # %bb.0: # %entry
3806; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
3807; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
3808; MIPS32EB-NEXT:    addu $1, $2, $25
3809; MIPS32EB-NEXT:    lw $1, %got(y)($1)
3810; MIPS32EB-NEXT:    addiu $2, $zero, -4
3811; MIPS32EB-NEXT:    and $2, $1, $2
3812; MIPS32EB-NEXT:    andi $1, $1, 3
3813; MIPS32EB-NEXT:    xori $1, $1, 3
3814; MIPS32EB-NEXT:    sll $3, $1, 3
3815; MIPS32EB-NEXT:    ori $1, $zero, 255
3816; MIPS32EB-NEXT:    sllv $5, $1, $3
3817; MIPS32EB-NEXT:    nor $6, $zero, $5
3818; MIPS32EB-NEXT:    sllv $4, $4, $3
3819; MIPS32EB-NEXT:  $BB10_1: # %entry
3820; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
3821; MIPS32EB-NEXT:    ll $7, 0($2)
3822; MIPS32EB-NEXT:    and $8, $7, $4
3823; MIPS32EB-NEXT:    nor $8, $zero, $8
3824; MIPS32EB-NEXT:    and $8, $8, $5
3825; MIPS32EB-NEXT:    and $9, $7, $6
3826; MIPS32EB-NEXT:    or $9, $9, $8
3827; MIPS32EB-NEXT:    sc $9, 0($2)
3828; MIPS32EB-NEXT:    beqz $9, $BB10_1
3829; MIPS32EB-NEXT:    nop
3830; MIPS32EB-NEXT:  # %bb.2: # %entry
3831; MIPS32EB-NEXT:    and $1, $7, $5
3832; MIPS32EB-NEXT:    srlv $1, $1, $3
3833; MIPS32EB-NEXT:    sll $1, $1, 24
3834; MIPS32EB-NEXT:    sra $1, $1, 24
3835; MIPS32EB-NEXT:  # %bb.3: # %entry
3836; MIPS32EB-NEXT:    sll $1, $1, 24
3837; MIPS32EB-NEXT:    jr $ra
3838; MIPS32EB-NEXT:    sra $2, $1, 24
3839entry:
3840  %0 = atomicrmw nand i8* @y, i8 %incr monotonic
3841  ret i8 %0
3842
3843}
3844
3845define signext i8 @AtomicSwap8(i8 signext %newval) nounwind {
3846; MIPS32-LABEL: AtomicSwap8:
3847; MIPS32:       # %bb.0: # %entry
3848; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
3849; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3850; MIPS32-NEXT:    addu $1, $2, $25
3851; MIPS32-NEXT:    lw $1, %got(y)($1)
3852; MIPS32-NEXT:    addiu $2, $zero, -4
3853; MIPS32-NEXT:    and $2, $1, $2
3854; MIPS32-NEXT:    andi $1, $1, 3
3855; MIPS32-NEXT:    sll $3, $1, 3
3856; MIPS32-NEXT:    ori $1, $zero, 255
3857; MIPS32-NEXT:    sllv $5, $1, $3
3858; MIPS32-NEXT:    nor $6, $zero, $5
3859; MIPS32-NEXT:    sllv $4, $4, $3
3860; MIPS32-NEXT:  $BB11_1: # %entry
3861; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
3862; MIPS32-NEXT:    ll $7, 0($2)
3863; MIPS32-NEXT:    and $8, $4, $5
3864; MIPS32-NEXT:    and $9, $7, $6
3865; MIPS32-NEXT:    or $9, $9, $8
3866; MIPS32-NEXT:    sc $9, 0($2)
3867; MIPS32-NEXT:    beqz $9, $BB11_1
3868; MIPS32-NEXT:    nop
3869; MIPS32-NEXT:  # %bb.2: # %entry
3870; MIPS32-NEXT:    and $1, $7, $5
3871; MIPS32-NEXT:    srlv $1, $1, $3
3872; MIPS32-NEXT:    sll $1, $1, 24
3873; MIPS32-NEXT:    sra $1, $1, 24
3874; MIPS32-NEXT:  # %bb.3: # %entry
3875; MIPS32-NEXT:    sll $1, $1, 24
3876; MIPS32-NEXT:    jr $ra
3877; MIPS32-NEXT:    sra $2, $1, 24
3878;
3879; MIPS32O0-LABEL: AtomicSwap8:
3880; MIPS32O0:       # %bb.0: # %entry
3881; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
3882; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3883; MIPS32O0-NEXT:    addiu $sp, $sp, -8
3884; MIPS32O0-NEXT:    addu $1, $2, $25
3885; MIPS32O0-NEXT:    lw $1, %got(y)($1)
3886; MIPS32O0-NEXT:    addiu $2, $zero, -4
3887; MIPS32O0-NEXT:    and $2, $1, $2
3888; MIPS32O0-NEXT:    andi $1, $1, 3
3889; MIPS32O0-NEXT:    sll $1, $1, 3
3890; MIPS32O0-NEXT:    ori $3, $zero, 255
3891; MIPS32O0-NEXT:    sllv $3, $3, $1
3892; MIPS32O0-NEXT:    nor $5, $zero, $3
3893; MIPS32O0-NEXT:    sllv $4, $4, $1
3894; MIPS32O0-NEXT:  $BB11_1: # %entry
3895; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
3896; MIPS32O0-NEXT:    ll $7, 0($2)
3897; MIPS32O0-NEXT:    and $8, $4, $3
3898; MIPS32O0-NEXT:    and $9, $7, $5
3899; MIPS32O0-NEXT:    or $9, $9, $8
3900; MIPS32O0-NEXT:    sc $9, 0($2)
3901; MIPS32O0-NEXT:    beqz $9, $BB11_1
3902; MIPS32O0-NEXT:    nop
3903; MIPS32O0-NEXT:  # %bb.2: # %entry
3904; MIPS32O0-NEXT:    and $6, $7, $3
3905; MIPS32O0-NEXT:    srlv $6, $6, $1
3906; MIPS32O0-NEXT:    sll $6, $6, 24
3907; MIPS32O0-NEXT:    sra $6, $6, 24
3908; MIPS32O0-NEXT:  # %bb.3: # %entry
3909; MIPS32O0-NEXT:    sw $6, 4($sp) # 4-byte Folded Spill
3910; MIPS32O0-NEXT:  # %bb.4: # %entry
3911; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3912; MIPS32O0-NEXT:    sll $2, $1, 24
3913; MIPS32O0-NEXT:    sra $2, $2, 24
3914; MIPS32O0-NEXT:    addiu $sp, $sp, 8
3915; MIPS32O0-NEXT:    jr $ra
3916; MIPS32O0-NEXT:    nop
3917;
3918; MIPS32R2-LABEL: AtomicSwap8:
3919; MIPS32R2:       # %bb.0: # %entry
3920; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
3921; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3922; MIPS32R2-NEXT:    addu $1, $2, $25
3923; MIPS32R2-NEXT:    lw $1, %got(y)($1)
3924; MIPS32R2-NEXT:    addiu $2, $zero, -4
3925; MIPS32R2-NEXT:    and $2, $1, $2
3926; MIPS32R2-NEXT:    andi $1, $1, 3
3927; MIPS32R2-NEXT:    sll $3, $1, 3
3928; MIPS32R2-NEXT:    ori $1, $zero, 255
3929; MIPS32R2-NEXT:    sllv $5, $1, $3
3930; MIPS32R2-NEXT:    nor $6, $zero, $5
3931; MIPS32R2-NEXT:    sllv $4, $4, $3
3932; MIPS32R2-NEXT:  $BB11_1: # %entry
3933; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
3934; MIPS32R2-NEXT:    ll $7, 0($2)
3935; MIPS32R2-NEXT:    and $8, $4, $5
3936; MIPS32R2-NEXT:    and $9, $7, $6
3937; MIPS32R2-NEXT:    or $9, $9, $8
3938; MIPS32R2-NEXT:    sc $9, 0($2)
3939; MIPS32R2-NEXT:    beqz $9, $BB11_1
3940; MIPS32R2-NEXT:    nop
3941; MIPS32R2-NEXT:  # %bb.2: # %entry
3942; MIPS32R2-NEXT:    and $1, $7, $5
3943; MIPS32R2-NEXT:    srlv $1, $1, $3
3944; MIPS32R2-NEXT:    seb $1, $1
3945; MIPS32R2-NEXT:  # %bb.3: # %entry
3946; MIPS32R2-NEXT:    jr $ra
3947; MIPS32R2-NEXT:    seb $2, $1
3948;
3949; MIPS32R6-LABEL: AtomicSwap8:
3950; MIPS32R6:       # %bb.0: # %entry
3951; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
3952; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
3953; MIPS32R6-NEXT:    addu $1, $2, $25
3954; MIPS32R6-NEXT:    lw $1, %got(y)($1)
3955; MIPS32R6-NEXT:    addiu $2, $zero, -4
3956; MIPS32R6-NEXT:    and $2, $1, $2
3957; MIPS32R6-NEXT:    andi $1, $1, 3
3958; MIPS32R6-NEXT:    sll $3, $1, 3
3959; MIPS32R6-NEXT:    ori $1, $zero, 255
3960; MIPS32R6-NEXT:    sllv $5, $1, $3
3961; MIPS32R6-NEXT:    nor $6, $zero, $5
3962; MIPS32R6-NEXT:    sllv $4, $4, $3
3963; MIPS32R6-NEXT:  $BB11_1: # %entry
3964; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
3965; MIPS32R6-NEXT:    ll $7, 0($2)
3966; MIPS32R6-NEXT:    and $8, $4, $5
3967; MIPS32R6-NEXT:    and $9, $7, $6
3968; MIPS32R6-NEXT:    or $9, $9, $8
3969; MIPS32R6-NEXT:    sc $9, 0($2)
3970; MIPS32R6-NEXT:    beqzc $9, $BB11_1
3971; MIPS32R6-NEXT:  # %bb.2: # %entry
3972; MIPS32R6-NEXT:    and $1, $7, $5
3973; MIPS32R6-NEXT:    srlv $1, $1, $3
3974; MIPS32R6-NEXT:    seb $1, $1
3975; MIPS32R6-NEXT:  # %bb.3: # %entry
3976; MIPS32R6-NEXT:    jr $ra
3977; MIPS32R6-NEXT:    seb $2, $1
3978;
3979; MIPS32R6O0-LABEL: AtomicSwap8:
3980; MIPS32R6O0:       # %bb.0: # %entry
3981; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
3982; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3983; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
3984; MIPS32R6O0-NEXT:    addu $1, $2, $25
3985; MIPS32R6O0-NEXT:    move $2, $4
3986; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
3987; MIPS32R6O0-NEXT:    addiu $3, $zero, -4
3988; MIPS32R6O0-NEXT:    and $3, $1, $3
3989; MIPS32R6O0-NEXT:    andi $1, $1, 3
3990; MIPS32R6O0-NEXT:    sll $1, $1, 3
3991; MIPS32R6O0-NEXT:    ori $5, $zero, 255
3992; MIPS32R6O0-NEXT:    sllv $5, $5, $1
3993; MIPS32R6O0-NEXT:    nor $6, $zero, $5
3994; MIPS32R6O0-NEXT:    sllv $4, $4, $1
3995; MIPS32R6O0-NEXT:  $BB11_1: # %entry
3996; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3997; MIPS32R6O0-NEXT:    ll $8, 0($3)
3998; MIPS32R6O0-NEXT:    and $9, $4, $5
3999; MIPS32R6O0-NEXT:    and $10, $8, $6
4000; MIPS32R6O0-NEXT:    or $10, $10, $9
4001; MIPS32R6O0-NEXT:    sc $10, 0($3)
4002; MIPS32R6O0-NEXT:    beqzc $10, $BB11_1
4003; MIPS32R6O0-NEXT:  # %bb.2: # %entry
4004; MIPS32R6O0-NEXT:    and $7, $8, $5
4005; MIPS32R6O0-NEXT:    srlv $7, $7, $1
4006; MIPS32R6O0-NEXT:    seb $7, $7
4007; MIPS32R6O0-NEXT:  # %bb.3: # %entry
4008; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
4009; MIPS32R6O0-NEXT:    sw $7, 0($sp) # 4-byte Folded Spill
4010; MIPS32R6O0-NEXT:  # %bb.4: # %entry
4011; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
4012; MIPS32R6O0-NEXT:    seb $2, $1
4013; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
4014; MIPS32R6O0-NEXT:    jrc $ra
4015;
4016; MIPS4-LABEL: AtomicSwap8:
4017; MIPS4:       # %bb.0: # %entry
4018; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4019; MIPS4-NEXT:    daddu $1, $1, $25
4020; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4021; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
4022; MIPS4-NEXT:    daddiu $2, $zero, -4
4023; MIPS4-NEXT:    and $2, $1, $2
4024; MIPS4-NEXT:    andi $1, $1, 3
4025; MIPS4-NEXT:    sll $3, $1, 3
4026; MIPS4-NEXT:    ori $1, $zero, 255
4027; MIPS4-NEXT:    sllv $5, $1, $3
4028; MIPS4-NEXT:    nor $6, $zero, $5
4029; MIPS4-NEXT:    sllv $4, $4, $3
4030; MIPS4-NEXT:  .LBB11_1: # %entry
4031; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
4032; MIPS4-NEXT:    ll $7, 0($2)
4033; MIPS4-NEXT:    and $8, $4, $5
4034; MIPS4-NEXT:    and $9, $7, $6
4035; MIPS4-NEXT:    or $9, $9, $8
4036; MIPS4-NEXT:    sc $9, 0($2)
4037; MIPS4-NEXT:    beqz $9, .LBB11_1
4038; MIPS4-NEXT:    nop
4039; MIPS4-NEXT:  # %bb.2: # %entry
4040; MIPS4-NEXT:    and $1, $7, $5
4041; MIPS4-NEXT:    srlv $1, $1, $3
4042; MIPS4-NEXT:    sll $1, $1, 24
4043; MIPS4-NEXT:    sra $1, $1, 24
4044; MIPS4-NEXT:  # %bb.3: # %entry
4045; MIPS4-NEXT:    sll $1, $1, 24
4046; MIPS4-NEXT:    jr $ra
4047; MIPS4-NEXT:    sra $2, $1, 24
4048;
4049; MIPS64-LABEL: AtomicSwap8:
4050; MIPS64:       # %bb.0: # %entry
4051; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4052; MIPS64-NEXT:    daddu $1, $1, $25
4053; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4054; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
4055; MIPS64-NEXT:    daddiu $2, $zero, -4
4056; MIPS64-NEXT:    and $2, $1, $2
4057; MIPS64-NEXT:    andi $1, $1, 3
4058; MIPS64-NEXT:    sll $3, $1, 3
4059; MIPS64-NEXT:    ori $1, $zero, 255
4060; MIPS64-NEXT:    sllv $5, $1, $3
4061; MIPS64-NEXT:    nor $6, $zero, $5
4062; MIPS64-NEXT:    sllv $4, $4, $3
4063; MIPS64-NEXT:  .LBB11_1: # %entry
4064; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
4065; MIPS64-NEXT:    ll $7, 0($2)
4066; MIPS64-NEXT:    and $8, $4, $5
4067; MIPS64-NEXT:    and $9, $7, $6
4068; MIPS64-NEXT:    or $9, $9, $8
4069; MIPS64-NEXT:    sc $9, 0($2)
4070; MIPS64-NEXT:    beqz $9, .LBB11_1
4071; MIPS64-NEXT:    nop
4072; MIPS64-NEXT:  # %bb.2: # %entry
4073; MIPS64-NEXT:    and $1, $7, $5
4074; MIPS64-NEXT:    srlv $1, $1, $3
4075; MIPS64-NEXT:    sll $1, $1, 24
4076; MIPS64-NEXT:    sra $1, $1, 24
4077; MIPS64-NEXT:  # %bb.3: # %entry
4078; MIPS64-NEXT:    sll $1, $1, 24
4079; MIPS64-NEXT:    jr $ra
4080; MIPS64-NEXT:    sra $2, $1, 24
4081;
4082; MIPS64R2-LABEL: AtomicSwap8:
4083; MIPS64R2:       # %bb.0: # %entry
4084; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4085; MIPS64R2-NEXT:    daddu $1, $1, $25
4086; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4087; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
4088; MIPS64R2-NEXT:    daddiu $2, $zero, -4
4089; MIPS64R2-NEXT:    and $2, $1, $2
4090; MIPS64R2-NEXT:    andi $1, $1, 3
4091; MIPS64R2-NEXT:    sll $3, $1, 3
4092; MIPS64R2-NEXT:    ori $1, $zero, 255
4093; MIPS64R2-NEXT:    sllv $5, $1, $3
4094; MIPS64R2-NEXT:    nor $6, $zero, $5
4095; MIPS64R2-NEXT:    sllv $4, $4, $3
4096; MIPS64R2-NEXT:  .LBB11_1: # %entry
4097; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
4098; MIPS64R2-NEXT:    ll $7, 0($2)
4099; MIPS64R2-NEXT:    and $8, $4, $5
4100; MIPS64R2-NEXT:    and $9, $7, $6
4101; MIPS64R2-NEXT:    or $9, $9, $8
4102; MIPS64R2-NEXT:    sc $9, 0($2)
4103; MIPS64R2-NEXT:    beqz $9, .LBB11_1
4104; MIPS64R2-NEXT:    nop
4105; MIPS64R2-NEXT:  # %bb.2: # %entry
4106; MIPS64R2-NEXT:    and $1, $7, $5
4107; MIPS64R2-NEXT:    srlv $1, $1, $3
4108; MIPS64R2-NEXT:    seb $1, $1
4109; MIPS64R2-NEXT:  # %bb.3: # %entry
4110; MIPS64R2-NEXT:    jr $ra
4111; MIPS64R2-NEXT:    seb $2, $1
4112;
4113; MIPS64R6-LABEL: AtomicSwap8:
4114; MIPS64R6:       # %bb.0: # %entry
4115; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4116; MIPS64R6-NEXT:    daddu $1, $1, $25
4117; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4118; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
4119; MIPS64R6-NEXT:    daddiu $2, $zero, -4
4120; MIPS64R6-NEXT:    and $2, $1, $2
4121; MIPS64R6-NEXT:    andi $1, $1, 3
4122; MIPS64R6-NEXT:    sll $3, $1, 3
4123; MIPS64R6-NEXT:    ori $1, $zero, 255
4124; MIPS64R6-NEXT:    sllv $5, $1, $3
4125; MIPS64R6-NEXT:    nor $6, $zero, $5
4126; MIPS64R6-NEXT:    sllv $4, $4, $3
4127; MIPS64R6-NEXT:  .LBB11_1: # %entry
4128; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
4129; MIPS64R6-NEXT:    ll $7, 0($2)
4130; MIPS64R6-NEXT:    and $8, $4, $5
4131; MIPS64R6-NEXT:    and $9, $7, $6
4132; MIPS64R6-NEXT:    or $9, $9, $8
4133; MIPS64R6-NEXT:    sc $9, 0($2)
4134; MIPS64R6-NEXT:    beqzc $9, .LBB11_1
4135; MIPS64R6-NEXT:  # %bb.2: # %entry
4136; MIPS64R6-NEXT:    and $1, $7, $5
4137; MIPS64R6-NEXT:    srlv $1, $1, $3
4138; MIPS64R6-NEXT:    seb $1, $1
4139; MIPS64R6-NEXT:  # %bb.3: # %entry
4140; MIPS64R6-NEXT:    jr $ra
4141; MIPS64R6-NEXT:    seb $2, $1
4142;
4143; MIPS64R6O0-LABEL: AtomicSwap8:
4144; MIPS64R6O0:       # %bb.0: # %entry
4145; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
4146; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4147; MIPS64R6O0-NEXT:    daddu $1, $1, $25
4148; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4149; MIPS64R6O0-NEXT:    move $2, $4
4150; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
4151; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
4152; MIPS64R6O0-NEXT:    and $3, $1, $3
4153; MIPS64R6O0-NEXT:    andi $5, $1, 3
4154; MIPS64R6O0-NEXT:    xori $5, $5, 3
4155; MIPS64R6O0-NEXT:    sll $5, $5, 3
4156; MIPS64R6O0-NEXT:    ori $6, $zero, 255
4157; MIPS64R6O0-NEXT:    sllv $6, $6, $5
4158; MIPS64R6O0-NEXT:    nor $7, $zero, $6
4159; MIPS64R6O0-NEXT:    sllv $2, $2, $5
4160; MIPS64R6O0-NEXT:  .LBB11_1: # %entry
4161; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4162; MIPS64R6O0-NEXT:    ll $9, 0($3)
4163; MIPS64R6O0-NEXT:    and $10, $2, $6
4164; MIPS64R6O0-NEXT:    and $11, $9, $7
4165; MIPS64R6O0-NEXT:    or $11, $11, $10
4166; MIPS64R6O0-NEXT:    sc $11, 0($3)
4167; MIPS64R6O0-NEXT:    beqzc $11, .LBB11_1
4168; MIPS64R6O0-NEXT:  # %bb.2: # %entry
4169; MIPS64R6O0-NEXT:    and $8, $9, $6
4170; MIPS64R6O0-NEXT:    srlv $8, $8, $5
4171; MIPS64R6O0-NEXT:    seb $8, $8
4172; MIPS64R6O0-NEXT:  # %bb.3: # %entry
4173; MIPS64R6O0-NEXT:    sw $8, 12($sp) # 4-byte Folded Spill
4174; MIPS64R6O0-NEXT:  # %bb.4: # %entry
4175; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
4176; MIPS64R6O0-NEXT:    seb $2, $1
4177; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
4178; MIPS64R6O0-NEXT:    jrc $ra
4179;
4180; MM32-LABEL: AtomicSwap8:
4181; MM32:       # %bb.0: # %entry
4182; MM32-NEXT:    lui $2, %hi(_gp_disp)
4183; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4184; MM32-NEXT:    addu $2, $2, $25
4185; MM32-NEXT:    lw $1, %got(y)($2)
4186; MM32-NEXT:    addiu $2, $zero, -4
4187; MM32-NEXT:    and $2, $1, $2
4188; MM32-NEXT:    andi $1, $1, 3
4189; MM32-NEXT:    sll $3, $1, 3
4190; MM32-NEXT:    ori $1, $zero, 255
4191; MM32-NEXT:    sllv $5, $1, $3
4192; MM32-NEXT:    nor $6, $zero, $5
4193; MM32-NEXT:    sllv $4, $4, $3
4194; MM32-NEXT:  $BB11_1: # %entry
4195; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
4196; MM32-NEXT:    ll $7, 0($2)
4197; MM32-NEXT:    and $8, $4, $5
4198; MM32-NEXT:    and $9, $7, $6
4199; MM32-NEXT:    or $9, $9, $8
4200; MM32-NEXT:    sc $9, 0($2)
4201; MM32-NEXT:    beqzc $9, $BB11_1
4202; MM32-NEXT:  # %bb.2: # %entry
4203; MM32-NEXT:    and $1, $7, $5
4204; MM32-NEXT:    srlv $1, $1, $3
4205; MM32-NEXT:    seb $1, $1
4206; MM32-NEXT:  # %bb.3: # %entry
4207; MM32-NEXT:    jr $ra
4208; MM32-NEXT:    seb $2, $1
4209;
4210; O1-LABEL: AtomicSwap8:
4211; O1:       # %bb.0: # %entry
4212; O1-NEXT:    lui $2, %hi(_gp_disp)
4213; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
4214; O1-NEXT:    addu $1, $2, $25
4215; O1-NEXT:    lw $1, %got(y)($1)
4216; O1-NEXT:    addiu $2, $zero, -4
4217; O1-NEXT:    and $2, $1, $2
4218; O1-NEXT:    andi $1, $1, 3
4219; O1-NEXT:    sll $3, $1, 3
4220; O1-NEXT:    ori $1, $zero, 255
4221; O1-NEXT:    sllv $5, $1, $3
4222; O1-NEXT:    nor $6, $zero, $5
4223; O1-NEXT:    sllv $4, $4, $3
4224; O1-NEXT:  $BB11_1: # %entry
4225; O1-NEXT:    # =>This Inner Loop Header: Depth=1
4226; O1-NEXT:    ll $7, 0($2)
4227; O1-NEXT:    and $8, $4, $5
4228; O1-NEXT:    and $9, $7, $6
4229; O1-NEXT:    or $9, $9, $8
4230; O1-NEXT:    sc $9, 0($2)
4231; O1-NEXT:    beqz $9, $BB11_1
4232; O1-NEXT:    nop
4233; O1-NEXT:  # %bb.2: # %entry
4234; O1-NEXT:    and $1, $7, $5
4235; O1-NEXT:    srlv $1, $1, $3
4236; O1-NEXT:    sll $1, $1, 24
4237; O1-NEXT:    sra $1, $1, 24
4238; O1-NEXT:  # %bb.3: # %entry
4239; O1-NEXT:    sll $1, $1, 24
4240; O1-NEXT:    jr $ra
4241; O1-NEXT:    sra $2, $1, 24
4242;
4243; O2-LABEL: AtomicSwap8:
4244; O2:       # %bb.0: # %entry
4245; O2-NEXT:    lui $2, %hi(_gp_disp)
4246; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4247; O2-NEXT:    addu $1, $2, $25
4248; O2-NEXT:    lw $1, %got(y)($1)
4249; O2-NEXT:    addiu $2, $zero, -4
4250; O2-NEXT:    and $2, $1, $2
4251; O2-NEXT:    andi $1, $1, 3
4252; O2-NEXT:    sll $3, $1, 3
4253; O2-NEXT:    ori $1, $zero, 255
4254; O2-NEXT:    sllv $5, $1, $3
4255; O2-NEXT:    nor $6, $zero, $5
4256; O2-NEXT:    sllv $4, $4, $3
4257; O2-NEXT:  $BB11_1: # %entry
4258; O2-NEXT:    # =>This Inner Loop Header: Depth=1
4259; O2-NEXT:    ll $7, 0($2)
4260; O2-NEXT:    and $8, $4, $5
4261; O2-NEXT:    and $9, $7, $6
4262; O2-NEXT:    or $9, $9, $8
4263; O2-NEXT:    sc $9, 0($2)
4264; O2-NEXT:    beqz $9, $BB11_1
4265; O2-NEXT:    nop
4266; O2-NEXT:  # %bb.2: # %entry
4267; O2-NEXT:    and $1, $7, $5
4268; O2-NEXT:    srlv $1, $1, $3
4269; O2-NEXT:    sll $1, $1, 24
4270; O2-NEXT:    sra $1, $1, 24
4271; O2-NEXT:  # %bb.3: # %entry
4272; O2-NEXT:    sll $1, $1, 24
4273; O2-NEXT:    jr $ra
4274; O2-NEXT:    sra $2, $1, 24
4275;
4276; O3-LABEL: AtomicSwap8:
4277; O3:       # %bb.0: # %entry
4278; O3-NEXT:    lui $2, %hi(_gp_disp)
4279; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
4280; O3-NEXT:    addu $1, $2, $25
4281; O3-NEXT:    addiu $2, $zero, -4
4282; O3-NEXT:    lw $1, %got(y)($1)
4283; O3-NEXT:    and $2, $1, $2
4284; O3-NEXT:    andi $1, $1, 3
4285; O3-NEXT:    sll $3, $1, 3
4286; O3-NEXT:    ori $1, $zero, 255
4287; O3-NEXT:    sllv $5, $1, $3
4288; O3-NEXT:    sllv $4, $4, $3
4289; O3-NEXT:    nor $6, $zero, $5
4290; O3-NEXT:  $BB11_1: # %entry
4291; O3-NEXT:    # =>This Inner Loop Header: Depth=1
4292; O3-NEXT:    ll $7, 0($2)
4293; O3-NEXT:    and $8, $4, $5
4294; O3-NEXT:    and $9, $7, $6
4295; O3-NEXT:    or $9, $9, $8
4296; O3-NEXT:    sc $9, 0($2)
4297; O3-NEXT:    beqz $9, $BB11_1
4298; O3-NEXT:    nop
4299; O3-NEXT:  # %bb.2: # %entry
4300; O3-NEXT:    and $1, $7, $5
4301; O3-NEXT:    srlv $1, $1, $3
4302; O3-NEXT:    sll $1, $1, 24
4303; O3-NEXT:    sra $1, $1, 24
4304; O3-NEXT:  # %bb.3: # %entry
4305; O3-NEXT:    sll $1, $1, 24
4306; O3-NEXT:    jr $ra
4307; O3-NEXT:    sra $2, $1, 24
4308;
4309; MIPS32EB-LABEL: AtomicSwap8:
4310; MIPS32EB:       # %bb.0: # %entry
4311; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
4312; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
4313; MIPS32EB-NEXT:    addu $1, $2, $25
4314; MIPS32EB-NEXT:    lw $1, %got(y)($1)
4315; MIPS32EB-NEXT:    addiu $2, $zero, -4
4316; MIPS32EB-NEXT:    and $2, $1, $2
4317; MIPS32EB-NEXT:    andi $1, $1, 3
4318; MIPS32EB-NEXT:    xori $1, $1, 3
4319; MIPS32EB-NEXT:    sll $3, $1, 3
4320; MIPS32EB-NEXT:    ori $1, $zero, 255
4321; MIPS32EB-NEXT:    sllv $5, $1, $3
4322; MIPS32EB-NEXT:    nor $6, $zero, $5
4323; MIPS32EB-NEXT:    sllv $4, $4, $3
4324; MIPS32EB-NEXT:  $BB11_1: # %entry
4325; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
4326; MIPS32EB-NEXT:    ll $7, 0($2)
4327; MIPS32EB-NEXT:    and $8, $4, $5
4328; MIPS32EB-NEXT:    and $9, $7, $6
4329; MIPS32EB-NEXT:    or $9, $9, $8
4330; MIPS32EB-NEXT:    sc $9, 0($2)
4331; MIPS32EB-NEXT:    beqz $9, $BB11_1
4332; MIPS32EB-NEXT:    nop
4333; MIPS32EB-NEXT:  # %bb.2: # %entry
4334; MIPS32EB-NEXT:    and $1, $7, $5
4335; MIPS32EB-NEXT:    srlv $1, $1, $3
4336; MIPS32EB-NEXT:    sll $1, $1, 24
4337; MIPS32EB-NEXT:    sra $1, $1, 24
4338; MIPS32EB-NEXT:  # %bb.3: # %entry
4339; MIPS32EB-NEXT:    sll $1, $1, 24
4340; MIPS32EB-NEXT:    jr $ra
4341; MIPS32EB-NEXT:    sra $2, $1, 24
4342entry:
4343  %0 = atomicrmw xchg i8* @y, i8 %newval monotonic
4344  ret i8 %0
4345}
4346
4347define signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind {
4348; MIPS32-LABEL: AtomicCmpSwap8:
4349; MIPS32:       # %bb.0: # %entry
4350; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
4351; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4352; MIPS32-NEXT:    addu $1, $2, $25
4353; MIPS32-NEXT:    lw $1, %got(y)($1)
4354; MIPS32-NEXT:    addiu $2, $zero, -4
4355; MIPS32-NEXT:    and $2, $1, $2
4356; MIPS32-NEXT:    andi $1, $1, 3
4357; MIPS32-NEXT:    sll $3, $1, 3
4358; MIPS32-NEXT:    ori $1, $zero, 255
4359; MIPS32-NEXT:    sllv $6, $1, $3
4360; MIPS32-NEXT:    nor $7, $zero, $6
4361; MIPS32-NEXT:    andi $1, $4, 255
4362; MIPS32-NEXT:    sllv $4, $1, $3
4363; MIPS32-NEXT:    andi $1, $5, 255
4364; MIPS32-NEXT:    sllv $5, $1, $3
4365; MIPS32-NEXT:  $BB12_1: # %entry
4366; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
4367; MIPS32-NEXT:    ll $8, 0($2)
4368; MIPS32-NEXT:    and $9, $8, $6
4369; MIPS32-NEXT:    bne $9, $4, $BB12_3
4370; MIPS32-NEXT:    nop
4371; MIPS32-NEXT:  # %bb.2: # %entry
4372; MIPS32-NEXT:    # in Loop: Header=BB12_1 Depth=1
4373; MIPS32-NEXT:    and $8, $8, $7
4374; MIPS32-NEXT:    or $8, $8, $5
4375; MIPS32-NEXT:    sc $8, 0($2)
4376; MIPS32-NEXT:    beqz $8, $BB12_1
4377; MIPS32-NEXT:    nop
4378; MIPS32-NEXT:  $BB12_3: # %entry
4379; MIPS32-NEXT:    srlv $1, $9, $3
4380; MIPS32-NEXT:    sll $1, $1, 24
4381; MIPS32-NEXT:    sra $1, $1, 24
4382; MIPS32-NEXT:  # %bb.4: # %entry
4383; MIPS32-NEXT:    sll $1, $1, 24
4384; MIPS32-NEXT:    jr $ra
4385; MIPS32-NEXT:    sra $2, $1, 24
4386;
4387; MIPS32O0-LABEL: AtomicCmpSwap8:
4388; MIPS32O0:       # %bb.0: # %entry
4389; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
4390; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
4391; MIPS32O0-NEXT:    addiu $sp, $sp, -8
4392; MIPS32O0-NEXT:    addu $1, $2, $25
4393; MIPS32O0-NEXT:    lw $1, %got(y)($1)
4394; MIPS32O0-NEXT:    addiu $2, $zero, -4
4395; MIPS32O0-NEXT:    and $2, $1, $2
4396; MIPS32O0-NEXT:    andi $1, $1, 3
4397; MIPS32O0-NEXT:    sll $1, $1, 3
4398; MIPS32O0-NEXT:    ori $3, $zero, 255
4399; MIPS32O0-NEXT:    sllv $3, $3, $1
4400; MIPS32O0-NEXT:    nor $6, $zero, $3
4401; MIPS32O0-NEXT:    andi $4, $4, 255
4402; MIPS32O0-NEXT:    sllv $4, $4, $1
4403; MIPS32O0-NEXT:    andi $5, $5, 255
4404; MIPS32O0-NEXT:    sllv $5, $5, $1
4405; MIPS32O0-NEXT:  $BB12_1: # %entry
4406; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
4407; MIPS32O0-NEXT:    ll $8, 0($2)
4408; MIPS32O0-NEXT:    and $9, $8, $3
4409; MIPS32O0-NEXT:    bne $9, $4, $BB12_3
4410; MIPS32O0-NEXT:    nop
4411; MIPS32O0-NEXT:  # %bb.2: # %entry
4412; MIPS32O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4413; MIPS32O0-NEXT:    and $8, $8, $6
4414; MIPS32O0-NEXT:    or $8, $8, $5
4415; MIPS32O0-NEXT:    sc $8, 0($2)
4416; MIPS32O0-NEXT:    beqz $8, $BB12_1
4417; MIPS32O0-NEXT:    nop
4418; MIPS32O0-NEXT:  $BB12_3: # %entry
4419; MIPS32O0-NEXT:    srlv $7, $9, $1
4420; MIPS32O0-NEXT:    sll $7, $7, 24
4421; MIPS32O0-NEXT:    sra $7, $7, 24
4422; MIPS32O0-NEXT:  # %bb.4: # %entry
4423; MIPS32O0-NEXT:    sw $7, 4($sp) # 4-byte Folded Spill
4424; MIPS32O0-NEXT:  # %bb.5: # %entry
4425; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
4426; MIPS32O0-NEXT:    sll $2, $1, 24
4427; MIPS32O0-NEXT:    sra $2, $2, 24
4428; MIPS32O0-NEXT:    addiu $sp, $sp, 8
4429; MIPS32O0-NEXT:    jr $ra
4430; MIPS32O0-NEXT:    nop
4431;
4432; MIPS32R2-LABEL: AtomicCmpSwap8:
4433; MIPS32R2:       # %bb.0: # %entry
4434; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
4435; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4436; MIPS32R2-NEXT:    addu $1, $2, $25
4437; MIPS32R2-NEXT:    lw $1, %got(y)($1)
4438; MIPS32R2-NEXT:    addiu $2, $zero, -4
4439; MIPS32R2-NEXT:    and $3, $1, $2
4440; MIPS32R2-NEXT:    andi $1, $1, 3
4441; MIPS32R2-NEXT:    sll $1, $1, 3
4442; MIPS32R2-NEXT:    ori $2, $zero, 255
4443; MIPS32R2-NEXT:    sllv $6, $2, $1
4444; MIPS32R2-NEXT:    nor $7, $zero, $6
4445; MIPS32R2-NEXT:    andi $2, $4, 255
4446; MIPS32R2-NEXT:    sllv $4, $2, $1
4447; MIPS32R2-NEXT:    andi $2, $5, 255
4448; MIPS32R2-NEXT:    sllv $5, $2, $1
4449; MIPS32R2-NEXT:  $BB12_1: # %entry
4450; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
4451; MIPS32R2-NEXT:    ll $8, 0($3)
4452; MIPS32R2-NEXT:    and $9, $8, $6
4453; MIPS32R2-NEXT:    bne $9, $4, $BB12_3
4454; MIPS32R2-NEXT:    nop
4455; MIPS32R2-NEXT:  # %bb.2: # %entry
4456; MIPS32R2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4457; MIPS32R2-NEXT:    and $8, $8, $7
4458; MIPS32R2-NEXT:    or $8, $8, $5
4459; MIPS32R2-NEXT:    sc $8, 0($3)
4460; MIPS32R2-NEXT:    beqz $8, $BB12_1
4461; MIPS32R2-NEXT:    nop
4462; MIPS32R2-NEXT:  $BB12_3: # %entry
4463; MIPS32R2-NEXT:    srlv $2, $9, $1
4464; MIPS32R2-NEXT:    seb $2, $2
4465; MIPS32R2-NEXT:  # %bb.4: # %entry
4466; MIPS32R2-NEXT:    jr $ra
4467; MIPS32R2-NEXT:    nop
4468;
4469; MIPS32R6-LABEL: AtomicCmpSwap8:
4470; MIPS32R6:       # %bb.0: # %entry
4471; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
4472; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
4473; MIPS32R6-NEXT:    addu $1, $2, $25
4474; MIPS32R6-NEXT:    lw $1, %got(y)($1)
4475; MIPS32R6-NEXT:    addiu $2, $zero, -4
4476; MIPS32R6-NEXT:    and $3, $1, $2
4477; MIPS32R6-NEXT:    andi $1, $1, 3
4478; MIPS32R6-NEXT:    sll $1, $1, 3
4479; MIPS32R6-NEXT:    ori $2, $zero, 255
4480; MIPS32R6-NEXT:    sllv $6, $2, $1
4481; MIPS32R6-NEXT:    nor $7, $zero, $6
4482; MIPS32R6-NEXT:    andi $2, $4, 255
4483; MIPS32R6-NEXT:    sllv $4, $2, $1
4484; MIPS32R6-NEXT:    andi $2, $5, 255
4485; MIPS32R6-NEXT:    sllv $5, $2, $1
4486; MIPS32R6-NEXT:  $BB12_1: # %entry
4487; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
4488; MIPS32R6-NEXT:    ll $8, 0($3)
4489; MIPS32R6-NEXT:    and $9, $8, $6
4490; MIPS32R6-NEXT:    bnec $9, $4, $BB12_3
4491; MIPS32R6-NEXT:  # %bb.2: # %entry
4492; MIPS32R6-NEXT:    # in Loop: Header=BB12_1 Depth=1
4493; MIPS32R6-NEXT:    and $8, $8, $7
4494; MIPS32R6-NEXT:    or $8, $8, $5
4495; MIPS32R6-NEXT:    sc $8, 0($3)
4496; MIPS32R6-NEXT:    beqzc $8, $BB12_1
4497; MIPS32R6-NEXT:  $BB12_3: # %entry
4498; MIPS32R6-NEXT:    srlv $2, $9, $1
4499; MIPS32R6-NEXT:    seb $2, $2
4500; MIPS32R6-NEXT:  # %bb.4: # %entry
4501; MIPS32R6-NEXT:    jrc $ra
4502;
4503; MIPS32R6O0-LABEL: AtomicCmpSwap8:
4504; MIPS32R6O0:       # %bb.0: # %entry
4505; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
4506; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
4507; MIPS32R6O0-NEXT:    addiu $sp, $sp, -16
4508; MIPS32R6O0-NEXT:    addu $1, $2, $25
4509; MIPS32R6O0-NEXT:    move $2, $5
4510; MIPS32R6O0-NEXT:    move $3, $4
4511; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
4512; MIPS32R6O0-NEXT:    addiu $6, $zero, -4
4513; MIPS32R6O0-NEXT:    and $6, $1, $6
4514; MIPS32R6O0-NEXT:    andi $1, $1, 3
4515; MIPS32R6O0-NEXT:    sll $1, $1, 3
4516; MIPS32R6O0-NEXT:    ori $7, $zero, 255
4517; MIPS32R6O0-NEXT:    sllv $7, $7, $1
4518; MIPS32R6O0-NEXT:    nor $8, $zero, $7
4519; MIPS32R6O0-NEXT:    andi $4, $4, 255
4520; MIPS32R6O0-NEXT:    sllv $4, $4, $1
4521; MIPS32R6O0-NEXT:    andi $5, $5, 255
4522; MIPS32R6O0-NEXT:    sllv $5, $5, $1
4523; MIPS32R6O0-NEXT:  $BB12_1: # %entry
4524; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4525; MIPS32R6O0-NEXT:    ll $10, 0($6)
4526; MIPS32R6O0-NEXT:    and $11, $10, $7
4527; MIPS32R6O0-NEXT:    bnec $11, $4, $BB12_3
4528; MIPS32R6O0-NEXT:  # %bb.2: # %entry
4529; MIPS32R6O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4530; MIPS32R6O0-NEXT:    and $10, $10, $8
4531; MIPS32R6O0-NEXT:    or $10, $10, $5
4532; MIPS32R6O0-NEXT:    sc $10, 0($6)
4533; MIPS32R6O0-NEXT:    beqzc $10, $BB12_1
4534; MIPS32R6O0-NEXT:  $BB12_3: # %entry
4535; MIPS32R6O0-NEXT:    srlv $9, $11, $1
4536; MIPS32R6O0-NEXT:    seb $9, $9
4537; MIPS32R6O0-NEXT:  # %bb.4: # %entry
4538; MIPS32R6O0-NEXT:    sw $2, 12($sp) # 4-byte Folded Spill
4539; MIPS32R6O0-NEXT:    sw $3, 8($sp) # 4-byte Folded Spill
4540; MIPS32R6O0-NEXT:    sw $9, 4($sp) # 4-byte Folded Spill
4541; MIPS32R6O0-NEXT:  # %bb.5: # %entry
4542; MIPS32R6O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
4543; MIPS32R6O0-NEXT:    addiu $sp, $sp, 16
4544; MIPS32R6O0-NEXT:    jrc $ra
4545;
4546; MIPS4-LABEL: AtomicCmpSwap8:
4547; MIPS4:       # %bb.0: # %entry
4548; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4549; MIPS4-NEXT:    daddu $1, $1, $25
4550; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4551; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
4552; MIPS4-NEXT:    daddiu $2, $zero, -4
4553; MIPS4-NEXT:    and $2, $1, $2
4554; MIPS4-NEXT:    andi $1, $1, 3
4555; MIPS4-NEXT:    sll $3, $1, 3
4556; MIPS4-NEXT:    ori $1, $zero, 255
4557; MIPS4-NEXT:    sllv $6, $1, $3
4558; MIPS4-NEXT:    nor $7, $zero, $6
4559; MIPS4-NEXT:    andi $1, $4, 255
4560; MIPS4-NEXT:    sllv $4, $1, $3
4561; MIPS4-NEXT:    andi $1, $5, 255
4562; MIPS4-NEXT:    sllv $5, $1, $3
4563; MIPS4-NEXT:  .LBB12_1: # %entry
4564; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
4565; MIPS4-NEXT:    ll $8, 0($2)
4566; MIPS4-NEXT:    and $9, $8, $6
4567; MIPS4-NEXT:    bne $9, $4, .LBB12_3
4568; MIPS4-NEXT:    nop
4569; MIPS4-NEXT:  # %bb.2: # %entry
4570; MIPS4-NEXT:    # in Loop: Header=BB12_1 Depth=1
4571; MIPS4-NEXT:    and $8, $8, $7
4572; MIPS4-NEXT:    or $8, $8, $5
4573; MIPS4-NEXT:    sc $8, 0($2)
4574; MIPS4-NEXT:    beqz $8, .LBB12_1
4575; MIPS4-NEXT:    nop
4576; MIPS4-NEXT:  .LBB12_3: # %entry
4577; MIPS4-NEXT:    srlv $1, $9, $3
4578; MIPS4-NEXT:    sll $1, $1, 24
4579; MIPS4-NEXT:    sra $1, $1, 24
4580; MIPS4-NEXT:  # %bb.4: # %entry
4581; MIPS4-NEXT:    sll $1, $1, 24
4582; MIPS4-NEXT:    jr $ra
4583; MIPS4-NEXT:    sra $2, $1, 24
4584;
4585; MIPS64-LABEL: AtomicCmpSwap8:
4586; MIPS64:       # %bb.0: # %entry
4587; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4588; MIPS64-NEXT:    daddu $1, $1, $25
4589; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4590; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
4591; MIPS64-NEXT:    daddiu $2, $zero, -4
4592; MIPS64-NEXT:    and $2, $1, $2
4593; MIPS64-NEXT:    andi $1, $1, 3
4594; MIPS64-NEXT:    sll $3, $1, 3
4595; MIPS64-NEXT:    ori $1, $zero, 255
4596; MIPS64-NEXT:    sllv $6, $1, $3
4597; MIPS64-NEXT:    nor $7, $zero, $6
4598; MIPS64-NEXT:    andi $1, $4, 255
4599; MIPS64-NEXT:    sllv $4, $1, $3
4600; MIPS64-NEXT:    andi $1, $5, 255
4601; MIPS64-NEXT:    sllv $5, $1, $3
4602; MIPS64-NEXT:  .LBB12_1: # %entry
4603; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
4604; MIPS64-NEXT:    ll $8, 0($2)
4605; MIPS64-NEXT:    and $9, $8, $6
4606; MIPS64-NEXT:    bne $9, $4, .LBB12_3
4607; MIPS64-NEXT:    nop
4608; MIPS64-NEXT:  # %bb.2: # %entry
4609; MIPS64-NEXT:    # in Loop: Header=BB12_1 Depth=1
4610; MIPS64-NEXT:    and $8, $8, $7
4611; MIPS64-NEXT:    or $8, $8, $5
4612; MIPS64-NEXT:    sc $8, 0($2)
4613; MIPS64-NEXT:    beqz $8, .LBB12_1
4614; MIPS64-NEXT:    nop
4615; MIPS64-NEXT:  .LBB12_3: # %entry
4616; MIPS64-NEXT:    srlv $1, $9, $3
4617; MIPS64-NEXT:    sll $1, $1, 24
4618; MIPS64-NEXT:    sra $1, $1, 24
4619; MIPS64-NEXT:  # %bb.4: # %entry
4620; MIPS64-NEXT:    sll $1, $1, 24
4621; MIPS64-NEXT:    jr $ra
4622; MIPS64-NEXT:    sra $2, $1, 24
4623;
4624; MIPS64R2-LABEL: AtomicCmpSwap8:
4625; MIPS64R2:       # %bb.0: # %entry
4626; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4627; MIPS64R2-NEXT:    daddu $1, $1, $25
4628; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4629; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
4630; MIPS64R2-NEXT:    daddiu $2, $zero, -4
4631; MIPS64R2-NEXT:    and $3, $1, $2
4632; MIPS64R2-NEXT:    andi $1, $1, 3
4633; MIPS64R2-NEXT:    sll $1, $1, 3
4634; MIPS64R2-NEXT:    ori $2, $zero, 255
4635; MIPS64R2-NEXT:    sllv $6, $2, $1
4636; MIPS64R2-NEXT:    nor $7, $zero, $6
4637; MIPS64R2-NEXT:    andi $2, $4, 255
4638; MIPS64R2-NEXT:    sllv $4, $2, $1
4639; MIPS64R2-NEXT:    andi $2, $5, 255
4640; MIPS64R2-NEXT:    sllv $5, $2, $1
4641; MIPS64R2-NEXT:  .LBB12_1: # %entry
4642; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
4643; MIPS64R2-NEXT:    ll $8, 0($3)
4644; MIPS64R2-NEXT:    and $9, $8, $6
4645; MIPS64R2-NEXT:    bne $9, $4, .LBB12_3
4646; MIPS64R2-NEXT:    nop
4647; MIPS64R2-NEXT:  # %bb.2: # %entry
4648; MIPS64R2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4649; MIPS64R2-NEXT:    and $8, $8, $7
4650; MIPS64R2-NEXT:    or $8, $8, $5
4651; MIPS64R2-NEXT:    sc $8, 0($3)
4652; MIPS64R2-NEXT:    beqz $8, .LBB12_1
4653; MIPS64R2-NEXT:    nop
4654; MIPS64R2-NEXT:  .LBB12_3: # %entry
4655; MIPS64R2-NEXT:    srlv $2, $9, $1
4656; MIPS64R2-NEXT:    seb $2, $2
4657; MIPS64R2-NEXT:  # %bb.4: # %entry
4658; MIPS64R2-NEXT:    jr $ra
4659; MIPS64R2-NEXT:    nop
4660;
4661; MIPS64R6-LABEL: AtomicCmpSwap8:
4662; MIPS64R6:       # %bb.0: # %entry
4663; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4664; MIPS64R6-NEXT:    daddu $1, $1, $25
4665; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4666; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
4667; MIPS64R6-NEXT:    daddiu $2, $zero, -4
4668; MIPS64R6-NEXT:    and $3, $1, $2
4669; MIPS64R6-NEXT:    andi $1, $1, 3
4670; MIPS64R6-NEXT:    sll $1, $1, 3
4671; MIPS64R6-NEXT:    ori $2, $zero, 255
4672; MIPS64R6-NEXT:    sllv $6, $2, $1
4673; MIPS64R6-NEXT:    nor $7, $zero, $6
4674; MIPS64R6-NEXT:    andi $2, $4, 255
4675; MIPS64R6-NEXT:    sllv $4, $2, $1
4676; MIPS64R6-NEXT:    andi $2, $5, 255
4677; MIPS64R6-NEXT:    sllv $5, $2, $1
4678; MIPS64R6-NEXT:  .LBB12_1: # %entry
4679; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
4680; MIPS64R6-NEXT:    ll $8, 0($3)
4681; MIPS64R6-NEXT:    and $9, $8, $6
4682; MIPS64R6-NEXT:    bnec $9, $4, .LBB12_3
4683; MIPS64R6-NEXT:  # %bb.2: # %entry
4684; MIPS64R6-NEXT:    # in Loop: Header=BB12_1 Depth=1
4685; MIPS64R6-NEXT:    and $8, $8, $7
4686; MIPS64R6-NEXT:    or $8, $8, $5
4687; MIPS64R6-NEXT:    sc $8, 0($3)
4688; MIPS64R6-NEXT:    beqzc $8, .LBB12_1
4689; MIPS64R6-NEXT:  .LBB12_3: # %entry
4690; MIPS64R6-NEXT:    srlv $2, $9, $1
4691; MIPS64R6-NEXT:    seb $2, $2
4692; MIPS64R6-NEXT:  # %bb.4: # %entry
4693; MIPS64R6-NEXT:    jrc $ra
4694;
4695; MIPS64R6O0-LABEL: AtomicCmpSwap8:
4696; MIPS64R6O0:       # %bb.0: # %entry
4697; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
4698; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4699; MIPS64R6O0-NEXT:    daddu $1, $1, $25
4700; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4701; MIPS64R6O0-NEXT:    move $2, $5
4702; MIPS64R6O0-NEXT:    move $3, $4
4703; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
4704; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
4705; MIPS64R6O0-NEXT:    and $4, $1, $4
4706; MIPS64R6O0-NEXT:    andi $6, $1, 3
4707; MIPS64R6O0-NEXT:    xori $6, $6, 3
4708; MIPS64R6O0-NEXT:    sll $6, $6, 3
4709; MIPS64R6O0-NEXT:    ori $7, $zero, 255
4710; MIPS64R6O0-NEXT:    sllv $7, $7, $6
4711; MIPS64R6O0-NEXT:    nor $8, $zero, $7
4712; MIPS64R6O0-NEXT:    andi $3, $3, 255
4713; MIPS64R6O0-NEXT:    sllv $3, $3, $6
4714; MIPS64R6O0-NEXT:    andi $2, $2, 255
4715; MIPS64R6O0-NEXT:    sllv $2, $2, $6
4716; MIPS64R6O0-NEXT:  .LBB12_1: # %entry
4717; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4718; MIPS64R6O0-NEXT:    ll $10, 0($4)
4719; MIPS64R6O0-NEXT:    and $11, $10, $7
4720; MIPS64R6O0-NEXT:    bnec $11, $3, .LBB12_3
4721; MIPS64R6O0-NEXT:  # %bb.2: # %entry
4722; MIPS64R6O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4723; MIPS64R6O0-NEXT:    and $10, $10, $8
4724; MIPS64R6O0-NEXT:    or $10, $10, $2
4725; MIPS64R6O0-NEXT:    sc $10, 0($4)
4726; MIPS64R6O0-NEXT:    beqzc $10, .LBB12_1
4727; MIPS64R6O0-NEXT:  .LBB12_3: # %entry
4728; MIPS64R6O0-NEXT:    srlv $9, $11, $6
4729; MIPS64R6O0-NEXT:    seb $9, $9
4730; MIPS64R6O0-NEXT:  # %bb.4: # %entry
4731; MIPS64R6O0-NEXT:    sw $9, 12($sp) # 4-byte Folded Spill
4732; MIPS64R6O0-NEXT:  # %bb.5: # %entry
4733; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
4734; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
4735; MIPS64R6O0-NEXT:    jrc $ra
4736;
4737; MM32-LABEL: AtomicCmpSwap8:
4738; MM32:       # %bb.0: # %entry
4739; MM32-NEXT:    lui $2, %hi(_gp_disp)
4740; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4741; MM32-NEXT:    addu $2, $2, $25
4742; MM32-NEXT:    lw $1, %got(y)($2)
4743; MM32-NEXT:    addiu $2, $zero, -4
4744; MM32-NEXT:    and $3, $1, $2
4745; MM32-NEXT:    andi $1, $1, 3
4746; MM32-NEXT:    sll $1, $1, 3
4747; MM32-NEXT:    ori $2, $zero, 255
4748; MM32-NEXT:    sllv $6, $2, $1
4749; MM32-NEXT:    nor $7, $zero, $6
4750; MM32-NEXT:    andi $2, $4, 255
4751; MM32-NEXT:    sllv $4, $2, $1
4752; MM32-NEXT:    andi $2, $5, 255
4753; MM32-NEXT:    sllv $5, $2, $1
4754; MM32-NEXT:  $BB12_1: # %entry
4755; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
4756; MM32-NEXT:    ll $8, 0($3)
4757; MM32-NEXT:    and $9, $8, $6
4758; MM32-NEXT:    bne $9, $4, $BB12_3
4759; MM32-NEXT:    nop
4760; MM32-NEXT:  # %bb.2: # %entry
4761; MM32-NEXT:    # in Loop: Header=BB12_1 Depth=1
4762; MM32-NEXT:    and $8, $8, $7
4763; MM32-NEXT:    or $8, $8, $5
4764; MM32-NEXT:    sc $8, 0($3)
4765; MM32-NEXT:    beqzc $8, $BB12_1
4766; MM32-NEXT:  $BB12_3: # %entry
4767; MM32-NEXT:    srlv $2, $9, $1
4768; MM32-NEXT:    seb $2, $2
4769; MM32-NEXT:  # %bb.4: # %entry
4770; MM32-NEXT:    jrc $ra
4771;
4772; O1-LABEL: AtomicCmpSwap8:
4773; O1:       # %bb.0: # %entry
4774; O1-NEXT:    lui $2, %hi(_gp_disp)
4775; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
4776; O1-NEXT:    addu $1, $2, $25
4777; O1-NEXT:    lw $1, %got(y)($1)
4778; O1-NEXT:    addiu $2, $zero, -4
4779; O1-NEXT:    and $2, $1, $2
4780; O1-NEXT:    andi $1, $1, 3
4781; O1-NEXT:    sll $3, $1, 3
4782; O1-NEXT:    ori $1, $zero, 255
4783; O1-NEXT:    sllv $6, $1, $3
4784; O1-NEXT:    nor $7, $zero, $6
4785; O1-NEXT:    andi $1, $4, 255
4786; O1-NEXT:    sllv $4, $1, $3
4787; O1-NEXT:    andi $1, $5, 255
4788; O1-NEXT:    sllv $5, $1, $3
4789; O1-NEXT:  $BB12_1: # %entry
4790; O1-NEXT:    # =>This Inner Loop Header: Depth=1
4791; O1-NEXT:    ll $8, 0($2)
4792; O1-NEXT:    and $9, $8, $6
4793; O1-NEXT:    bne $9, $4, $BB12_3
4794; O1-NEXT:    nop
4795; O1-NEXT:  # %bb.2: # %entry
4796; O1-NEXT:    # in Loop: Header=BB12_1 Depth=1
4797; O1-NEXT:    and $8, $8, $7
4798; O1-NEXT:    or $8, $8, $5
4799; O1-NEXT:    sc $8, 0($2)
4800; O1-NEXT:    beqz $8, $BB12_1
4801; O1-NEXT:    nop
4802; O1-NEXT:  $BB12_3: # %entry
4803; O1-NEXT:    srlv $1, $9, $3
4804; O1-NEXT:    sll $1, $1, 24
4805; O1-NEXT:    sra $1, $1, 24
4806; O1-NEXT:  # %bb.4: # %entry
4807; O1-NEXT:    sll $1, $1, 24
4808; O1-NEXT:    jr $ra
4809; O1-NEXT:    sra $2, $1, 24
4810;
4811; O2-LABEL: AtomicCmpSwap8:
4812; O2:       # %bb.0: # %entry
4813; O2-NEXT:    lui $2, %hi(_gp_disp)
4814; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4815; O2-NEXT:    addu $1, $2, $25
4816; O2-NEXT:    lw $1, %got(y)($1)
4817; O2-NEXT:    addiu $2, $zero, -4
4818; O2-NEXT:    and $2, $1, $2
4819; O2-NEXT:    andi $1, $1, 3
4820; O2-NEXT:    sll $3, $1, 3
4821; O2-NEXT:    ori $1, $zero, 255
4822; O2-NEXT:    sllv $6, $1, $3
4823; O2-NEXT:    nor $7, $zero, $6
4824; O2-NEXT:    andi $1, $4, 255
4825; O2-NEXT:    sllv $4, $1, $3
4826; O2-NEXT:    andi $1, $5, 255
4827; O2-NEXT:    sllv $5, $1, $3
4828; O2-NEXT:  $BB12_1: # %entry
4829; O2-NEXT:    # =>This Inner Loop Header: Depth=1
4830; O2-NEXT:    ll $8, 0($2)
4831; O2-NEXT:    and $9, $8, $6
4832; O2-NEXT:    bne $9, $4, $BB12_3
4833; O2-NEXT:    nop
4834; O2-NEXT:  # %bb.2: # %entry
4835; O2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4836; O2-NEXT:    and $8, $8, $7
4837; O2-NEXT:    or $8, $8, $5
4838; O2-NEXT:    sc $8, 0($2)
4839; O2-NEXT:    beqz $8, $BB12_1
4840; O2-NEXT:    nop
4841; O2-NEXT:  $BB12_3: # %entry
4842; O2-NEXT:    srlv $1, $9, $3
4843; O2-NEXT:    sll $1, $1, 24
4844; O2-NEXT:    sra $1, $1, 24
4845; O2-NEXT:  # %bb.4: # %entry
4846; O2-NEXT:    sll $1, $1, 24
4847; O2-NEXT:    jr $ra
4848; O2-NEXT:    sra $2, $1, 24
4849;
4850; O3-LABEL: AtomicCmpSwap8:
4851; O3:       # %bb.0: # %entry
4852; O3-NEXT:    lui $2, %hi(_gp_disp)
4853; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
4854; O3-NEXT:    addu $1, $2, $25
4855; O3-NEXT:    addiu $2, $zero, -4
4856; O3-NEXT:    lw $1, %got(y)($1)
4857; O3-NEXT:    and $2, $1, $2
4858; O3-NEXT:    andi $1, $1, 3
4859; O3-NEXT:    sll $3, $1, 3
4860; O3-NEXT:    ori $1, $zero, 255
4861; O3-NEXT:    sllv $6, $1, $3
4862; O3-NEXT:    andi $1, $4, 255
4863; O3-NEXT:    sllv $4, $1, $3
4864; O3-NEXT:    andi $1, $5, 255
4865; O3-NEXT:    nor $7, $zero, $6
4866; O3-NEXT:    sllv $5, $1, $3
4867; O3-NEXT:  $BB12_1: # %entry
4868; O3-NEXT:    # =>This Inner Loop Header: Depth=1
4869; O3-NEXT:    ll $8, 0($2)
4870; O3-NEXT:    and $9, $8, $6
4871; O3-NEXT:    bne $9, $4, $BB12_3
4872; O3-NEXT:    nop
4873; O3-NEXT:  # %bb.2: # %entry
4874; O3-NEXT:    # in Loop: Header=BB12_1 Depth=1
4875; O3-NEXT:    and $8, $8, $7
4876; O3-NEXT:    or $8, $8, $5
4877; O3-NEXT:    sc $8, 0($2)
4878; O3-NEXT:    beqz $8, $BB12_1
4879; O3-NEXT:    nop
4880; O3-NEXT:  $BB12_3: # %entry
4881; O3-NEXT:    srlv $1, $9, $3
4882; O3-NEXT:    sll $1, $1, 24
4883; O3-NEXT:    sra $1, $1, 24
4884; O3-NEXT:  # %bb.4: # %entry
4885; O3-NEXT:    sll $1, $1, 24
4886; O3-NEXT:    jr $ra
4887; O3-NEXT:    sra $2, $1, 24
4888;
4889; MIPS32EB-LABEL: AtomicCmpSwap8:
4890; MIPS32EB:       # %bb.0: # %entry
4891; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
4892; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
4893; MIPS32EB-NEXT:    addu $1, $2, $25
4894; MIPS32EB-NEXT:    lw $1, %got(y)($1)
4895; MIPS32EB-NEXT:    addiu $2, $zero, -4
4896; MIPS32EB-NEXT:    and $2, $1, $2
4897; MIPS32EB-NEXT:    andi $1, $1, 3
4898; MIPS32EB-NEXT:    xori $1, $1, 3
4899; MIPS32EB-NEXT:    sll $3, $1, 3
4900; MIPS32EB-NEXT:    ori $1, $zero, 255
4901; MIPS32EB-NEXT:    sllv $6, $1, $3
4902; MIPS32EB-NEXT:    nor $7, $zero, $6
4903; MIPS32EB-NEXT:    andi $1, $4, 255
4904; MIPS32EB-NEXT:    sllv $4, $1, $3
4905; MIPS32EB-NEXT:    andi $1, $5, 255
4906; MIPS32EB-NEXT:    sllv $5, $1, $3
4907; MIPS32EB-NEXT:  $BB12_1: # %entry
4908; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
4909; MIPS32EB-NEXT:    ll $8, 0($2)
4910; MIPS32EB-NEXT:    and $9, $8, $6
4911; MIPS32EB-NEXT:    bne $9, $4, $BB12_3
4912; MIPS32EB-NEXT:    nop
4913; MIPS32EB-NEXT:  # %bb.2: # %entry
4914; MIPS32EB-NEXT:    # in Loop: Header=BB12_1 Depth=1
4915; MIPS32EB-NEXT:    and $8, $8, $7
4916; MIPS32EB-NEXT:    or $8, $8, $5
4917; MIPS32EB-NEXT:    sc $8, 0($2)
4918; MIPS32EB-NEXT:    beqz $8, $BB12_1
4919; MIPS32EB-NEXT:    nop
4920; MIPS32EB-NEXT:  $BB12_3: # %entry
4921; MIPS32EB-NEXT:    srlv $1, $9, $3
4922; MIPS32EB-NEXT:    sll $1, $1, 24
4923; MIPS32EB-NEXT:    sra $1, $1, 24
4924; MIPS32EB-NEXT:  # %bb.4: # %entry
4925; MIPS32EB-NEXT:    sll $1, $1, 24
4926; MIPS32EB-NEXT:    jr $ra
4927; MIPS32EB-NEXT:    sra $2, $1, 24
4928entry:
4929  %pair0 = cmpxchg i8* @y, i8 %oldval, i8 %newval monotonic monotonic
4930  %0 = extractvalue { i8, i1 } %pair0, 0
4931  ret i8 %0
4932}
4933
4934define i1 @AtomicCmpSwapRes8(i8* %ptr, i8 signext %oldval, i8 signext %newval) nounwind {
4935; MIPS32-LABEL: AtomicCmpSwapRes8:
4936; MIPS32:       # %bb.0: # %entry
4937; MIPS32-NEXT:    addiu $1, $zero, -4
4938; MIPS32-NEXT:    and $2, $4, $1
4939; MIPS32-NEXT:    andi $1, $4, 3
4940; MIPS32-NEXT:    sll $3, $1, 3
4941; MIPS32-NEXT:    ori $1, $zero, 255
4942; MIPS32-NEXT:    sllv $4, $1, $3
4943; MIPS32-NEXT:    nor $7, $zero, $4
4944; MIPS32-NEXT:    andi $1, $5, 255
4945; MIPS32-NEXT:    sllv $8, $1, $3
4946; MIPS32-NEXT:    andi $1, $6, 255
4947; MIPS32-NEXT:    sllv $6, $1, $3
4948; MIPS32-NEXT:  $BB13_1: # %entry
4949; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
4950; MIPS32-NEXT:    ll $9, 0($2)
4951; MIPS32-NEXT:    and $10, $9, $4
4952; MIPS32-NEXT:    bne $10, $8, $BB13_3
4953; MIPS32-NEXT:    nop
4954; MIPS32-NEXT:  # %bb.2: # %entry
4955; MIPS32-NEXT:    # in Loop: Header=BB13_1 Depth=1
4956; MIPS32-NEXT:    and $9, $9, $7
4957; MIPS32-NEXT:    or $9, $9, $6
4958; MIPS32-NEXT:    sc $9, 0($2)
4959; MIPS32-NEXT:    beqz $9, $BB13_1
4960; MIPS32-NEXT:    nop
4961; MIPS32-NEXT:  $BB13_3: # %entry
4962; MIPS32-NEXT:    srlv $1, $10, $3
4963; MIPS32-NEXT:    sll $1, $1, 24
4964; MIPS32-NEXT:    sra $1, $1, 24
4965; MIPS32-NEXT:  # %bb.4: # %entry
4966; MIPS32-NEXT:    sll $2, $5, 24
4967; MIPS32-NEXT:    sra $2, $2, 24
4968; MIPS32-NEXT:    xor $1, $1, $2
4969; MIPS32-NEXT:    jr $ra
4970; MIPS32-NEXT:    sltiu $2, $1, 1
4971;
4972; MIPS32O0-LABEL: AtomicCmpSwapRes8:
4973; MIPS32O0:       # %bb.0: # %entry
4974; MIPS32O0-NEXT:    addiu $sp, $sp, -8
4975; MIPS32O0-NEXT:    addiu $1, $zero, -4
4976; MIPS32O0-NEXT:    and $1, $4, $1
4977; MIPS32O0-NEXT:    andi $2, $4, 3
4978; MIPS32O0-NEXT:    sll $2, $2, 3
4979; MIPS32O0-NEXT:    ori $3, $zero, 255
4980; MIPS32O0-NEXT:    sllv $3, $3, $2
4981; MIPS32O0-NEXT:    nor $4, $zero, $3
4982; MIPS32O0-NEXT:    andi $7, $5, 255
4983; MIPS32O0-NEXT:    sllv $7, $7, $2
4984; MIPS32O0-NEXT:    andi $6, $6, 255
4985; MIPS32O0-NEXT:    sllv $6, $6, $2
4986; MIPS32O0-NEXT:  $BB13_1: # %entry
4987; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
4988; MIPS32O0-NEXT:    ll $9, 0($1)
4989; MIPS32O0-NEXT:    and $10, $9, $3
4990; MIPS32O0-NEXT:    bne $10, $7, $BB13_3
4991; MIPS32O0-NEXT:    nop
4992; MIPS32O0-NEXT:  # %bb.2: # %entry
4993; MIPS32O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
4994; MIPS32O0-NEXT:    and $9, $9, $4
4995; MIPS32O0-NEXT:    or $9, $9, $6
4996; MIPS32O0-NEXT:    sc $9, 0($1)
4997; MIPS32O0-NEXT:    beqz $9, $BB13_1
4998; MIPS32O0-NEXT:    nop
4999; MIPS32O0-NEXT:  $BB13_3: # %entry
5000; MIPS32O0-NEXT:    srlv $8, $10, $2
5001; MIPS32O0-NEXT:    sll $8, $8, 24
5002; MIPS32O0-NEXT:    sra $8, $8, 24
5003; MIPS32O0-NEXT:  # %bb.4: # %entry
5004; MIPS32O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
5005; MIPS32O0-NEXT:    sw $8, 0($sp) # 4-byte Folded Spill
5006; MIPS32O0-NEXT:  # %bb.5: # %entry
5007; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5008; MIPS32O0-NEXT:    sll $2, $1, 24
5009; MIPS32O0-NEXT:    sra $2, $2, 24
5010; MIPS32O0-NEXT:    lw $3, 0($sp) # 4-byte Folded Reload
5011; MIPS32O0-NEXT:    xor $2, $3, $2
5012; MIPS32O0-NEXT:    sltiu $2, $2, 1
5013; MIPS32O0-NEXT:    addiu $sp, $sp, 8
5014; MIPS32O0-NEXT:    jr $ra
5015; MIPS32O0-NEXT:    nop
5016;
5017; MIPS32R2-LABEL: AtomicCmpSwapRes8:
5018; MIPS32R2:       # %bb.0: # %entry
5019; MIPS32R2-NEXT:    addiu $1, $zero, -4
5020; MIPS32R2-NEXT:    and $2, $4, $1
5021; MIPS32R2-NEXT:    andi $1, $4, 3
5022; MIPS32R2-NEXT:    sll $3, $1, 3
5023; MIPS32R2-NEXT:    ori $1, $zero, 255
5024; MIPS32R2-NEXT:    sllv $4, $1, $3
5025; MIPS32R2-NEXT:    nor $7, $zero, $4
5026; MIPS32R2-NEXT:    andi $1, $5, 255
5027; MIPS32R2-NEXT:    sllv $8, $1, $3
5028; MIPS32R2-NEXT:    andi $1, $6, 255
5029; MIPS32R2-NEXT:    sllv $6, $1, $3
5030; MIPS32R2-NEXT:  $BB13_1: # %entry
5031; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
5032; MIPS32R2-NEXT:    ll $9, 0($2)
5033; MIPS32R2-NEXT:    and $10, $9, $4
5034; MIPS32R2-NEXT:    bne $10, $8, $BB13_3
5035; MIPS32R2-NEXT:    nop
5036; MIPS32R2-NEXT:  # %bb.2: # %entry
5037; MIPS32R2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5038; MIPS32R2-NEXT:    and $9, $9, $7
5039; MIPS32R2-NEXT:    or $9, $9, $6
5040; MIPS32R2-NEXT:    sc $9, 0($2)
5041; MIPS32R2-NEXT:    beqz $9, $BB13_1
5042; MIPS32R2-NEXT:    nop
5043; MIPS32R2-NEXT:  $BB13_3: # %entry
5044; MIPS32R2-NEXT:    srlv $1, $10, $3
5045; MIPS32R2-NEXT:    seb $1, $1
5046; MIPS32R2-NEXT:  # %bb.4: # %entry
5047; MIPS32R2-NEXT:    xor $1, $1, $5
5048; MIPS32R2-NEXT:    jr $ra
5049; MIPS32R2-NEXT:    sltiu $2, $1, 1
5050;
5051; MIPS32R6-LABEL: AtomicCmpSwapRes8:
5052; MIPS32R6:       # %bb.0: # %entry
5053; MIPS32R6-NEXT:    addiu $1, $zero, -4
5054; MIPS32R6-NEXT:    and $2, $4, $1
5055; MIPS32R6-NEXT:    andi $1, $4, 3
5056; MIPS32R6-NEXT:    sll $3, $1, 3
5057; MIPS32R6-NEXT:    ori $1, $zero, 255
5058; MIPS32R6-NEXT:    sllv $4, $1, $3
5059; MIPS32R6-NEXT:    nor $7, $zero, $4
5060; MIPS32R6-NEXT:    andi $1, $5, 255
5061; MIPS32R6-NEXT:    sllv $8, $1, $3
5062; MIPS32R6-NEXT:    andi $1, $6, 255
5063; MIPS32R6-NEXT:    sllv $6, $1, $3
5064; MIPS32R6-NEXT:  $BB13_1: # %entry
5065; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
5066; MIPS32R6-NEXT:    ll $9, 0($2)
5067; MIPS32R6-NEXT:    and $10, $9, $4
5068; MIPS32R6-NEXT:    bnec $10, $8, $BB13_3
5069; MIPS32R6-NEXT:  # %bb.2: # %entry
5070; MIPS32R6-NEXT:    # in Loop: Header=BB13_1 Depth=1
5071; MIPS32R6-NEXT:    and $9, $9, $7
5072; MIPS32R6-NEXT:    or $9, $9, $6
5073; MIPS32R6-NEXT:    sc $9, 0($2)
5074; MIPS32R6-NEXT:    beqzc $9, $BB13_1
5075; MIPS32R6-NEXT:  $BB13_3: # %entry
5076; MIPS32R6-NEXT:    srlv $1, $10, $3
5077; MIPS32R6-NEXT:    seb $1, $1
5078; MIPS32R6-NEXT:  # %bb.4: # %entry
5079; MIPS32R6-NEXT:    xor $1, $1, $5
5080; MIPS32R6-NEXT:    jr $ra
5081; MIPS32R6-NEXT:    sltiu $2, $1, 1
5082;
5083; MIPS32R6O0-LABEL: AtomicCmpSwapRes8:
5084; MIPS32R6O0:       # %bb.0: # %entry
5085; MIPS32R6O0-NEXT:    addiu $sp, $sp, -24
5086; MIPS32R6O0-NEXT:    move $1, $6
5087; MIPS32R6O0-NEXT:    move $2, $5
5088; MIPS32R6O0-NEXT:    move $3, $4
5089; MIPS32R6O0-NEXT:    addiu $7, $zero, -4
5090; MIPS32R6O0-NEXT:    and $7, $4, $7
5091; MIPS32R6O0-NEXT:    andi $4, $4, 3
5092; MIPS32R6O0-NEXT:    sll $4, $4, 3
5093; MIPS32R6O0-NEXT:    ori $8, $zero, 255
5094; MIPS32R6O0-NEXT:    sllv $8, $8, $4
5095; MIPS32R6O0-NEXT:    nor $9, $zero, $8
5096; MIPS32R6O0-NEXT:    andi $10, $5, 255
5097; MIPS32R6O0-NEXT:    sllv $10, $10, $4
5098; MIPS32R6O0-NEXT:    andi $6, $6, 255
5099; MIPS32R6O0-NEXT:    sllv $6, $6, $4
5100; MIPS32R6O0-NEXT:  $BB13_1: # %entry
5101; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5102; MIPS32R6O0-NEXT:    ll $12, 0($7)
5103; MIPS32R6O0-NEXT:    and $13, $12, $8
5104; MIPS32R6O0-NEXT:    bnec $13, $10, $BB13_3
5105; MIPS32R6O0-NEXT:  # %bb.2: # %entry
5106; MIPS32R6O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
5107; MIPS32R6O0-NEXT:    and $12, $12, $9
5108; MIPS32R6O0-NEXT:    or $12, $12, $6
5109; MIPS32R6O0-NEXT:    sc $12, 0($7)
5110; MIPS32R6O0-NEXT:    beqzc $12, $BB13_1
5111; MIPS32R6O0-NEXT:  $BB13_3: # %entry
5112; MIPS32R6O0-NEXT:    srlv $11, $13, $4
5113; MIPS32R6O0-NEXT:    seb $11, $11
5114; MIPS32R6O0-NEXT:  # %bb.4: # %entry
5115; MIPS32R6O0-NEXT:    sw $5, 20($sp) # 4-byte Folded Spill
5116; MIPS32R6O0-NEXT:    sw $1, 16($sp) # 4-byte Folded Spill
5117; MIPS32R6O0-NEXT:    sw $2, 12($sp) # 4-byte Folded Spill
5118; MIPS32R6O0-NEXT:    sw $3, 8($sp) # 4-byte Folded Spill
5119; MIPS32R6O0-NEXT:    sw $11, 4($sp) # 4-byte Folded Spill
5120; MIPS32R6O0-NEXT:  # %bb.5: # %entry
5121; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5122; MIPS32R6O0-NEXT:    lw $2, 20($sp) # 4-byte Folded Reload
5123; MIPS32R6O0-NEXT:    xor $1, $1, $2
5124; MIPS32R6O0-NEXT:    sltiu $2, $1, 1
5125; MIPS32R6O0-NEXT:    addiu $sp, $sp, 24
5126; MIPS32R6O0-NEXT:    jrc $ra
5127;
5128; MIPS4-LABEL: AtomicCmpSwapRes8:
5129; MIPS4:       # %bb.0: # %entry
5130; MIPS4-NEXT:    daddiu $1, $zero, -4
5131; MIPS4-NEXT:    and $2, $4, $1
5132; MIPS4-NEXT:    andi $1, $4, 3
5133; MIPS4-NEXT:    sll $3, $1, 3
5134; MIPS4-NEXT:    ori $1, $zero, 255
5135; MIPS4-NEXT:    sllv $4, $1, $3
5136; MIPS4-NEXT:    nor $7, $zero, $4
5137; MIPS4-NEXT:    andi $1, $5, 255
5138; MIPS4-NEXT:    sllv $8, $1, $3
5139; MIPS4-NEXT:    andi $1, $6, 255
5140; MIPS4-NEXT:    sllv $6, $1, $3
5141; MIPS4-NEXT:  .LBB13_1: # %entry
5142; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
5143; MIPS4-NEXT:    ll $9, 0($2)
5144; MIPS4-NEXT:    and $10, $9, $4
5145; MIPS4-NEXT:    bne $10, $8, .LBB13_3
5146; MIPS4-NEXT:    nop
5147; MIPS4-NEXT:  # %bb.2: # %entry
5148; MIPS4-NEXT:    # in Loop: Header=BB13_1 Depth=1
5149; MIPS4-NEXT:    and $9, $9, $7
5150; MIPS4-NEXT:    or $9, $9, $6
5151; MIPS4-NEXT:    sc $9, 0($2)
5152; MIPS4-NEXT:    beqz $9, .LBB13_1
5153; MIPS4-NEXT:    nop
5154; MIPS4-NEXT:  .LBB13_3: # %entry
5155; MIPS4-NEXT:    srlv $1, $10, $3
5156; MIPS4-NEXT:    sll $1, $1, 24
5157; MIPS4-NEXT:    sra $1, $1, 24
5158; MIPS4-NEXT:  # %bb.4: # %entry
5159; MIPS4-NEXT:    sll $2, $5, 24
5160; MIPS4-NEXT:    sra $2, $2, 24
5161; MIPS4-NEXT:    xor $1, $1, $2
5162; MIPS4-NEXT:    jr $ra
5163; MIPS4-NEXT:    sltiu $2, $1, 1
5164;
5165; MIPS64-LABEL: AtomicCmpSwapRes8:
5166; MIPS64:       # %bb.0: # %entry
5167; MIPS64-NEXT:    daddiu $1, $zero, -4
5168; MIPS64-NEXT:    and $2, $4, $1
5169; MIPS64-NEXT:    andi $1, $4, 3
5170; MIPS64-NEXT:    sll $3, $1, 3
5171; MIPS64-NEXT:    ori $1, $zero, 255
5172; MIPS64-NEXT:    sllv $4, $1, $3
5173; MIPS64-NEXT:    nor $7, $zero, $4
5174; MIPS64-NEXT:    andi $1, $5, 255
5175; MIPS64-NEXT:    sllv $8, $1, $3
5176; MIPS64-NEXT:    andi $1, $6, 255
5177; MIPS64-NEXT:    sllv $6, $1, $3
5178; MIPS64-NEXT:  .LBB13_1: # %entry
5179; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
5180; MIPS64-NEXT:    ll $9, 0($2)
5181; MIPS64-NEXT:    and $10, $9, $4
5182; MIPS64-NEXT:    bne $10, $8, .LBB13_3
5183; MIPS64-NEXT:    nop
5184; MIPS64-NEXT:  # %bb.2: # %entry
5185; MIPS64-NEXT:    # in Loop: Header=BB13_1 Depth=1
5186; MIPS64-NEXT:    and $9, $9, $7
5187; MIPS64-NEXT:    or $9, $9, $6
5188; MIPS64-NEXT:    sc $9, 0($2)
5189; MIPS64-NEXT:    beqz $9, .LBB13_1
5190; MIPS64-NEXT:    nop
5191; MIPS64-NEXT:  .LBB13_3: # %entry
5192; MIPS64-NEXT:    srlv $1, $10, $3
5193; MIPS64-NEXT:    sll $1, $1, 24
5194; MIPS64-NEXT:    sra $1, $1, 24
5195; MIPS64-NEXT:  # %bb.4: # %entry
5196; MIPS64-NEXT:    sll $2, $5, 24
5197; MIPS64-NEXT:    sra $2, $2, 24
5198; MIPS64-NEXT:    xor $1, $1, $2
5199; MIPS64-NEXT:    jr $ra
5200; MIPS64-NEXT:    sltiu $2, $1, 1
5201;
5202; MIPS64R2-LABEL: AtomicCmpSwapRes8:
5203; MIPS64R2:       # %bb.0: # %entry
5204; MIPS64R2-NEXT:    daddiu $1, $zero, -4
5205; MIPS64R2-NEXT:    and $2, $4, $1
5206; MIPS64R2-NEXT:    andi $1, $4, 3
5207; MIPS64R2-NEXT:    sll $3, $1, 3
5208; MIPS64R2-NEXT:    ori $1, $zero, 255
5209; MIPS64R2-NEXT:    sllv $4, $1, $3
5210; MIPS64R2-NEXT:    nor $7, $zero, $4
5211; MIPS64R2-NEXT:    andi $1, $5, 255
5212; MIPS64R2-NEXT:    sllv $8, $1, $3
5213; MIPS64R2-NEXT:    andi $1, $6, 255
5214; MIPS64R2-NEXT:    sllv $6, $1, $3
5215; MIPS64R2-NEXT:  .LBB13_1: # %entry
5216; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
5217; MIPS64R2-NEXT:    ll $9, 0($2)
5218; MIPS64R2-NEXT:    and $10, $9, $4
5219; MIPS64R2-NEXT:    bne $10, $8, .LBB13_3
5220; MIPS64R2-NEXT:    nop
5221; MIPS64R2-NEXT:  # %bb.2: # %entry
5222; MIPS64R2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5223; MIPS64R2-NEXT:    and $9, $9, $7
5224; MIPS64R2-NEXT:    or $9, $9, $6
5225; MIPS64R2-NEXT:    sc $9, 0($2)
5226; MIPS64R2-NEXT:    beqz $9, .LBB13_1
5227; MIPS64R2-NEXT:    nop
5228; MIPS64R2-NEXT:  .LBB13_3: # %entry
5229; MIPS64R2-NEXT:    srlv $1, $10, $3
5230; MIPS64R2-NEXT:    seb $1, $1
5231; MIPS64R2-NEXT:  # %bb.4: # %entry
5232; MIPS64R2-NEXT:    xor $1, $1, $5
5233; MIPS64R2-NEXT:    jr $ra
5234; MIPS64R2-NEXT:    sltiu $2, $1, 1
5235;
5236; MIPS64R6-LABEL: AtomicCmpSwapRes8:
5237; MIPS64R6:       # %bb.0: # %entry
5238; MIPS64R6-NEXT:    daddiu $1, $zero, -4
5239; MIPS64R6-NEXT:    and $2, $4, $1
5240; MIPS64R6-NEXT:    andi $1, $4, 3
5241; MIPS64R6-NEXT:    sll $3, $1, 3
5242; MIPS64R6-NEXT:    ori $1, $zero, 255
5243; MIPS64R6-NEXT:    sllv $4, $1, $3
5244; MIPS64R6-NEXT:    nor $7, $zero, $4
5245; MIPS64R6-NEXT:    andi $1, $5, 255
5246; MIPS64R6-NEXT:    sllv $8, $1, $3
5247; MIPS64R6-NEXT:    andi $1, $6, 255
5248; MIPS64R6-NEXT:    sllv $6, $1, $3
5249; MIPS64R6-NEXT:  .LBB13_1: # %entry
5250; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
5251; MIPS64R6-NEXT:    ll $9, 0($2)
5252; MIPS64R6-NEXT:    and $10, $9, $4
5253; MIPS64R6-NEXT:    bnec $10, $8, .LBB13_3
5254; MIPS64R6-NEXT:  # %bb.2: # %entry
5255; MIPS64R6-NEXT:    # in Loop: Header=BB13_1 Depth=1
5256; MIPS64R6-NEXT:    and $9, $9, $7
5257; MIPS64R6-NEXT:    or $9, $9, $6
5258; MIPS64R6-NEXT:    sc $9, 0($2)
5259; MIPS64R6-NEXT:    beqzc $9, .LBB13_1
5260; MIPS64R6-NEXT:  .LBB13_3: # %entry
5261; MIPS64R6-NEXT:    srlv $1, $10, $3
5262; MIPS64R6-NEXT:    seb $1, $1
5263; MIPS64R6-NEXT:  # %bb.4: # %entry
5264; MIPS64R6-NEXT:    xor $1, $1, $5
5265; MIPS64R6-NEXT:    jr $ra
5266; MIPS64R6-NEXT:    sltiu $2, $1, 1
5267;
5268; MIPS64R6O0-LABEL: AtomicCmpSwapRes8:
5269; MIPS64R6O0:       # %bb.0: # %entry
5270; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -32
5271; MIPS64R6O0-NEXT:    move $1, $6
5272; MIPS64R6O0-NEXT:    move $2, $5
5273; MIPS64R6O0-NEXT:    move $3, $4
5274; MIPS64R6O0-NEXT:    daddiu $5, $zero, -4
5275; MIPS64R6O0-NEXT:    and $5, $4, $5
5276; MIPS64R6O0-NEXT:    andi $7, $4, 3
5277; MIPS64R6O0-NEXT:    xori $7, $7, 3
5278; MIPS64R6O0-NEXT:    sll $7, $7, 3
5279; MIPS64R6O0-NEXT:    ori $8, $zero, 255
5280; MIPS64R6O0-NEXT:    sllv $8, $8, $7
5281; MIPS64R6O0-NEXT:    nor $9, $zero, $8
5282; MIPS64R6O0-NEXT:    andi $10, $2, 255
5283; MIPS64R6O0-NEXT:    sllv $10, $10, $7
5284; MIPS64R6O0-NEXT:    andi $1, $1, 255
5285; MIPS64R6O0-NEXT:    sllv $1, $1, $7
5286; MIPS64R6O0-NEXT:  .LBB13_1: # %entry
5287; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5288; MIPS64R6O0-NEXT:    ll $12, 0($5)
5289; MIPS64R6O0-NEXT:    and $13, $12, $8
5290; MIPS64R6O0-NEXT:    bnec $13, $10, .LBB13_3
5291; MIPS64R6O0-NEXT:  # %bb.2: # %entry
5292; MIPS64R6O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
5293; MIPS64R6O0-NEXT:    and $12, $12, $9
5294; MIPS64R6O0-NEXT:    or $12, $12, $1
5295; MIPS64R6O0-NEXT:    sc $12, 0($5)
5296; MIPS64R6O0-NEXT:    beqzc $12, .LBB13_1
5297; MIPS64R6O0-NEXT:  .LBB13_3: # %entry
5298; MIPS64R6O0-NEXT:    srlv $11, $13, $7
5299; MIPS64R6O0-NEXT:    seb $11, $11
5300; MIPS64R6O0-NEXT:  # %bb.4: # %entry
5301; MIPS64R6O0-NEXT:    sw $2, 28($sp) # 4-byte Folded Spill
5302; MIPS64R6O0-NEXT:    sd $3, 16($sp) # 8-byte Folded Spill
5303; MIPS64R6O0-NEXT:    sw $11, 12($sp) # 4-byte Folded Spill
5304; MIPS64R6O0-NEXT:  # %bb.5: # %entry
5305; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
5306; MIPS64R6O0-NEXT:    lw $2, 28($sp) # 4-byte Folded Reload
5307; MIPS64R6O0-NEXT:    xor $1, $1, $2
5308; MIPS64R6O0-NEXT:    sltiu $2, $1, 1
5309; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 32
5310; MIPS64R6O0-NEXT:    jrc $ra
5311;
5312; MM32-LABEL: AtomicCmpSwapRes8:
5313; MM32:       # %bb.0: # %entry
5314; MM32-NEXT:    addiu $1, $zero, -4
5315; MM32-NEXT:    and $2, $4, $1
5316; MM32-NEXT:    andi $1, $4, 3
5317; MM32-NEXT:    sll $3, $1, 3
5318; MM32-NEXT:    ori $1, $zero, 255
5319; MM32-NEXT:    sllv $4, $1, $3
5320; MM32-NEXT:    nor $7, $zero, $4
5321; MM32-NEXT:    andi $1, $5, 255
5322; MM32-NEXT:    sllv $8, $1, $3
5323; MM32-NEXT:    andi $1, $6, 255
5324; MM32-NEXT:    sllv $6, $1, $3
5325; MM32-NEXT:  $BB13_1: # %entry
5326; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
5327; MM32-NEXT:    ll $9, 0($2)
5328; MM32-NEXT:    and $10, $9, $4
5329; MM32-NEXT:    bne $10, $8, $BB13_3
5330; MM32-NEXT:    nop
5331; MM32-NEXT:  # %bb.2: # %entry
5332; MM32-NEXT:    # in Loop: Header=BB13_1 Depth=1
5333; MM32-NEXT:    and $9, $9, $7
5334; MM32-NEXT:    or $9, $9, $6
5335; MM32-NEXT:    sc $9, 0($2)
5336; MM32-NEXT:    beqzc $9, $BB13_1
5337; MM32-NEXT:  $BB13_3: # %entry
5338; MM32-NEXT:    srlv $1, $10, $3
5339; MM32-NEXT:    seb $1, $1
5340; MM32-NEXT:  # %bb.4: # %entry
5341; MM32-NEXT:    xor $1, $1, $5
5342; MM32-NEXT:    jr $ra
5343; MM32-NEXT:    sltiu $2, $1, 1
5344;
5345; O1-LABEL: AtomicCmpSwapRes8:
5346; O1:       # %bb.0: # %entry
5347; O1-NEXT:    addiu $1, $zero, -4
5348; O1-NEXT:    and $2, $4, $1
5349; O1-NEXT:    andi $1, $4, 3
5350; O1-NEXT:    sll $3, $1, 3
5351; O1-NEXT:    ori $1, $zero, 255
5352; O1-NEXT:    sllv $4, $1, $3
5353; O1-NEXT:    nor $7, $zero, $4
5354; O1-NEXT:    andi $1, $5, 255
5355; O1-NEXT:    sllv $8, $1, $3
5356; O1-NEXT:    andi $1, $6, 255
5357; O1-NEXT:    sllv $6, $1, $3
5358; O1-NEXT:  $BB13_1: # %entry
5359; O1-NEXT:    # =>This Inner Loop Header: Depth=1
5360; O1-NEXT:    ll $9, 0($2)
5361; O1-NEXT:    and $10, $9, $4
5362; O1-NEXT:    bne $10, $8, $BB13_3
5363; O1-NEXT:    nop
5364; O1-NEXT:  # %bb.2: # %entry
5365; O1-NEXT:    # in Loop: Header=BB13_1 Depth=1
5366; O1-NEXT:    and $9, $9, $7
5367; O1-NEXT:    or $9, $9, $6
5368; O1-NEXT:    sc $9, 0($2)
5369; O1-NEXT:    beqz $9, $BB13_1
5370; O1-NEXT:    nop
5371; O1-NEXT:  $BB13_3: # %entry
5372; O1-NEXT:    srlv $1, $10, $3
5373; O1-NEXT:    sll $1, $1, 24
5374; O1-NEXT:    sra $1, $1, 24
5375; O1-NEXT:  # %bb.4: # %entry
5376; O1-NEXT:    sll $2, $5, 24
5377; O1-NEXT:    sra $2, $2, 24
5378; O1-NEXT:    xor $1, $1, $2
5379; O1-NEXT:    jr $ra
5380; O1-NEXT:    sltiu $2, $1, 1
5381;
5382; O2-LABEL: AtomicCmpSwapRes8:
5383; O2:       # %bb.0: # %entry
5384; O2-NEXT:    addiu $1, $zero, -4
5385; O2-NEXT:    and $2, $4, $1
5386; O2-NEXT:    andi $1, $4, 3
5387; O2-NEXT:    sll $3, $1, 3
5388; O2-NEXT:    ori $1, $zero, 255
5389; O2-NEXT:    sllv $4, $1, $3
5390; O2-NEXT:    nor $7, $zero, $4
5391; O2-NEXT:    andi $1, $5, 255
5392; O2-NEXT:    sllv $8, $1, $3
5393; O2-NEXT:    andi $1, $6, 255
5394; O2-NEXT:    sllv $6, $1, $3
5395; O2-NEXT:  $BB13_1: # %entry
5396; O2-NEXT:    # =>This Inner Loop Header: Depth=1
5397; O2-NEXT:    ll $9, 0($2)
5398; O2-NEXT:    and $10, $9, $4
5399; O2-NEXT:    bne $10, $8, $BB13_3
5400; O2-NEXT:    nop
5401; O2-NEXT:  # %bb.2: # %entry
5402; O2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5403; O2-NEXT:    and $9, $9, $7
5404; O2-NEXT:    or $9, $9, $6
5405; O2-NEXT:    sc $9, 0($2)
5406; O2-NEXT:    beqz $9, $BB13_1
5407; O2-NEXT:    nop
5408; O2-NEXT:  $BB13_3: # %entry
5409; O2-NEXT:    srlv $1, $10, $3
5410; O2-NEXT:    sll $1, $1, 24
5411; O2-NEXT:    sra $1, $1, 24
5412; O2-NEXT:  # %bb.4: # %entry
5413; O2-NEXT:    sll $2, $5, 24
5414; O2-NEXT:    sra $2, $2, 24
5415; O2-NEXT:    xor $1, $1, $2
5416; O2-NEXT:    jr $ra
5417; O2-NEXT:    sltiu $2, $1, 1
5418;
5419; O3-LABEL: AtomicCmpSwapRes8:
5420; O3:       # %bb.0: # %entry
5421; O3-NEXT:    addiu $1, $zero, -4
5422; O3-NEXT:    and $2, $4, $1
5423; O3-NEXT:    andi $1, $4, 3
5424; O3-NEXT:    sll $3, $1, 3
5425; O3-NEXT:    ori $1, $zero, 255
5426; O3-NEXT:    sllv $4, $1, $3
5427; O3-NEXT:    andi $1, $5, 255
5428; O3-NEXT:    sllv $8, $1, $3
5429; O3-NEXT:    andi $1, $6, 255
5430; O3-NEXT:    nor $7, $zero, $4
5431; O3-NEXT:    sllv $6, $1, $3
5432; O3-NEXT:  $BB13_1: # %entry
5433; O3-NEXT:    # =>This Inner Loop Header: Depth=1
5434; O3-NEXT:    ll $9, 0($2)
5435; O3-NEXT:    and $10, $9, $4
5436; O3-NEXT:    bne $10, $8, $BB13_3
5437; O3-NEXT:    nop
5438; O3-NEXT:  # %bb.2: # %entry
5439; O3-NEXT:    # in Loop: Header=BB13_1 Depth=1
5440; O3-NEXT:    and $9, $9, $7
5441; O3-NEXT:    or $9, $9, $6
5442; O3-NEXT:    sc $9, 0($2)
5443; O3-NEXT:    beqz $9, $BB13_1
5444; O3-NEXT:    nop
5445; O3-NEXT:  $BB13_3: # %entry
5446; O3-NEXT:    srlv $1, $10, $3
5447; O3-NEXT:    sll $1, $1, 24
5448; O3-NEXT:    sra $1, $1, 24
5449; O3-NEXT:  # %bb.4: # %entry
5450; O3-NEXT:    sll $2, $5, 24
5451; O3-NEXT:    sra $2, $2, 24
5452; O3-NEXT:    xor $1, $1, $2
5453; O3-NEXT:    jr $ra
5454; O3-NEXT:    sltiu $2, $1, 1
5455;
5456; MIPS32EB-LABEL: AtomicCmpSwapRes8:
5457; MIPS32EB:       # %bb.0: # %entry
5458; MIPS32EB-NEXT:    addiu $1, $zero, -4
5459; MIPS32EB-NEXT:    and $2, $4, $1
5460; MIPS32EB-NEXT:    andi $1, $4, 3
5461; MIPS32EB-NEXT:    xori $1, $1, 3
5462; MIPS32EB-NEXT:    sll $3, $1, 3
5463; MIPS32EB-NEXT:    ori $1, $zero, 255
5464; MIPS32EB-NEXT:    sllv $4, $1, $3
5465; MIPS32EB-NEXT:    nor $7, $zero, $4
5466; MIPS32EB-NEXT:    andi $1, $5, 255
5467; MIPS32EB-NEXT:    sllv $8, $1, $3
5468; MIPS32EB-NEXT:    andi $1, $6, 255
5469; MIPS32EB-NEXT:    sllv $6, $1, $3
5470; MIPS32EB-NEXT:  $BB13_1: # %entry
5471; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
5472; MIPS32EB-NEXT:    ll $9, 0($2)
5473; MIPS32EB-NEXT:    and $10, $9, $4
5474; MIPS32EB-NEXT:    bne $10, $8, $BB13_3
5475; MIPS32EB-NEXT:    nop
5476; MIPS32EB-NEXT:  # %bb.2: # %entry
5477; MIPS32EB-NEXT:    # in Loop: Header=BB13_1 Depth=1
5478; MIPS32EB-NEXT:    and $9, $9, $7
5479; MIPS32EB-NEXT:    or $9, $9, $6
5480; MIPS32EB-NEXT:    sc $9, 0($2)
5481; MIPS32EB-NEXT:    beqz $9, $BB13_1
5482; MIPS32EB-NEXT:    nop
5483; MIPS32EB-NEXT:  $BB13_3: # %entry
5484; MIPS32EB-NEXT:    srlv $1, $10, $3
5485; MIPS32EB-NEXT:    sll $1, $1, 24
5486; MIPS32EB-NEXT:    sra $1, $1, 24
5487; MIPS32EB-NEXT:  # %bb.4: # %entry
5488; MIPS32EB-NEXT:    sll $2, $5, 24
5489; MIPS32EB-NEXT:    sra $2, $2, 24
5490; MIPS32EB-NEXT:    xor $1, $1, $2
5491; MIPS32EB-NEXT:    jr $ra
5492; MIPS32EB-NEXT:    sltiu $2, $1, 1
5493entry:
5494  %0 = cmpxchg i8* %ptr, i8 %oldval, i8 %newval monotonic monotonic
5495  %1 = extractvalue { i8, i1 } %0, 1
5496  ret i1 %1
5497; FIXME: -march=mips produces a redundant sign extension here...
5498; FIXME: ...Leading to this split check.
5499
5500}
5501
5502; Check one i16 so that we cover the seh sign extend
5503@z = common global i16 0, align 1
5504
5505define signext i16 @AtomicLoadAdd16(i16 signext %incr) nounwind {
5506; MIPS32-LABEL: AtomicLoadAdd16:
5507; MIPS32:       # %bb.0: # %entry
5508; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
5509; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
5510; MIPS32-NEXT:    addu $1, $2, $25
5511; MIPS32-NEXT:    lw $1, %got(z)($1)
5512; MIPS32-NEXT:    addiu $2, $zero, -4
5513; MIPS32-NEXT:    and $2, $1, $2
5514; MIPS32-NEXT:    andi $1, $1, 3
5515; MIPS32-NEXT:    sll $3, $1, 3
5516; MIPS32-NEXT:    ori $1, $zero, 65535
5517; MIPS32-NEXT:    sllv $5, $1, $3
5518; MIPS32-NEXT:    nor $6, $zero, $5
5519; MIPS32-NEXT:    sllv $4, $4, $3
5520; MIPS32-NEXT:  $BB14_1: # %entry
5521; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
5522; MIPS32-NEXT:    ll $7, 0($2)
5523; MIPS32-NEXT:    addu $8, $7, $4
5524; MIPS32-NEXT:    and $8, $8, $5
5525; MIPS32-NEXT:    and $9, $7, $6
5526; MIPS32-NEXT:    or $9, $9, $8
5527; MIPS32-NEXT:    sc $9, 0($2)
5528; MIPS32-NEXT:    beqz $9, $BB14_1
5529; MIPS32-NEXT:    nop
5530; MIPS32-NEXT:  # %bb.2: # %entry
5531; MIPS32-NEXT:    and $1, $7, $5
5532; MIPS32-NEXT:    srlv $1, $1, $3
5533; MIPS32-NEXT:    sll $1, $1, 16
5534; MIPS32-NEXT:    sra $1, $1, 16
5535; MIPS32-NEXT:  # %bb.3: # %entry
5536; MIPS32-NEXT:    sll $1, $1, 16
5537; MIPS32-NEXT:    jr $ra
5538; MIPS32-NEXT:    sra $2, $1, 16
5539;
5540; MIPS32O0-LABEL: AtomicLoadAdd16:
5541; MIPS32O0:       # %bb.0: # %entry
5542; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
5543; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
5544; MIPS32O0-NEXT:    addiu $sp, $sp, -8
5545; MIPS32O0-NEXT:    addu $1, $2, $25
5546; MIPS32O0-NEXT:    lw $1, %got(z)($1)
5547; MIPS32O0-NEXT:    addiu $2, $zero, -4
5548; MIPS32O0-NEXT:    and $2, $1, $2
5549; MIPS32O0-NEXT:    andi $1, $1, 3
5550; MIPS32O0-NEXT:    sll $1, $1, 3
5551; MIPS32O0-NEXT:    ori $3, $zero, 65535
5552; MIPS32O0-NEXT:    sllv $3, $3, $1
5553; MIPS32O0-NEXT:    nor $5, $zero, $3
5554; MIPS32O0-NEXT:    sllv $4, $4, $1
5555; MIPS32O0-NEXT:  $BB14_1: # %entry
5556; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
5557; MIPS32O0-NEXT:    ll $7, 0($2)
5558; MIPS32O0-NEXT:    addu $8, $7, $4
5559; MIPS32O0-NEXT:    and $8, $8, $3
5560; MIPS32O0-NEXT:    and $9, $7, $5
5561; MIPS32O0-NEXT:    or $9, $9, $8
5562; MIPS32O0-NEXT:    sc $9, 0($2)
5563; MIPS32O0-NEXT:    beqz $9, $BB14_1
5564; MIPS32O0-NEXT:    nop
5565; MIPS32O0-NEXT:  # %bb.2: # %entry
5566; MIPS32O0-NEXT:    and $6, $7, $3
5567; MIPS32O0-NEXT:    srlv $6, $6, $1
5568; MIPS32O0-NEXT:    sll $6, $6, 16
5569; MIPS32O0-NEXT:    sra $6, $6, 16
5570; MIPS32O0-NEXT:  # %bb.3: # %entry
5571; MIPS32O0-NEXT:    sw $6, 4($sp) # 4-byte Folded Spill
5572; MIPS32O0-NEXT:  # %bb.4: # %entry
5573; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5574; MIPS32O0-NEXT:    sll $2, $1, 16
5575; MIPS32O0-NEXT:    sra $2, $2, 16
5576; MIPS32O0-NEXT:    addiu $sp, $sp, 8
5577; MIPS32O0-NEXT:    jr $ra
5578; MIPS32O0-NEXT:    nop
5579;
5580; MIPS32R2-LABEL: AtomicLoadAdd16:
5581; MIPS32R2:       # %bb.0: # %entry
5582; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
5583; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
5584; MIPS32R2-NEXT:    addu $1, $2, $25
5585; MIPS32R2-NEXT:    lw $1, %got(z)($1)
5586; MIPS32R2-NEXT:    addiu $2, $zero, -4
5587; MIPS32R2-NEXT:    and $2, $1, $2
5588; MIPS32R2-NEXT:    andi $1, $1, 3
5589; MIPS32R2-NEXT:    sll $3, $1, 3
5590; MIPS32R2-NEXT:    ori $1, $zero, 65535
5591; MIPS32R2-NEXT:    sllv $5, $1, $3
5592; MIPS32R2-NEXT:    nor $6, $zero, $5
5593; MIPS32R2-NEXT:    sllv $4, $4, $3
5594; MIPS32R2-NEXT:  $BB14_1: # %entry
5595; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
5596; MIPS32R2-NEXT:    ll $7, 0($2)
5597; MIPS32R2-NEXT:    addu $8, $7, $4
5598; MIPS32R2-NEXT:    and $8, $8, $5
5599; MIPS32R2-NEXT:    and $9, $7, $6
5600; MIPS32R2-NEXT:    or $9, $9, $8
5601; MIPS32R2-NEXT:    sc $9, 0($2)
5602; MIPS32R2-NEXT:    beqz $9, $BB14_1
5603; MIPS32R2-NEXT:    nop
5604; MIPS32R2-NEXT:  # %bb.2: # %entry
5605; MIPS32R2-NEXT:    and $1, $7, $5
5606; MIPS32R2-NEXT:    srlv $1, $1, $3
5607; MIPS32R2-NEXT:    seh $1, $1
5608; MIPS32R2-NEXT:  # %bb.3: # %entry
5609; MIPS32R2-NEXT:    jr $ra
5610; MIPS32R2-NEXT:    seh $2, $1
5611;
5612; MIPS32R6-LABEL: AtomicLoadAdd16:
5613; MIPS32R6:       # %bb.0: # %entry
5614; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
5615; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
5616; MIPS32R6-NEXT:    addu $1, $2, $25
5617; MIPS32R6-NEXT:    lw $1, %got(z)($1)
5618; MIPS32R6-NEXT:    addiu $2, $zero, -4
5619; MIPS32R6-NEXT:    and $2, $1, $2
5620; MIPS32R6-NEXT:    andi $1, $1, 3
5621; MIPS32R6-NEXT:    sll $3, $1, 3
5622; MIPS32R6-NEXT:    ori $1, $zero, 65535
5623; MIPS32R6-NEXT:    sllv $5, $1, $3
5624; MIPS32R6-NEXT:    nor $6, $zero, $5
5625; MIPS32R6-NEXT:    sllv $4, $4, $3
5626; MIPS32R6-NEXT:  $BB14_1: # %entry
5627; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
5628; MIPS32R6-NEXT:    ll $7, 0($2)
5629; MIPS32R6-NEXT:    addu $8, $7, $4
5630; MIPS32R6-NEXT:    and $8, $8, $5
5631; MIPS32R6-NEXT:    and $9, $7, $6
5632; MIPS32R6-NEXT:    or $9, $9, $8
5633; MIPS32R6-NEXT:    sc $9, 0($2)
5634; MIPS32R6-NEXT:    beqzc $9, $BB14_1
5635; MIPS32R6-NEXT:  # %bb.2: # %entry
5636; MIPS32R6-NEXT:    and $1, $7, $5
5637; MIPS32R6-NEXT:    srlv $1, $1, $3
5638; MIPS32R6-NEXT:    seh $1, $1
5639; MIPS32R6-NEXT:  # %bb.3: # %entry
5640; MIPS32R6-NEXT:    jr $ra
5641; MIPS32R6-NEXT:    seh $2, $1
5642;
5643; MIPS32R6O0-LABEL: AtomicLoadAdd16:
5644; MIPS32R6O0:       # %bb.0: # %entry
5645; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
5646; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
5647; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
5648; MIPS32R6O0-NEXT:    addu $1, $2, $25
5649; MIPS32R6O0-NEXT:    move $2, $4
5650; MIPS32R6O0-NEXT:    lw $1, %got(z)($1)
5651; MIPS32R6O0-NEXT:    addiu $3, $zero, -4
5652; MIPS32R6O0-NEXT:    and $3, $1, $3
5653; MIPS32R6O0-NEXT:    andi $1, $1, 3
5654; MIPS32R6O0-NEXT:    sll $1, $1, 3
5655; MIPS32R6O0-NEXT:    ori $5, $zero, 65535
5656; MIPS32R6O0-NEXT:    sllv $5, $5, $1
5657; MIPS32R6O0-NEXT:    nor $6, $zero, $5
5658; MIPS32R6O0-NEXT:    sllv $4, $4, $1
5659; MIPS32R6O0-NEXT:  $BB14_1: # %entry
5660; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5661; MIPS32R6O0-NEXT:    ll $8, 0($3)
5662; MIPS32R6O0-NEXT:    addu $9, $8, $4
5663; MIPS32R6O0-NEXT:    and $9, $9, $5
5664; MIPS32R6O0-NEXT:    and $10, $8, $6
5665; MIPS32R6O0-NEXT:    or $10, $10, $9
5666; MIPS32R6O0-NEXT:    sc $10, 0($3)
5667; MIPS32R6O0-NEXT:    beqzc $10, $BB14_1
5668; MIPS32R6O0-NEXT:  # %bb.2: # %entry
5669; MIPS32R6O0-NEXT:    and $7, $8, $5
5670; MIPS32R6O0-NEXT:    srlv $7, $7, $1
5671; MIPS32R6O0-NEXT:    seh $7, $7
5672; MIPS32R6O0-NEXT:  # %bb.3: # %entry
5673; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
5674; MIPS32R6O0-NEXT:    sw $7, 0($sp) # 4-byte Folded Spill
5675; MIPS32R6O0-NEXT:  # %bb.4: # %entry
5676; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
5677; MIPS32R6O0-NEXT:    seh $2, $1
5678; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
5679; MIPS32R6O0-NEXT:    jrc $ra
5680;
5681; MIPS4-LABEL: AtomicLoadAdd16:
5682; MIPS4:       # %bb.0: # %entry
5683; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5684; MIPS4-NEXT:    daddu $1, $1, $25
5685; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5686; MIPS4-NEXT:    ld $1, %got_disp(z)($1)
5687; MIPS4-NEXT:    daddiu $2, $zero, -4
5688; MIPS4-NEXT:    and $2, $1, $2
5689; MIPS4-NEXT:    andi $1, $1, 3
5690; MIPS4-NEXT:    sll $3, $1, 3
5691; MIPS4-NEXT:    ori $1, $zero, 65535
5692; MIPS4-NEXT:    sllv $5, $1, $3
5693; MIPS4-NEXT:    nor $6, $zero, $5
5694; MIPS4-NEXT:    sllv $4, $4, $3
5695; MIPS4-NEXT:  .LBB14_1: # %entry
5696; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
5697; MIPS4-NEXT:    ll $7, 0($2)
5698; MIPS4-NEXT:    addu $8, $7, $4
5699; MIPS4-NEXT:    and $8, $8, $5
5700; MIPS4-NEXT:    and $9, $7, $6
5701; MIPS4-NEXT:    or $9, $9, $8
5702; MIPS4-NEXT:    sc $9, 0($2)
5703; MIPS4-NEXT:    beqz $9, .LBB14_1
5704; MIPS4-NEXT:    nop
5705; MIPS4-NEXT:  # %bb.2: # %entry
5706; MIPS4-NEXT:    and $1, $7, $5
5707; MIPS4-NEXT:    srlv $1, $1, $3
5708; MIPS4-NEXT:    sll $1, $1, 16
5709; MIPS4-NEXT:    sra $1, $1, 16
5710; MIPS4-NEXT:  # %bb.3: # %entry
5711; MIPS4-NEXT:    sll $1, $1, 16
5712; MIPS4-NEXT:    jr $ra
5713; MIPS4-NEXT:    sra $2, $1, 16
5714;
5715; MIPS64-LABEL: AtomicLoadAdd16:
5716; MIPS64:       # %bb.0: # %entry
5717; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5718; MIPS64-NEXT:    daddu $1, $1, $25
5719; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5720; MIPS64-NEXT:    ld $1, %got_disp(z)($1)
5721; MIPS64-NEXT:    daddiu $2, $zero, -4
5722; MIPS64-NEXT:    and $2, $1, $2
5723; MIPS64-NEXT:    andi $1, $1, 3
5724; MIPS64-NEXT:    sll $3, $1, 3
5725; MIPS64-NEXT:    ori $1, $zero, 65535
5726; MIPS64-NEXT:    sllv $5, $1, $3
5727; MIPS64-NEXT:    nor $6, $zero, $5
5728; MIPS64-NEXT:    sllv $4, $4, $3
5729; MIPS64-NEXT:  .LBB14_1: # %entry
5730; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
5731; MIPS64-NEXT:    ll $7, 0($2)
5732; MIPS64-NEXT:    addu $8, $7, $4
5733; MIPS64-NEXT:    and $8, $8, $5
5734; MIPS64-NEXT:    and $9, $7, $6
5735; MIPS64-NEXT:    or $9, $9, $8
5736; MIPS64-NEXT:    sc $9, 0($2)
5737; MIPS64-NEXT:    beqz $9, .LBB14_1
5738; MIPS64-NEXT:    nop
5739; MIPS64-NEXT:  # %bb.2: # %entry
5740; MIPS64-NEXT:    and $1, $7, $5
5741; MIPS64-NEXT:    srlv $1, $1, $3
5742; MIPS64-NEXT:    sll $1, $1, 16
5743; MIPS64-NEXT:    sra $1, $1, 16
5744; MIPS64-NEXT:  # %bb.3: # %entry
5745; MIPS64-NEXT:    sll $1, $1, 16
5746; MIPS64-NEXT:    jr $ra
5747; MIPS64-NEXT:    sra $2, $1, 16
5748;
5749; MIPS64R2-LABEL: AtomicLoadAdd16:
5750; MIPS64R2:       # %bb.0: # %entry
5751; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5752; MIPS64R2-NEXT:    daddu $1, $1, $25
5753; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5754; MIPS64R2-NEXT:    ld $1, %got_disp(z)($1)
5755; MIPS64R2-NEXT:    daddiu $2, $zero, -4
5756; MIPS64R2-NEXT:    and $2, $1, $2
5757; MIPS64R2-NEXT:    andi $1, $1, 3
5758; MIPS64R2-NEXT:    sll $3, $1, 3
5759; MIPS64R2-NEXT:    ori $1, $zero, 65535
5760; MIPS64R2-NEXT:    sllv $5, $1, $3
5761; MIPS64R2-NEXT:    nor $6, $zero, $5
5762; MIPS64R2-NEXT:    sllv $4, $4, $3
5763; MIPS64R2-NEXT:  .LBB14_1: # %entry
5764; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
5765; MIPS64R2-NEXT:    ll $7, 0($2)
5766; MIPS64R2-NEXT:    addu $8, $7, $4
5767; MIPS64R2-NEXT:    and $8, $8, $5
5768; MIPS64R2-NEXT:    and $9, $7, $6
5769; MIPS64R2-NEXT:    or $9, $9, $8
5770; MIPS64R2-NEXT:    sc $9, 0($2)
5771; MIPS64R2-NEXT:    beqz $9, .LBB14_1
5772; MIPS64R2-NEXT:    nop
5773; MIPS64R2-NEXT:  # %bb.2: # %entry
5774; MIPS64R2-NEXT:    and $1, $7, $5
5775; MIPS64R2-NEXT:    srlv $1, $1, $3
5776; MIPS64R2-NEXT:    seh $1, $1
5777; MIPS64R2-NEXT:  # %bb.3: # %entry
5778; MIPS64R2-NEXT:    jr $ra
5779; MIPS64R2-NEXT:    seh $2, $1
5780;
5781; MIPS64R6-LABEL: AtomicLoadAdd16:
5782; MIPS64R6:       # %bb.0: # %entry
5783; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5784; MIPS64R6-NEXT:    daddu $1, $1, $25
5785; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5786; MIPS64R6-NEXT:    ld $1, %got_disp(z)($1)
5787; MIPS64R6-NEXT:    daddiu $2, $zero, -4
5788; MIPS64R6-NEXT:    and $2, $1, $2
5789; MIPS64R6-NEXT:    andi $1, $1, 3
5790; MIPS64R6-NEXT:    sll $3, $1, 3
5791; MIPS64R6-NEXT:    ori $1, $zero, 65535
5792; MIPS64R6-NEXT:    sllv $5, $1, $3
5793; MIPS64R6-NEXT:    nor $6, $zero, $5
5794; MIPS64R6-NEXT:    sllv $4, $4, $3
5795; MIPS64R6-NEXT:  .LBB14_1: # %entry
5796; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
5797; MIPS64R6-NEXT:    ll $7, 0($2)
5798; MIPS64R6-NEXT:    addu $8, $7, $4
5799; MIPS64R6-NEXT:    and $8, $8, $5
5800; MIPS64R6-NEXT:    and $9, $7, $6
5801; MIPS64R6-NEXT:    or $9, $9, $8
5802; MIPS64R6-NEXT:    sc $9, 0($2)
5803; MIPS64R6-NEXT:    beqzc $9, .LBB14_1
5804; MIPS64R6-NEXT:  # %bb.2: # %entry
5805; MIPS64R6-NEXT:    and $1, $7, $5
5806; MIPS64R6-NEXT:    srlv $1, $1, $3
5807; MIPS64R6-NEXT:    seh $1, $1
5808; MIPS64R6-NEXT:  # %bb.3: # %entry
5809; MIPS64R6-NEXT:    jr $ra
5810; MIPS64R6-NEXT:    seh $2, $1
5811;
5812; MIPS64R6O0-LABEL: AtomicLoadAdd16:
5813; MIPS64R6O0:       # %bb.0: # %entry
5814; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
5815; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5816; MIPS64R6O0-NEXT:    daddu $1, $1, $25
5817; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5818; MIPS64R6O0-NEXT:    move $2, $4
5819; MIPS64R6O0-NEXT:    ld $1, %got_disp(z)($1)
5820; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
5821; MIPS64R6O0-NEXT:    and $3, $1, $3
5822; MIPS64R6O0-NEXT:    andi $5, $1, 3
5823; MIPS64R6O0-NEXT:    xori $5, $5, 2
5824; MIPS64R6O0-NEXT:    sll $5, $5, 3
5825; MIPS64R6O0-NEXT:    ori $6, $zero, 65535
5826; MIPS64R6O0-NEXT:    sllv $6, $6, $5
5827; MIPS64R6O0-NEXT:    nor $7, $zero, $6
5828; MIPS64R6O0-NEXT:    sllv $2, $2, $5
5829; MIPS64R6O0-NEXT:  .LBB14_1: # %entry
5830; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5831; MIPS64R6O0-NEXT:    ll $9, 0($3)
5832; MIPS64R6O0-NEXT:    addu $10, $9, $2
5833; MIPS64R6O0-NEXT:    and $10, $10, $6
5834; MIPS64R6O0-NEXT:    and $11, $9, $7
5835; MIPS64R6O0-NEXT:    or $11, $11, $10
5836; MIPS64R6O0-NEXT:    sc $11, 0($3)
5837; MIPS64R6O0-NEXT:    beqzc $11, .LBB14_1
5838; MIPS64R6O0-NEXT:  # %bb.2: # %entry
5839; MIPS64R6O0-NEXT:    and $8, $9, $6
5840; MIPS64R6O0-NEXT:    srlv $8, $8, $5
5841; MIPS64R6O0-NEXT:    seh $8, $8
5842; MIPS64R6O0-NEXT:  # %bb.3: # %entry
5843; MIPS64R6O0-NEXT:    sw $8, 12($sp) # 4-byte Folded Spill
5844; MIPS64R6O0-NEXT:  # %bb.4: # %entry
5845; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
5846; MIPS64R6O0-NEXT:    seh $2, $1
5847; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
5848; MIPS64R6O0-NEXT:    jrc $ra
5849;
5850; MM32-LABEL: AtomicLoadAdd16:
5851; MM32:       # %bb.0: # %entry
5852; MM32-NEXT:    lui $2, %hi(_gp_disp)
5853; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
5854; MM32-NEXT:    addu $2, $2, $25
5855; MM32-NEXT:    lw $1, %got(z)($2)
5856; MM32-NEXT:    addiu $2, $zero, -4
5857; MM32-NEXT:    and $2, $1, $2
5858; MM32-NEXT:    andi $1, $1, 3
5859; MM32-NEXT:    sll $3, $1, 3
5860; MM32-NEXT:    ori $1, $zero, 65535
5861; MM32-NEXT:    sllv $5, $1, $3
5862; MM32-NEXT:    nor $6, $zero, $5
5863; MM32-NEXT:    sllv $4, $4, $3
5864; MM32-NEXT:  $BB14_1: # %entry
5865; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
5866; MM32-NEXT:    ll $7, 0($2)
5867; MM32-NEXT:    addu $8, $7, $4
5868; MM32-NEXT:    and $8, $8, $5
5869; MM32-NEXT:    and $9, $7, $6
5870; MM32-NEXT:    or $9, $9, $8
5871; MM32-NEXT:    sc $9, 0($2)
5872; MM32-NEXT:    beqzc $9, $BB14_1
5873; MM32-NEXT:  # %bb.2: # %entry
5874; MM32-NEXT:    and $1, $7, $5
5875; MM32-NEXT:    srlv $1, $1, $3
5876; MM32-NEXT:    seh $1, $1
5877; MM32-NEXT:  # %bb.3: # %entry
5878; MM32-NEXT:    jr $ra
5879; MM32-NEXT:    seh $2, $1
5880;
5881; O1-LABEL: AtomicLoadAdd16:
5882; O1:       # %bb.0: # %entry
5883; O1-NEXT:    lui $2, %hi(_gp_disp)
5884; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
5885; O1-NEXT:    addu $1, $2, $25
5886; O1-NEXT:    lw $1, %got(z)($1)
5887; O1-NEXT:    addiu $2, $zero, -4
5888; O1-NEXT:    and $2, $1, $2
5889; O1-NEXT:    andi $1, $1, 3
5890; O1-NEXT:    sll $3, $1, 3
5891; O1-NEXT:    ori $1, $zero, 65535
5892; O1-NEXT:    sllv $5, $1, $3
5893; O1-NEXT:    nor $6, $zero, $5
5894; O1-NEXT:    sllv $4, $4, $3
5895; O1-NEXT:  $BB14_1: # %entry
5896; O1-NEXT:    # =>This Inner Loop Header: Depth=1
5897; O1-NEXT:    ll $7, 0($2)
5898; O1-NEXT:    addu $8, $7, $4
5899; O1-NEXT:    and $8, $8, $5
5900; O1-NEXT:    and $9, $7, $6
5901; O1-NEXT:    or $9, $9, $8
5902; O1-NEXT:    sc $9, 0($2)
5903; O1-NEXT:    beqz $9, $BB14_1
5904; O1-NEXT:    nop
5905; O1-NEXT:  # %bb.2: # %entry
5906; O1-NEXT:    and $1, $7, $5
5907; O1-NEXT:    srlv $1, $1, $3
5908; O1-NEXT:    sll $1, $1, 16
5909; O1-NEXT:    sra $1, $1, 16
5910; O1-NEXT:  # %bb.3: # %entry
5911; O1-NEXT:    sll $1, $1, 16
5912; O1-NEXT:    jr $ra
5913; O1-NEXT:    sra $2, $1, 16
5914;
5915; O2-LABEL: AtomicLoadAdd16:
5916; O2:       # %bb.0: # %entry
5917; O2-NEXT:    lui $2, %hi(_gp_disp)
5918; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
5919; O2-NEXT:    addu $1, $2, $25
5920; O2-NEXT:    lw $1, %got(z)($1)
5921; O2-NEXT:    addiu $2, $zero, -4
5922; O2-NEXT:    and $2, $1, $2
5923; O2-NEXT:    andi $1, $1, 3
5924; O2-NEXT:    sll $3, $1, 3
5925; O2-NEXT:    ori $1, $zero, 65535
5926; O2-NEXT:    sllv $5, $1, $3
5927; O2-NEXT:    nor $6, $zero, $5
5928; O2-NEXT:    sllv $4, $4, $3
5929; O2-NEXT:  $BB14_1: # %entry
5930; O2-NEXT:    # =>This Inner Loop Header: Depth=1
5931; O2-NEXT:    ll $7, 0($2)
5932; O2-NEXT:    addu $8, $7, $4
5933; O2-NEXT:    and $8, $8, $5
5934; O2-NEXT:    and $9, $7, $6
5935; O2-NEXT:    or $9, $9, $8
5936; O2-NEXT:    sc $9, 0($2)
5937; O2-NEXT:    beqz $9, $BB14_1
5938; O2-NEXT:    nop
5939; O2-NEXT:  # %bb.2: # %entry
5940; O2-NEXT:    and $1, $7, $5
5941; O2-NEXT:    srlv $1, $1, $3
5942; O2-NEXT:    sll $1, $1, 16
5943; O2-NEXT:    sra $1, $1, 16
5944; O2-NEXT:  # %bb.3: # %entry
5945; O2-NEXT:    sll $1, $1, 16
5946; O2-NEXT:    jr $ra
5947; O2-NEXT:    sra $2, $1, 16
5948;
5949; O3-LABEL: AtomicLoadAdd16:
5950; O3:       # %bb.0: # %entry
5951; O3-NEXT:    lui $2, %hi(_gp_disp)
5952; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
5953; O3-NEXT:    addu $1, $2, $25
5954; O3-NEXT:    addiu $2, $zero, -4
5955; O3-NEXT:    lw $1, %got(z)($1)
5956; O3-NEXT:    and $2, $1, $2
5957; O3-NEXT:    andi $1, $1, 3
5958; O3-NEXT:    sll $3, $1, 3
5959; O3-NEXT:    ori $1, $zero, 65535
5960; O3-NEXT:    sllv $5, $1, $3
5961; O3-NEXT:    sllv $4, $4, $3
5962; O3-NEXT:    nor $6, $zero, $5
5963; O3-NEXT:  $BB14_1: # %entry
5964; O3-NEXT:    # =>This Inner Loop Header: Depth=1
5965; O3-NEXT:    ll $7, 0($2)
5966; O3-NEXT:    addu $8, $7, $4
5967; O3-NEXT:    and $8, $8, $5
5968; O3-NEXT:    and $9, $7, $6
5969; O3-NEXT:    or $9, $9, $8
5970; O3-NEXT:    sc $9, 0($2)
5971; O3-NEXT:    beqz $9, $BB14_1
5972; O3-NEXT:    nop
5973; O3-NEXT:  # %bb.2: # %entry
5974; O3-NEXT:    and $1, $7, $5
5975; O3-NEXT:    srlv $1, $1, $3
5976; O3-NEXT:    sll $1, $1, 16
5977; O3-NEXT:    sra $1, $1, 16
5978; O3-NEXT:  # %bb.3: # %entry
5979; O3-NEXT:    sll $1, $1, 16
5980; O3-NEXT:    jr $ra
5981; O3-NEXT:    sra $2, $1, 16
5982;
5983; MIPS32EB-LABEL: AtomicLoadAdd16:
5984; MIPS32EB:       # %bb.0: # %entry
5985; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
5986; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
5987; MIPS32EB-NEXT:    addu $1, $2, $25
5988; MIPS32EB-NEXT:    lw $1, %got(z)($1)
5989; MIPS32EB-NEXT:    addiu $2, $zero, -4
5990; MIPS32EB-NEXT:    and $2, $1, $2
5991; MIPS32EB-NEXT:    andi $1, $1, 3
5992; MIPS32EB-NEXT:    xori $1, $1, 2
5993; MIPS32EB-NEXT:    sll $3, $1, 3
5994; MIPS32EB-NEXT:    ori $1, $zero, 65535
5995; MIPS32EB-NEXT:    sllv $5, $1, $3
5996; MIPS32EB-NEXT:    nor $6, $zero, $5
5997; MIPS32EB-NEXT:    sllv $4, $4, $3
5998; MIPS32EB-NEXT:  $BB14_1: # %entry
5999; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
6000; MIPS32EB-NEXT:    ll $7, 0($2)
6001; MIPS32EB-NEXT:    addu $8, $7, $4
6002; MIPS32EB-NEXT:    and $8, $8, $5
6003; MIPS32EB-NEXT:    and $9, $7, $6
6004; MIPS32EB-NEXT:    or $9, $9, $8
6005; MIPS32EB-NEXT:    sc $9, 0($2)
6006; MIPS32EB-NEXT:    beqz $9, $BB14_1
6007; MIPS32EB-NEXT:    nop
6008; MIPS32EB-NEXT:  # %bb.2: # %entry
6009; MIPS32EB-NEXT:    and $1, $7, $5
6010; MIPS32EB-NEXT:    srlv $1, $1, $3
6011; MIPS32EB-NEXT:    sll $1, $1, 16
6012; MIPS32EB-NEXT:    sra $1, $1, 16
6013; MIPS32EB-NEXT:  # %bb.3: # %entry
6014; MIPS32EB-NEXT:    sll $1, $1, 16
6015; MIPS32EB-NEXT:    jr $ra
6016; MIPS32EB-NEXT:    sra $2, $1, 16
6017entry:
6018  %0 = atomicrmw add i16* @z, i16 %incr monotonic
6019  ret i16 %0
6020
6021}
6022
6023; Test that the i16 return value from cmpxchg is recognised as signed,
6024; so that setCC doesn't end up comparing an unsigned value to a signed
6025; value.
6026; The rest of the functions here are testing the atomic expansion, so
6027; we just match the end of the function.
6028define {i16, i1} @foo(i16* %addr, i16 %l, i16 %r, i16 %new) {
6029; MIPS32-LABEL: foo:
6030; MIPS32:       # %bb.0:
6031; MIPS32-NEXT:    addu $1, $5, $6
6032; MIPS32-NEXT:    sync
6033; MIPS32-NEXT:    addiu $2, $zero, -4
6034; MIPS32-NEXT:    and $3, $4, $2
6035; MIPS32-NEXT:    andi $2, $4, 3
6036; MIPS32-NEXT:    sll $4, $2, 3
6037; MIPS32-NEXT:    ori $2, $zero, 65535
6038; MIPS32-NEXT:    sllv $5, $2, $4
6039; MIPS32-NEXT:    nor $6, $zero, $5
6040; MIPS32-NEXT:    andi $2, $1, 65535
6041; MIPS32-NEXT:    sllv $8, $2, $4
6042; MIPS32-NEXT:    andi $2, $7, 65535
6043; MIPS32-NEXT:    sllv $7, $2, $4
6044; MIPS32-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6045; MIPS32-NEXT:    ll $9, 0($3)
6046; MIPS32-NEXT:    and $10, $9, $5
6047; MIPS32-NEXT:    bne $10, $8, $BB15_3
6048; MIPS32-NEXT:    nop
6049; MIPS32-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6050; MIPS32-NEXT:    and $9, $9, $6
6051; MIPS32-NEXT:    or $9, $9, $7
6052; MIPS32-NEXT:    sc $9, 0($3)
6053; MIPS32-NEXT:    beqz $9, $BB15_1
6054; MIPS32-NEXT:    nop
6055; MIPS32-NEXT:  $BB15_3:
6056; MIPS32-NEXT:    srlv $2, $10, $4
6057; MIPS32-NEXT:    sll $2, $2, 16
6058; MIPS32-NEXT:    sra $2, $2, 16
6059; MIPS32-NEXT:  # %bb.4:
6060; MIPS32-NEXT:    sll $1, $1, 16
6061; MIPS32-NEXT:    sra $1, $1, 16
6062; MIPS32-NEXT:    xor $1, $2, $1
6063; MIPS32-NEXT:    sltiu $3, $1, 1
6064; MIPS32-NEXT:    sync
6065; MIPS32-NEXT:    jr $ra
6066; MIPS32-NEXT:    nop
6067;
6068; MIPS32O0-LABEL: foo:
6069; MIPS32O0:       # %bb.0:
6070; MIPS32O0-NEXT:    addiu $sp, $sp, -8
6071; MIPS32O0-NEXT:    .cfi_def_cfa_offset 8
6072; MIPS32O0-NEXT:    addu $1, $5, $6
6073; MIPS32O0-NEXT:    sync
6074; MIPS32O0-NEXT:    addiu $2, $zero, -4
6075; MIPS32O0-NEXT:    and $2, $4, $2
6076; MIPS32O0-NEXT:    andi $3, $4, 3
6077; MIPS32O0-NEXT:    sll $3, $3, 3
6078; MIPS32O0-NEXT:    ori $4, $zero, 65535
6079; MIPS32O0-NEXT:    sllv $4, $4, $3
6080; MIPS32O0-NEXT:    nor $5, $zero, $4
6081; MIPS32O0-NEXT:    andi $6, $1, 65535
6082; MIPS32O0-NEXT:    sllv $6, $6, $3
6083; MIPS32O0-NEXT:    andi $7, $7, 65535
6084; MIPS32O0-NEXT:    sllv $7, $7, $3
6085; MIPS32O0-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6086; MIPS32O0-NEXT:    ll $9, 0($2)
6087; MIPS32O0-NEXT:    and $10, $9, $4
6088; MIPS32O0-NEXT:    bne $10, $6, $BB15_3
6089; MIPS32O0-NEXT:    nop
6090; MIPS32O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6091; MIPS32O0-NEXT:    and $9, $9, $5
6092; MIPS32O0-NEXT:    or $9, $9, $7
6093; MIPS32O0-NEXT:    sc $9, 0($2)
6094; MIPS32O0-NEXT:    beqz $9, $BB15_1
6095; MIPS32O0-NEXT:    nop
6096; MIPS32O0-NEXT:  $BB15_3:
6097; MIPS32O0-NEXT:    srlv $8, $10, $3
6098; MIPS32O0-NEXT:    sll $8, $8, 16
6099; MIPS32O0-NEXT:    sra $8, $8, 16
6100; MIPS32O0-NEXT:  # %bb.4:
6101; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
6102; MIPS32O0-NEXT:    sw $8, 0($sp) # 4-byte Folded Spill
6103; MIPS32O0-NEXT:  # %bb.5:
6104; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
6105; MIPS32O0-NEXT:    sll $2, $1, 16
6106; MIPS32O0-NEXT:    sra $2, $2, 16
6107; MIPS32O0-NEXT:    lw $3, 0($sp) # 4-byte Folded Reload
6108; MIPS32O0-NEXT:    xor $2, $3, $2
6109; MIPS32O0-NEXT:    sltiu $3, $2, 1
6110; MIPS32O0-NEXT:    sync
6111; MIPS32O0-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
6112; MIPS32O0-NEXT:    addiu $sp, $sp, 8
6113; MIPS32O0-NEXT:    jr $ra
6114; MIPS32O0-NEXT:    nop
6115;
6116; MIPS32R2-LABEL: foo:
6117; MIPS32R2:       # %bb.0:
6118; MIPS32R2-NEXT:    addu $1, $5, $6
6119; MIPS32R2-NEXT:    sync
6120; MIPS32R2-NEXT:    addiu $2, $zero, -4
6121; MIPS32R2-NEXT:    and $3, $4, $2
6122; MIPS32R2-NEXT:    andi $2, $4, 3
6123; MIPS32R2-NEXT:    sll $4, $2, 3
6124; MIPS32R2-NEXT:    ori $2, $zero, 65535
6125; MIPS32R2-NEXT:    sllv $5, $2, $4
6126; MIPS32R2-NEXT:    nor $6, $zero, $5
6127; MIPS32R2-NEXT:    andi $2, $1, 65535
6128; MIPS32R2-NEXT:    sllv $8, $2, $4
6129; MIPS32R2-NEXT:    andi $2, $7, 65535
6130; MIPS32R2-NEXT:    sllv $7, $2, $4
6131; MIPS32R2-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6132; MIPS32R2-NEXT:    ll $9, 0($3)
6133; MIPS32R2-NEXT:    and $10, $9, $5
6134; MIPS32R2-NEXT:    bne $10, $8, $BB15_3
6135; MIPS32R2-NEXT:    nop
6136; MIPS32R2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6137; MIPS32R2-NEXT:    and $9, $9, $6
6138; MIPS32R2-NEXT:    or $9, $9, $7
6139; MIPS32R2-NEXT:    sc $9, 0($3)
6140; MIPS32R2-NEXT:    beqz $9, $BB15_1
6141; MIPS32R2-NEXT:    nop
6142; MIPS32R2-NEXT:  $BB15_3:
6143; MIPS32R2-NEXT:    srlv $2, $10, $4
6144; MIPS32R2-NEXT:    seh $2, $2
6145; MIPS32R2-NEXT:  # %bb.4:
6146; MIPS32R2-NEXT:    seh $1, $1
6147; MIPS32R2-NEXT:    xor $1, $2, $1
6148; MIPS32R2-NEXT:    sltiu $3, $1, 1
6149; MIPS32R2-NEXT:    sync
6150; MIPS32R2-NEXT:    jr $ra
6151; MIPS32R2-NEXT:    nop
6152;
6153; MIPS32R6-LABEL: foo:
6154; MIPS32R6:       # %bb.0:
6155; MIPS32R6-NEXT:    addu $1, $5, $6
6156; MIPS32R6-NEXT:    sync
6157; MIPS32R6-NEXT:    addiu $2, $zero, -4
6158; MIPS32R6-NEXT:    and $3, $4, $2
6159; MIPS32R6-NEXT:    andi $2, $4, 3
6160; MIPS32R6-NEXT:    sll $4, $2, 3
6161; MIPS32R6-NEXT:    ori $2, $zero, 65535
6162; MIPS32R6-NEXT:    sllv $5, $2, $4
6163; MIPS32R6-NEXT:    nor $6, $zero, $5
6164; MIPS32R6-NEXT:    andi $2, $1, 65535
6165; MIPS32R6-NEXT:    sllv $8, $2, $4
6166; MIPS32R6-NEXT:    andi $2, $7, 65535
6167; MIPS32R6-NEXT:    sllv $7, $2, $4
6168; MIPS32R6-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6169; MIPS32R6-NEXT:    ll $9, 0($3)
6170; MIPS32R6-NEXT:    and $10, $9, $5
6171; MIPS32R6-NEXT:    bnec $10, $8, $BB15_3
6172; MIPS32R6-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6173; MIPS32R6-NEXT:    and $9, $9, $6
6174; MIPS32R6-NEXT:    or $9, $9, $7
6175; MIPS32R6-NEXT:    sc $9, 0($3)
6176; MIPS32R6-NEXT:    beqzc $9, $BB15_1
6177; MIPS32R6-NEXT:  $BB15_3:
6178; MIPS32R6-NEXT:    srlv $2, $10, $4
6179; MIPS32R6-NEXT:    seh $2, $2
6180; MIPS32R6-NEXT:  # %bb.4:
6181; MIPS32R6-NEXT:    seh $1, $1
6182; MIPS32R6-NEXT:    xor $1, $2, $1
6183; MIPS32R6-NEXT:    sltiu $3, $1, 1
6184; MIPS32R6-NEXT:    sync
6185; MIPS32R6-NEXT:    jrc $ra
6186;
6187; MIPS32R6O0-LABEL: foo:
6188; MIPS32R6O0:       # %bb.0:
6189; MIPS32R6O0-NEXT:    addiu $sp, $sp, -24
6190; MIPS32R6O0-NEXT:    .cfi_def_cfa_offset 24
6191; MIPS32R6O0-NEXT:    move $1, $7
6192; MIPS32R6O0-NEXT:    move $2, $6
6193; MIPS32R6O0-NEXT:    move $3, $5
6194; MIPS32R6O0-NEXT:    move $8, $4
6195; MIPS32R6O0-NEXT:    addu $5, $5, $6
6196; MIPS32R6O0-NEXT:    sync
6197; MIPS32R6O0-NEXT:    addiu $6, $zero, -4
6198; MIPS32R6O0-NEXT:    and $6, $4, $6
6199; MIPS32R6O0-NEXT:    andi $4, $4, 3
6200; MIPS32R6O0-NEXT:    sll $4, $4, 3
6201; MIPS32R6O0-NEXT:    ori $9, $zero, 65535
6202; MIPS32R6O0-NEXT:    sllv $9, $9, $4
6203; MIPS32R6O0-NEXT:    nor $10, $zero, $9
6204; MIPS32R6O0-NEXT:    andi $11, $5, 65535
6205; MIPS32R6O0-NEXT:    sllv $11, $11, $4
6206; MIPS32R6O0-NEXT:    andi $7, $7, 65535
6207; MIPS32R6O0-NEXT:    sllv $7, $7, $4
6208; MIPS32R6O0-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6209; MIPS32R6O0-NEXT:    ll $13, 0($6)
6210; MIPS32R6O0-NEXT:    and $14, $13, $9
6211; MIPS32R6O0-NEXT:    bnec $14, $11, $BB15_3
6212; MIPS32R6O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6213; MIPS32R6O0-NEXT:    and $13, $13, $10
6214; MIPS32R6O0-NEXT:    or $13, $13, $7
6215; MIPS32R6O0-NEXT:    sc $13, 0($6)
6216; MIPS32R6O0-NEXT:    beqzc $13, $BB15_1
6217; MIPS32R6O0-NEXT:  $BB15_3:
6218; MIPS32R6O0-NEXT:    srlv $12, $14, $4
6219; MIPS32R6O0-NEXT:    seh $12, $12
6220; MIPS32R6O0-NEXT:  # %bb.4:
6221; MIPS32R6O0-NEXT:    sw $1, 20($sp) # 4-byte Folded Spill
6222; MIPS32R6O0-NEXT:    sw $2, 16($sp) # 4-byte Folded Spill
6223; MIPS32R6O0-NEXT:    sw $3, 12($sp) # 4-byte Folded Spill
6224; MIPS32R6O0-NEXT:    sw $8, 8($sp) # 4-byte Folded Spill
6225; MIPS32R6O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
6226; MIPS32R6O0-NEXT:    sw $12, 0($sp) # 4-byte Folded Spill
6227; MIPS32R6O0-NEXT:  # %bb.5:
6228; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
6229; MIPS32R6O0-NEXT:    seh $2, $1
6230; MIPS32R6O0-NEXT:    lw $3, 0($sp) # 4-byte Folded Reload
6231; MIPS32R6O0-NEXT:    xor $2, $3, $2
6232; MIPS32R6O0-NEXT:    sltiu $3, $2, 1
6233; MIPS32R6O0-NEXT:    sync
6234; MIPS32R6O0-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
6235; MIPS32R6O0-NEXT:    addiu $sp, $sp, 24
6236; MIPS32R6O0-NEXT:    jrc $ra
6237;
6238; MIPS4-LABEL: foo:
6239; MIPS4:       # %bb.0:
6240; MIPS4-NEXT:    sll $1, $6, 0
6241; MIPS4-NEXT:    sll $2, $5, 0
6242; MIPS4-NEXT:    addu $1, $2, $1
6243; MIPS4-NEXT:    sync
6244; MIPS4-NEXT:    sll $2, $7, 0
6245; MIPS4-NEXT:    daddiu $3, $zero, -4
6246; MIPS4-NEXT:    and $3, $4, $3
6247; MIPS4-NEXT:    andi $4, $4, 3
6248; MIPS4-NEXT:    sll $4, $4, 3
6249; MIPS4-NEXT:    ori $5, $zero, 65535
6250; MIPS4-NEXT:    sllv $5, $5, $4
6251; MIPS4-NEXT:    nor $6, $zero, $5
6252; MIPS4-NEXT:    andi $7, $1, 65535
6253; MIPS4-NEXT:    sllv $7, $7, $4
6254; MIPS4-NEXT:    andi $2, $2, 65535
6255; MIPS4-NEXT:    sllv $8, $2, $4
6256; MIPS4-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6257; MIPS4-NEXT:    ll $9, 0($3)
6258; MIPS4-NEXT:    and $10, $9, $5
6259; MIPS4-NEXT:    bne $10, $7, .LBB15_3
6260; MIPS4-NEXT:    nop
6261; MIPS4-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6262; MIPS4-NEXT:    and $9, $9, $6
6263; MIPS4-NEXT:    or $9, $9, $8
6264; MIPS4-NEXT:    sc $9, 0($3)
6265; MIPS4-NEXT:    beqz $9, .LBB15_1
6266; MIPS4-NEXT:    nop
6267; MIPS4-NEXT:  .LBB15_3:
6268; MIPS4-NEXT:    srlv $2, $10, $4
6269; MIPS4-NEXT:    sll $2, $2, 16
6270; MIPS4-NEXT:    sra $2, $2, 16
6271; MIPS4-NEXT:  # %bb.4:
6272; MIPS4-NEXT:    sll $1, $1, 16
6273; MIPS4-NEXT:    sra $1, $1, 16
6274; MIPS4-NEXT:    xor $1, $2, $1
6275; MIPS4-NEXT:    sltiu $3, $1, 1
6276; MIPS4-NEXT:    sync
6277; MIPS4-NEXT:    jr $ra
6278; MIPS4-NEXT:    nop
6279;
6280; MIPS64-LABEL: foo:
6281; MIPS64:       # %bb.0:
6282; MIPS64-NEXT:    sll $1, $6, 0
6283; MIPS64-NEXT:    sll $2, $5, 0
6284; MIPS64-NEXT:    addu $1, $2, $1
6285; MIPS64-NEXT:    sync
6286; MIPS64-NEXT:    sll $2, $7, 0
6287; MIPS64-NEXT:    daddiu $3, $zero, -4
6288; MIPS64-NEXT:    and $3, $4, $3
6289; MIPS64-NEXT:    andi $4, $4, 3
6290; MIPS64-NEXT:    sll $4, $4, 3
6291; MIPS64-NEXT:    ori $5, $zero, 65535
6292; MIPS64-NEXT:    sllv $5, $5, $4
6293; MIPS64-NEXT:    nor $6, $zero, $5
6294; MIPS64-NEXT:    andi $7, $1, 65535
6295; MIPS64-NEXT:    sllv $7, $7, $4
6296; MIPS64-NEXT:    andi $2, $2, 65535
6297; MIPS64-NEXT:    sllv $8, $2, $4
6298; MIPS64-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6299; MIPS64-NEXT:    ll $9, 0($3)
6300; MIPS64-NEXT:    and $10, $9, $5
6301; MIPS64-NEXT:    bne $10, $7, .LBB15_3
6302; MIPS64-NEXT:    nop
6303; MIPS64-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6304; MIPS64-NEXT:    and $9, $9, $6
6305; MIPS64-NEXT:    or $9, $9, $8
6306; MIPS64-NEXT:    sc $9, 0($3)
6307; MIPS64-NEXT:    beqz $9, .LBB15_1
6308; MIPS64-NEXT:    nop
6309; MIPS64-NEXT:  .LBB15_3:
6310; MIPS64-NEXT:    srlv $2, $10, $4
6311; MIPS64-NEXT:    sll $2, $2, 16
6312; MIPS64-NEXT:    sra $2, $2, 16
6313; MIPS64-NEXT:  # %bb.4:
6314; MIPS64-NEXT:    sll $1, $1, 16
6315; MIPS64-NEXT:    sra $1, $1, 16
6316; MIPS64-NEXT:    xor $1, $2, $1
6317; MIPS64-NEXT:    sltiu $3, $1, 1
6318; MIPS64-NEXT:    sync
6319; MIPS64-NEXT:    jr $ra
6320; MIPS64-NEXT:    nop
6321;
6322; MIPS64R2-LABEL: foo:
6323; MIPS64R2:       # %bb.0:
6324; MIPS64R2-NEXT:    sll $1, $6, 0
6325; MIPS64R2-NEXT:    sll $2, $5, 0
6326; MIPS64R2-NEXT:    addu $1, $2, $1
6327; MIPS64R2-NEXT:    sync
6328; MIPS64R2-NEXT:    sll $2, $7, 0
6329; MIPS64R2-NEXT:    daddiu $3, $zero, -4
6330; MIPS64R2-NEXT:    and $3, $4, $3
6331; MIPS64R2-NEXT:    andi $4, $4, 3
6332; MIPS64R2-NEXT:    sll $4, $4, 3
6333; MIPS64R2-NEXT:    ori $5, $zero, 65535
6334; MIPS64R2-NEXT:    sllv $5, $5, $4
6335; MIPS64R2-NEXT:    nor $6, $zero, $5
6336; MIPS64R2-NEXT:    andi $7, $1, 65535
6337; MIPS64R2-NEXT:    sllv $7, $7, $4
6338; MIPS64R2-NEXT:    andi $2, $2, 65535
6339; MIPS64R2-NEXT:    sllv $8, $2, $4
6340; MIPS64R2-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6341; MIPS64R2-NEXT:    ll $9, 0($3)
6342; MIPS64R2-NEXT:    and $10, $9, $5
6343; MIPS64R2-NEXT:    bne $10, $7, .LBB15_3
6344; MIPS64R2-NEXT:    nop
6345; MIPS64R2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6346; MIPS64R2-NEXT:    and $9, $9, $6
6347; MIPS64R2-NEXT:    or $9, $9, $8
6348; MIPS64R2-NEXT:    sc $9, 0($3)
6349; MIPS64R2-NEXT:    beqz $9, .LBB15_1
6350; MIPS64R2-NEXT:    nop
6351; MIPS64R2-NEXT:  .LBB15_3:
6352; MIPS64R2-NEXT:    srlv $2, $10, $4
6353; MIPS64R2-NEXT:    seh $2, $2
6354; MIPS64R2-NEXT:  # %bb.4:
6355; MIPS64R2-NEXT:    seh $1, $1
6356; MIPS64R2-NEXT:    xor $1, $2, $1
6357; MIPS64R2-NEXT:    sltiu $3, $1, 1
6358; MIPS64R2-NEXT:    sync
6359; MIPS64R2-NEXT:    jr $ra
6360; MIPS64R2-NEXT:    nop
6361;
6362; MIPS64R6-LABEL: foo:
6363; MIPS64R6:       # %bb.0:
6364; MIPS64R6-NEXT:    sll $1, $6, 0
6365; MIPS64R6-NEXT:    sll $2, $5, 0
6366; MIPS64R6-NEXT:    addu $1, $2, $1
6367; MIPS64R6-NEXT:    sync
6368; MIPS64R6-NEXT:    sll $2, $7, 0
6369; MIPS64R6-NEXT:    daddiu $3, $zero, -4
6370; MIPS64R6-NEXT:    and $3, $4, $3
6371; MIPS64R6-NEXT:    andi $4, $4, 3
6372; MIPS64R6-NEXT:    sll $4, $4, 3
6373; MIPS64R6-NEXT:    ori $5, $zero, 65535
6374; MIPS64R6-NEXT:    sllv $5, $5, $4
6375; MIPS64R6-NEXT:    nor $6, $zero, $5
6376; MIPS64R6-NEXT:    andi $7, $1, 65535
6377; MIPS64R6-NEXT:    sllv $7, $7, $4
6378; MIPS64R6-NEXT:    andi $2, $2, 65535
6379; MIPS64R6-NEXT:    sllv $8, $2, $4
6380; MIPS64R6-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6381; MIPS64R6-NEXT:    ll $9, 0($3)
6382; MIPS64R6-NEXT:    and $10, $9, $5
6383; MIPS64R6-NEXT:    bnec $10, $7, .LBB15_3
6384; MIPS64R6-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6385; MIPS64R6-NEXT:    and $9, $9, $6
6386; MIPS64R6-NEXT:    or $9, $9, $8
6387; MIPS64R6-NEXT:    sc $9, 0($3)
6388; MIPS64R6-NEXT:    beqzc $9, .LBB15_1
6389; MIPS64R6-NEXT:  .LBB15_3:
6390; MIPS64R6-NEXT:    srlv $2, $10, $4
6391; MIPS64R6-NEXT:    seh $2, $2
6392; MIPS64R6-NEXT:  # %bb.4:
6393; MIPS64R6-NEXT:    seh $1, $1
6394; MIPS64R6-NEXT:    xor $1, $2, $1
6395; MIPS64R6-NEXT:    sltiu $3, $1, 1
6396; MIPS64R6-NEXT:    sync
6397; MIPS64R6-NEXT:    jrc $ra
6398;
6399; MIPS64R6O0-LABEL: foo:
6400; MIPS64R6O0:       # %bb.0:
6401; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
6402; MIPS64R6O0-NEXT:    .cfi_def_cfa_offset 16
6403; MIPS64R6O0-NEXT:    move $1, $7
6404; MIPS64R6O0-NEXT:    sll $1, $1, 0
6405; MIPS64R6O0-NEXT:    move $2, $6
6406; MIPS64R6O0-NEXT:    sll $2, $2, 0
6407; MIPS64R6O0-NEXT:    move $3, $5
6408; MIPS64R6O0-NEXT:    sll $3, $3, 0
6409; MIPS64R6O0-NEXT:    move $5, $4
6410; MIPS64R6O0-NEXT:    addu $2, $3, $2
6411; MIPS64R6O0-NEXT:    sync
6412; MIPS64R6O0-NEXT:    daddiu $6, $zero, -4
6413; MIPS64R6O0-NEXT:    and $6, $4, $6
6414; MIPS64R6O0-NEXT:    andi $3, $4, 3
6415; MIPS64R6O0-NEXT:    xori $3, $3, 2
6416; MIPS64R6O0-NEXT:    sll $3, $3, 3
6417; MIPS64R6O0-NEXT:    ori $8, $zero, 65535
6418; MIPS64R6O0-NEXT:    sllv $8, $8, $3
6419; MIPS64R6O0-NEXT:    nor $9, $zero, $8
6420; MIPS64R6O0-NEXT:    andi $10, $2, 65535
6421; MIPS64R6O0-NEXT:    sllv $10, $10, $3
6422; MIPS64R6O0-NEXT:    andi $1, $1, 65535
6423; MIPS64R6O0-NEXT:    sllv $1, $1, $3
6424; MIPS64R6O0-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6425; MIPS64R6O0-NEXT:    ll $12, 0($6)
6426; MIPS64R6O0-NEXT:    and $13, $12, $8
6427; MIPS64R6O0-NEXT:    bnec $13, $10, .LBB15_3
6428; MIPS64R6O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6429; MIPS64R6O0-NEXT:    and $12, $12, $9
6430; MIPS64R6O0-NEXT:    or $12, $12, $1
6431; MIPS64R6O0-NEXT:    sc $12, 0($6)
6432; MIPS64R6O0-NEXT:    beqzc $12, .LBB15_1
6433; MIPS64R6O0-NEXT:  .LBB15_3:
6434; MIPS64R6O0-NEXT:    srlv $11, $13, $3
6435; MIPS64R6O0-NEXT:    seh $11, $11
6436; MIPS64R6O0-NEXT:  # %bb.4:
6437; MIPS64R6O0-NEXT:    sd $5, 8($sp) # 8-byte Folded Spill
6438; MIPS64R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
6439; MIPS64R6O0-NEXT:    sw $11, 0($sp) # 4-byte Folded Spill
6440; MIPS64R6O0-NEXT:  # %bb.5:
6441; MIPS64R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
6442; MIPS64R6O0-NEXT:    seh $2, $1
6443; MIPS64R6O0-NEXT:    lw $3, 0($sp) # 4-byte Folded Reload
6444; MIPS64R6O0-NEXT:    xor $2, $3, $2
6445; MIPS64R6O0-NEXT:    sltiu $3, $2, 1
6446; MIPS64R6O0-NEXT:    sync
6447; MIPS64R6O0-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
6448; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
6449; MIPS64R6O0-NEXT:    jrc $ra
6450;
6451; MM32-LABEL: foo:
6452; MM32:       # %bb.0:
6453; MM32-NEXT:    addu16 $3, $5, $6
6454; MM32-NEXT:    sync
6455; MM32-NEXT:    addiu $1, $zero, -4
6456; MM32-NEXT:    and $1, $4, $1
6457; MM32-NEXT:    andi $2, $4, 3
6458; MM32-NEXT:    sll $4, $2, 3
6459; MM32-NEXT:    ori $2, $zero, 65535
6460; MM32-NEXT:    sllv $5, $2, $4
6461; MM32-NEXT:    nor $6, $zero, $5
6462; MM32-NEXT:    andi $2, $3, 65535
6463; MM32-NEXT:    sllv $8, $2, $4
6464; MM32-NEXT:    andi $2, $7, 65535
6465; MM32-NEXT:    sllv $7, $2, $4
6466; MM32-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6467; MM32-NEXT:    ll $9, 0($1)
6468; MM32-NEXT:    and $10, $9, $5
6469; MM32-NEXT:    bne $10, $8, $BB15_3
6470; MM32-NEXT:    nop
6471; MM32-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6472; MM32-NEXT:    and $9, $9, $6
6473; MM32-NEXT:    or $9, $9, $7
6474; MM32-NEXT:    sc $9, 0($1)
6475; MM32-NEXT:    beqzc $9, $BB15_1
6476; MM32-NEXT:  $BB15_3:
6477; MM32-NEXT:    srlv $2, $10, $4
6478; MM32-NEXT:    seh $2, $2
6479; MM32-NEXT:  # %bb.4:
6480; MM32-NEXT:    seh $1, $3
6481; MM32-NEXT:    xor $1, $2, $1
6482; MM32-NEXT:    sltiu $3, $1, 1
6483; MM32-NEXT:    sync
6484; MM32-NEXT:    jrc $ra
6485;
6486; O1-LABEL: foo:
6487; O1:       # %bb.0:
6488; O1-NEXT:    addu $1, $5, $6
6489; O1-NEXT:    sync
6490; O1-NEXT:    addiu $2, $zero, -4
6491; O1-NEXT:    and $3, $4, $2
6492; O1-NEXT:    andi $2, $4, 3
6493; O1-NEXT:    sll $4, $2, 3
6494; O1-NEXT:    ori $2, $zero, 65535
6495; O1-NEXT:    sllv $5, $2, $4
6496; O1-NEXT:    nor $6, $zero, $5
6497; O1-NEXT:    andi $2, $1, 65535
6498; O1-NEXT:    sllv $8, $2, $4
6499; O1-NEXT:    andi $2, $7, 65535
6500; O1-NEXT:    sllv $7, $2, $4
6501; O1-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6502; O1-NEXT:    ll $9, 0($3)
6503; O1-NEXT:    and $10, $9, $5
6504; O1-NEXT:    bne $10, $8, $BB15_3
6505; O1-NEXT:    nop
6506; O1-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6507; O1-NEXT:    and $9, $9, $6
6508; O1-NEXT:    or $9, $9, $7
6509; O1-NEXT:    sc $9, 0($3)
6510; O1-NEXT:    beqz $9, $BB15_1
6511; O1-NEXT:    nop
6512; O1-NEXT:  $BB15_3:
6513; O1-NEXT:    srlv $2, $10, $4
6514; O1-NEXT:    sll $2, $2, 16
6515; O1-NEXT:    sra $2, $2, 16
6516; O1-NEXT:  # %bb.4:
6517; O1-NEXT:    sll $1, $1, 16
6518; O1-NEXT:    sra $1, $1, 16
6519; O1-NEXT:    xor $1, $2, $1
6520; O1-NEXT:    sltiu $3, $1, 1
6521; O1-NEXT:    sync
6522; O1-NEXT:    jr $ra
6523; O1-NEXT:    nop
6524;
6525; O2-LABEL: foo:
6526; O2:       # %bb.0:
6527; O2-NEXT:    addu $1, $5, $6
6528; O2-NEXT:    sync
6529; O2-NEXT:    addiu $2, $zero, -4
6530; O2-NEXT:    and $3, $4, $2
6531; O2-NEXT:    andi $2, $4, 3
6532; O2-NEXT:    sll $4, $2, 3
6533; O2-NEXT:    ori $2, $zero, 65535
6534; O2-NEXT:    sllv $5, $2, $4
6535; O2-NEXT:    nor $6, $zero, $5
6536; O2-NEXT:    andi $2, $1, 65535
6537; O2-NEXT:    sllv $8, $2, $4
6538; O2-NEXT:    andi $2, $7, 65535
6539; O2-NEXT:    sllv $7, $2, $4
6540; O2-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6541; O2-NEXT:    ll $9, 0($3)
6542; O2-NEXT:    and $10, $9, $5
6543; O2-NEXT:    bne $10, $8, $BB15_3
6544; O2-NEXT:    nop
6545; O2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6546; O2-NEXT:    and $9, $9, $6
6547; O2-NEXT:    or $9, $9, $7
6548; O2-NEXT:    sc $9, 0($3)
6549; O2-NEXT:    beqz $9, $BB15_1
6550; O2-NEXT:    nop
6551; O2-NEXT:  $BB15_3:
6552; O2-NEXT:    srlv $2, $10, $4
6553; O2-NEXT:    sll $2, $2, 16
6554; O2-NEXT:    sra $2, $2, 16
6555; O2-NEXT:  # %bb.4:
6556; O2-NEXT:    sll $1, $1, 16
6557; O2-NEXT:    sra $1, $1, 16
6558; O2-NEXT:    xor $1, $2, $1
6559; O2-NEXT:    sltiu $3, $1, 1
6560; O2-NEXT:    sync
6561; O2-NEXT:    jr $ra
6562; O2-NEXT:    nop
6563;
6564; O3-LABEL: foo:
6565; O3:       # %bb.0:
6566; O3-NEXT:    addiu $2, $zero, -4
6567; O3-NEXT:    addu $1, $5, $6
6568; O3-NEXT:    sync
6569; O3-NEXT:    and $3, $4, $2
6570; O3-NEXT:    andi $2, $4, 3
6571; O3-NEXT:    sll $4, $2, 3
6572; O3-NEXT:    ori $2, $zero, 65535
6573; O3-NEXT:    sllv $5, $2, $4
6574; O3-NEXT:    andi $2, $1, 65535
6575; O3-NEXT:    sll $1, $1, 16
6576; O3-NEXT:    sllv $8, $2, $4
6577; O3-NEXT:    andi $2, $7, 65535
6578; O3-NEXT:    nor $6, $zero, $5
6579; O3-NEXT:    sra $1, $1, 16
6580; O3-NEXT:    sllv $7, $2, $4
6581; O3-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6582; O3-NEXT:    ll $9, 0($3)
6583; O3-NEXT:    and $10, $9, $5
6584; O3-NEXT:    bne $10, $8, $BB15_3
6585; O3-NEXT:    nop
6586; O3-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6587; O3-NEXT:    and $9, $9, $6
6588; O3-NEXT:    or $9, $9, $7
6589; O3-NEXT:    sc $9, 0($3)
6590; O3-NEXT:    beqz $9, $BB15_1
6591; O3-NEXT:    nop
6592; O3-NEXT:  $BB15_3:
6593; O3-NEXT:    srlv $2, $10, $4
6594; O3-NEXT:    sll $2, $2, 16
6595; O3-NEXT:    sra $2, $2, 16
6596; O3-NEXT:  # %bb.4:
6597; O3-NEXT:    sync
6598; O3-NEXT:    xor $1, $2, $1
6599; O3-NEXT:    jr $ra
6600; O3-NEXT:    sltiu $3, $1, 1
6601;
6602; MIPS32EB-LABEL: foo:
6603; MIPS32EB:       # %bb.0:
6604; MIPS32EB-NEXT:    addu $1, $5, $6
6605; MIPS32EB-NEXT:    sync
6606; MIPS32EB-NEXT:    addiu $2, $zero, -4
6607; MIPS32EB-NEXT:    and $3, $4, $2
6608; MIPS32EB-NEXT:    andi $2, $4, 3
6609; MIPS32EB-NEXT:    xori $2, $2, 2
6610; MIPS32EB-NEXT:    sll $4, $2, 3
6611; MIPS32EB-NEXT:    ori $2, $zero, 65535
6612; MIPS32EB-NEXT:    sllv $5, $2, $4
6613; MIPS32EB-NEXT:    nor $6, $zero, $5
6614; MIPS32EB-NEXT:    andi $2, $1, 65535
6615; MIPS32EB-NEXT:    sllv $8, $2, $4
6616; MIPS32EB-NEXT:    andi $2, $7, 65535
6617; MIPS32EB-NEXT:    sllv $7, $2, $4
6618; MIPS32EB-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6619; MIPS32EB-NEXT:    ll $9, 0($3)
6620; MIPS32EB-NEXT:    and $10, $9, $5
6621; MIPS32EB-NEXT:    bne $10, $8, $BB15_3
6622; MIPS32EB-NEXT:    nop
6623; MIPS32EB-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6624; MIPS32EB-NEXT:    and $9, $9, $6
6625; MIPS32EB-NEXT:    or $9, $9, $7
6626; MIPS32EB-NEXT:    sc $9, 0($3)
6627; MIPS32EB-NEXT:    beqz $9, $BB15_1
6628; MIPS32EB-NEXT:    nop
6629; MIPS32EB-NEXT:  $BB15_3:
6630; MIPS32EB-NEXT:    srlv $2, $10, $4
6631; MIPS32EB-NEXT:    sll $2, $2, 16
6632; MIPS32EB-NEXT:    sra $2, $2, 16
6633; MIPS32EB-NEXT:  # %bb.4:
6634; MIPS32EB-NEXT:    sll $1, $1, 16
6635; MIPS32EB-NEXT:    sra $1, $1, 16
6636; MIPS32EB-NEXT:    xor $1, $2, $1
6637; MIPS32EB-NEXT:    sltiu $3, $1, 1
6638; MIPS32EB-NEXT:    sync
6639; MIPS32EB-NEXT:    jr $ra
6640; MIPS32EB-NEXT:    nop
6641  %desired = add i16 %l, %r
6642  %res = cmpxchg i16* %addr, i16 %desired, i16 %new seq_cst seq_cst
6643  ret {i16, i1} %res
6644}
6645
6646@countsint = common global i32 0, align 4
6647
6648define i32 @CheckSync(i32 signext %v) nounwind noinline {
6649; MIPS32-LABEL: CheckSync:
6650; MIPS32:       # %bb.0: # %entry
6651; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
6652; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6653; MIPS32-NEXT:    addu $1, $2, $25
6654; MIPS32-NEXT:    sync
6655; MIPS32-NEXT:    lw $1, %got(countsint)($1)
6656; MIPS32-NEXT:  $BB16_1: # %entry
6657; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
6658; MIPS32-NEXT:    ll $2, 0($1)
6659; MIPS32-NEXT:    addu $3, $2, $4
6660; MIPS32-NEXT:    sc $3, 0($1)
6661; MIPS32-NEXT:    beqz $3, $BB16_1
6662; MIPS32-NEXT:    nop
6663; MIPS32-NEXT:  # %bb.2: # %entry
6664; MIPS32-NEXT:    sync
6665; MIPS32-NEXT:    jr $ra
6666; MIPS32-NEXT:    nop
6667;
6668; MIPS32O0-LABEL: CheckSync:
6669; MIPS32O0:       # %bb.0: # %entry
6670; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
6671; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6672; MIPS32O0-NEXT:    addu $1, $2, $25
6673; MIPS32O0-NEXT:    sync
6674; MIPS32O0-NEXT:    lw $1, %got(countsint)($1)
6675; MIPS32O0-NEXT:  $BB16_1: # %entry
6676; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
6677; MIPS32O0-NEXT:    ll $2, 0($1)
6678; MIPS32O0-NEXT:    addu $3, $2, $4
6679; MIPS32O0-NEXT:    sc $3, 0($1)
6680; MIPS32O0-NEXT:    beqz $3, $BB16_1
6681; MIPS32O0-NEXT:    nop
6682; MIPS32O0-NEXT:  # %bb.2: # %entry
6683; MIPS32O0-NEXT:    sync
6684; MIPS32O0-NEXT:    jr $ra
6685; MIPS32O0-NEXT:    nop
6686;
6687; MIPS32R2-LABEL: CheckSync:
6688; MIPS32R2:       # %bb.0: # %entry
6689; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
6690; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6691; MIPS32R2-NEXT:    addu $1, $2, $25
6692; MIPS32R2-NEXT:    sync
6693; MIPS32R2-NEXT:    lw $1, %got(countsint)($1)
6694; MIPS32R2-NEXT:  $BB16_1: # %entry
6695; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
6696; MIPS32R2-NEXT:    ll $2, 0($1)
6697; MIPS32R2-NEXT:    addu $3, $2, $4
6698; MIPS32R2-NEXT:    sc $3, 0($1)
6699; MIPS32R2-NEXT:    beqz $3, $BB16_1
6700; MIPS32R2-NEXT:    nop
6701; MIPS32R2-NEXT:  # %bb.2: # %entry
6702; MIPS32R2-NEXT:    sync
6703; MIPS32R2-NEXT:    jr $ra
6704; MIPS32R2-NEXT:    nop
6705;
6706; MIPS32R6-LABEL: CheckSync:
6707; MIPS32R6:       # %bb.0: # %entry
6708; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
6709; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
6710; MIPS32R6-NEXT:    addu $1, $2, $25
6711; MIPS32R6-NEXT:    sync
6712; MIPS32R6-NEXT:    lw $1, %got(countsint)($1)
6713; MIPS32R6-NEXT:  $BB16_1: # %entry
6714; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
6715; MIPS32R6-NEXT:    ll $2, 0($1)
6716; MIPS32R6-NEXT:    addu $3, $2, $4
6717; MIPS32R6-NEXT:    sc $3, 0($1)
6718; MIPS32R6-NEXT:    beqzc $3, $BB16_1
6719; MIPS32R6-NEXT:  # %bb.2: # %entry
6720; MIPS32R6-NEXT:    sync
6721; MIPS32R6-NEXT:    jrc $ra
6722;
6723; MIPS32R6O0-LABEL: CheckSync:
6724; MIPS32R6O0:       # %bb.0: # %entry
6725; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
6726; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6727; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
6728; MIPS32R6O0-NEXT:    addu $1, $2, $25
6729; MIPS32R6O0-NEXT:    move $2, $4
6730; MIPS32R6O0-NEXT:    sync
6731; MIPS32R6O0-NEXT:    lw $1, %got(countsint)($1)
6732; MIPS32R6O0-NEXT:  $BB16_1: # %entry
6733; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
6734; MIPS32R6O0-NEXT:    ll $3, 0($1)
6735; MIPS32R6O0-NEXT:    addu $5, $3, $4
6736; MIPS32R6O0-NEXT:    sc $5, 0($1)
6737; MIPS32R6O0-NEXT:    beqzc $5, $BB16_1
6738; MIPS32R6O0-NEXT:  # %bb.2: # %entry
6739; MIPS32R6O0-NEXT:    sync
6740; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
6741; MIPS32R6O0-NEXT:    move $2, $3
6742; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
6743; MIPS32R6O0-NEXT:    jrc $ra
6744;
6745; MIPS4-LABEL: CheckSync:
6746; MIPS4:       # %bb.0: # %entry
6747; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6748; MIPS4-NEXT:    daddu $1, $1, $25
6749; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6750; MIPS4-NEXT:    sync
6751; MIPS4-NEXT:    ld $1, %got_disp(countsint)($1)
6752; MIPS4-NEXT:  .LBB16_1: # %entry
6753; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
6754; MIPS4-NEXT:    ll $2, 0($1)
6755; MIPS4-NEXT:    addu $3, $2, $4
6756; MIPS4-NEXT:    sc $3, 0($1)
6757; MIPS4-NEXT:    beqz $3, .LBB16_1
6758; MIPS4-NEXT:    nop
6759; MIPS4-NEXT:  # %bb.2: # %entry
6760; MIPS4-NEXT:    sync
6761; MIPS4-NEXT:    jr $ra
6762; MIPS4-NEXT:    nop
6763;
6764; MIPS64-LABEL: CheckSync:
6765; MIPS64:       # %bb.0: # %entry
6766; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6767; MIPS64-NEXT:    daddu $1, $1, $25
6768; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6769; MIPS64-NEXT:    sync
6770; MIPS64-NEXT:    ld $1, %got_disp(countsint)($1)
6771; MIPS64-NEXT:  .LBB16_1: # %entry
6772; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
6773; MIPS64-NEXT:    ll $2, 0($1)
6774; MIPS64-NEXT:    addu $3, $2, $4
6775; MIPS64-NEXT:    sc $3, 0($1)
6776; MIPS64-NEXT:    beqz $3, .LBB16_1
6777; MIPS64-NEXT:    nop
6778; MIPS64-NEXT:  # %bb.2: # %entry
6779; MIPS64-NEXT:    sync
6780; MIPS64-NEXT:    jr $ra
6781; MIPS64-NEXT:    nop
6782;
6783; MIPS64R2-LABEL: CheckSync:
6784; MIPS64R2:       # %bb.0: # %entry
6785; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6786; MIPS64R2-NEXT:    daddu $1, $1, $25
6787; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6788; MIPS64R2-NEXT:    sync
6789; MIPS64R2-NEXT:    ld $1, %got_disp(countsint)($1)
6790; MIPS64R2-NEXT:  .LBB16_1: # %entry
6791; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
6792; MIPS64R2-NEXT:    ll $2, 0($1)
6793; MIPS64R2-NEXT:    addu $3, $2, $4
6794; MIPS64R2-NEXT:    sc $3, 0($1)
6795; MIPS64R2-NEXT:    beqz $3, .LBB16_1
6796; MIPS64R2-NEXT:    nop
6797; MIPS64R2-NEXT:  # %bb.2: # %entry
6798; MIPS64R2-NEXT:    sync
6799; MIPS64R2-NEXT:    jr $ra
6800; MIPS64R2-NEXT:    nop
6801;
6802; MIPS64R6-LABEL: CheckSync:
6803; MIPS64R6:       # %bb.0: # %entry
6804; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6805; MIPS64R6-NEXT:    daddu $1, $1, $25
6806; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6807; MIPS64R6-NEXT:    sync
6808; MIPS64R6-NEXT:    ld $1, %got_disp(countsint)($1)
6809; MIPS64R6-NEXT:  .LBB16_1: # %entry
6810; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
6811; MIPS64R6-NEXT:    ll $2, 0($1)
6812; MIPS64R6-NEXT:    addu $3, $2, $4
6813; MIPS64R6-NEXT:    sc $3, 0($1)
6814; MIPS64R6-NEXT:    beqzc $3, .LBB16_1
6815; MIPS64R6-NEXT:  # %bb.2: # %entry
6816; MIPS64R6-NEXT:    sync
6817; MIPS64R6-NEXT:    jrc $ra
6818;
6819; MIPS64R6O0-LABEL: CheckSync:
6820; MIPS64R6O0:       # %bb.0: # %entry
6821; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6822; MIPS64R6O0-NEXT:    daddu $1, $1, $25
6823; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6824; MIPS64R6O0-NEXT:    move $2, $4
6825; MIPS64R6O0-NEXT:    sync
6826; MIPS64R6O0-NEXT:    ld $1, %got_disp(countsint)($1)
6827; MIPS64R6O0-NEXT:  .LBB16_1: # %entry
6828; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
6829; MIPS64R6O0-NEXT:    ll $3, 0($1)
6830; MIPS64R6O0-NEXT:    addu $5, $3, $2
6831; MIPS64R6O0-NEXT:    sc $5, 0($1)
6832; MIPS64R6O0-NEXT:    beqzc $5, .LBB16_1
6833; MIPS64R6O0-NEXT:  # %bb.2: # %entry
6834; MIPS64R6O0-NEXT:    sync
6835; MIPS64R6O0-NEXT:    move $2, $3
6836; MIPS64R6O0-NEXT:    jrc $ra
6837;
6838; MM32-LABEL: CheckSync:
6839; MM32:       # %bb.0: # %entry
6840; MM32-NEXT:    lui $2, %hi(_gp_disp)
6841; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6842; MM32-NEXT:    addu $2, $2, $25
6843; MM32-NEXT:    sync
6844; MM32-NEXT:    lw $1, %got(countsint)($2)
6845; MM32-NEXT:  $BB16_1: # %entry
6846; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
6847; MM32-NEXT:    ll $2, 0($1)
6848; MM32-NEXT:    addu16 $3, $2, $4
6849; MM32-NEXT:    sc $3, 0($1)
6850; MM32-NEXT:    beqzc $3, $BB16_1
6851; MM32-NEXT:  # %bb.2: # %entry
6852; MM32-NEXT:    sync
6853; MM32-NEXT:    jrc $ra
6854;
6855; O1-LABEL: CheckSync:
6856; O1:       # %bb.0: # %entry
6857; O1-NEXT:    lui $2, %hi(_gp_disp)
6858; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
6859; O1-NEXT:    addu $1, $2, $25
6860; O1-NEXT:    sync
6861; O1-NEXT:    lw $1, %got(countsint)($1)
6862; O1-NEXT:  $BB16_1: # %entry
6863; O1-NEXT:    # =>This Inner Loop Header: Depth=1
6864; O1-NEXT:    ll $2, 0($1)
6865; O1-NEXT:    addu $3, $2, $4
6866; O1-NEXT:    sc $3, 0($1)
6867; O1-NEXT:    beqz $3, $BB16_1
6868; O1-NEXT:    nop
6869; O1-NEXT:  # %bb.2: # %entry
6870; O1-NEXT:    sync
6871; O1-NEXT:    jr $ra
6872; O1-NEXT:    nop
6873;
6874; O2-LABEL: CheckSync:
6875; O2:       # %bb.0: # %entry
6876; O2-NEXT:    lui $2, %hi(_gp_disp)
6877; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6878; O2-NEXT:    addu $1, $2, $25
6879; O2-NEXT:    sync
6880; O2-NEXT:    lw $1, %got(countsint)($1)
6881; O2-NEXT:  $BB16_1: # %entry
6882; O2-NEXT:    # =>This Inner Loop Header: Depth=1
6883; O2-NEXT:    ll $2, 0($1)
6884; O2-NEXT:    addu $3, $2, $4
6885; O2-NEXT:    sc $3, 0($1)
6886; O2-NEXT:    beqz $3, $BB16_1
6887; O2-NEXT:    nop
6888; O2-NEXT:  # %bb.2: # %entry
6889; O2-NEXT:    sync
6890; O2-NEXT:    jr $ra
6891; O2-NEXT:    nop
6892;
6893; O3-LABEL: CheckSync:
6894; O3:       # %bb.0: # %entry
6895; O3-NEXT:    lui $2, %hi(_gp_disp)
6896; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
6897; O3-NEXT:    addu $1, $2, $25
6898; O3-NEXT:    sync
6899; O3-NEXT:    lw $1, %got(countsint)($1)
6900; O3-NEXT:  $BB16_1: # %entry
6901; O3-NEXT:    # =>This Inner Loop Header: Depth=1
6902; O3-NEXT:    ll $2, 0($1)
6903; O3-NEXT:    addu $3, $2, $4
6904; O3-NEXT:    sc $3, 0($1)
6905; O3-NEXT:    beqz $3, $BB16_1
6906; O3-NEXT:    nop
6907; O3-NEXT:  # %bb.2: # %entry
6908; O3-NEXT:    sync
6909; O3-NEXT:    jr $ra
6910; O3-NEXT:    nop
6911;
6912; MIPS32EB-LABEL: CheckSync:
6913; MIPS32EB:       # %bb.0: # %entry
6914; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
6915; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
6916; MIPS32EB-NEXT:    addu $1, $2, $25
6917; MIPS32EB-NEXT:    sync
6918; MIPS32EB-NEXT:    lw $1, %got(countsint)($1)
6919; MIPS32EB-NEXT:  $BB16_1: # %entry
6920; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
6921; MIPS32EB-NEXT:    ll $2, 0($1)
6922; MIPS32EB-NEXT:    addu $3, $2, $4
6923; MIPS32EB-NEXT:    sc $3, 0($1)
6924; MIPS32EB-NEXT:    beqz $3, $BB16_1
6925; MIPS32EB-NEXT:    nop
6926; MIPS32EB-NEXT:  # %bb.2: # %entry
6927; MIPS32EB-NEXT:    sync
6928; MIPS32EB-NEXT:    jr $ra
6929; MIPS32EB-NEXT:    nop
6930entry:
6931  %0 = atomicrmw add i32* @countsint, i32 %v seq_cst
6932  ret i32 %0
6933}
6934
6935; make sure that this assertion in
6936; TwoAddressInstructionPass::TryInstructionTransform does not fail:
6937;
6938; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) &&
6939;
6940; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an
6941; operand of an atomic instruction with register $zero.
6942@a = external global i32
6943
6944define i32 @zeroreg() nounwind {
6945; MIPS32-LABEL: zeroreg:
6946; MIPS32:       # %bb.0: # %entry
6947; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
6948; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6949; MIPS32-NEXT:    addu $1, $2, $25
6950; MIPS32-NEXT:    sync
6951; MIPS32-NEXT:    addiu $2, $zero, 0
6952; MIPS32-NEXT:    addiu $3, $zero, 1
6953; MIPS32-NEXT:    lw $1, %got(a)($1)
6954; MIPS32-NEXT:  $BB17_1: # %entry
6955; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
6956; MIPS32-NEXT:    ll $4, 0($1)
6957; MIPS32-NEXT:    bne $4, $3, $BB17_3
6958; MIPS32-NEXT:    nop
6959; MIPS32-NEXT:  # %bb.2: # %entry
6960; MIPS32-NEXT:    # in Loop: Header=BB17_1 Depth=1
6961; MIPS32-NEXT:    move $5, $2
6962; MIPS32-NEXT:    sc $5, 0($1)
6963; MIPS32-NEXT:    beqz $5, $BB17_1
6964; MIPS32-NEXT:    nop
6965; MIPS32-NEXT:  $BB17_3: # %entry
6966; MIPS32-NEXT:    xor $1, $4, $3
6967; MIPS32-NEXT:    sltiu $2, $1, 1
6968; MIPS32-NEXT:    sync
6969; MIPS32-NEXT:    jr $ra
6970; MIPS32-NEXT:    nop
6971;
6972; MIPS32O0-LABEL: zeroreg:
6973; MIPS32O0:       # %bb.0: # %entry
6974; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
6975; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6976; MIPS32O0-NEXT:    addiu $sp, $sp, -8
6977; MIPS32O0-NEXT:    addu $1, $2, $25
6978; MIPS32O0-NEXT:    sync
6979; MIPS32O0-NEXT:    lw $1, %got(a)($1)
6980; MIPS32O0-NEXT:    addiu $2, $zero, 0
6981; MIPS32O0-NEXT:    addiu $3, $zero, 1
6982; MIPS32O0-NEXT:    move $4, $3
6983; MIPS32O0-NEXT:  $BB17_1: # %entry
6984; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
6985; MIPS32O0-NEXT:    ll $5, 0($1)
6986; MIPS32O0-NEXT:    bne $5, $4, $BB17_3
6987; MIPS32O0-NEXT:    nop
6988; MIPS32O0-NEXT:  # %bb.2: # %entry
6989; MIPS32O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
6990; MIPS32O0-NEXT:    move $6, $2
6991; MIPS32O0-NEXT:    sc $6, 0($1)
6992; MIPS32O0-NEXT:    beqz $6, $BB17_1
6993; MIPS32O0-NEXT:    nop
6994; MIPS32O0-NEXT:  $BB17_3: # %entry
6995; MIPS32O0-NEXT:    xor $1, $5, $3
6996; MIPS32O0-NEXT:    sltiu $1, $1, 1
6997; MIPS32O0-NEXT:    sync
6998; MIPS32O0-NEXT:    addiu $2, $zero, 1
6999; MIPS32O0-NEXT:    xor $2, $5, $2
7000; MIPS32O0-NEXT:    sltiu $2, $2, 1
7001; MIPS32O0-NEXT:    andi $2, $2, 1
7002; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
7003; MIPS32O0-NEXT:    addiu $sp, $sp, 8
7004; MIPS32O0-NEXT:    jr $ra
7005; MIPS32O0-NEXT:    nop
7006;
7007; MIPS32R2-LABEL: zeroreg:
7008; MIPS32R2:       # %bb.0: # %entry
7009; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
7010; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7011; MIPS32R2-NEXT:    addu $1, $2, $25
7012; MIPS32R2-NEXT:    sync
7013; MIPS32R2-NEXT:    addiu $2, $zero, 0
7014; MIPS32R2-NEXT:    addiu $3, $zero, 1
7015; MIPS32R2-NEXT:    lw $1, %got(a)($1)
7016; MIPS32R2-NEXT:  $BB17_1: # %entry
7017; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
7018; MIPS32R2-NEXT:    ll $4, 0($1)
7019; MIPS32R2-NEXT:    bne $4, $3, $BB17_3
7020; MIPS32R2-NEXT:    nop
7021; MIPS32R2-NEXT:  # %bb.2: # %entry
7022; MIPS32R2-NEXT:    # in Loop: Header=BB17_1 Depth=1
7023; MIPS32R2-NEXT:    move $5, $2
7024; MIPS32R2-NEXT:    sc $5, 0($1)
7025; MIPS32R2-NEXT:    beqz $5, $BB17_1
7026; MIPS32R2-NEXT:    nop
7027; MIPS32R2-NEXT:  $BB17_3: # %entry
7028; MIPS32R2-NEXT:    xor $1, $4, $3
7029; MIPS32R2-NEXT:    sltiu $2, $1, 1
7030; MIPS32R2-NEXT:    sync
7031; MIPS32R2-NEXT:    jr $ra
7032; MIPS32R2-NEXT:    nop
7033;
7034; MIPS32R6-LABEL: zeroreg:
7035; MIPS32R6:       # %bb.0: # %entry
7036; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
7037; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
7038; MIPS32R6-NEXT:    addu $1, $2, $25
7039; MIPS32R6-NEXT:    sync
7040; MIPS32R6-NEXT:    addiu $2, $zero, 0
7041; MIPS32R6-NEXT:    addiu $3, $zero, 1
7042; MIPS32R6-NEXT:    lw $1, %got(a)($1)
7043; MIPS32R6-NEXT:  $BB17_1: # %entry
7044; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
7045; MIPS32R6-NEXT:    ll $4, 0($1)
7046; MIPS32R6-NEXT:    bnec $4, $3, $BB17_3
7047; MIPS32R6-NEXT:  # %bb.2: # %entry
7048; MIPS32R6-NEXT:    # in Loop: Header=BB17_1 Depth=1
7049; MIPS32R6-NEXT:    move $5, $2
7050; MIPS32R6-NEXT:    sc $5, 0($1)
7051; MIPS32R6-NEXT:    beqzc $5, $BB17_1
7052; MIPS32R6-NEXT:  $BB17_3: # %entry
7053; MIPS32R6-NEXT:    xor $1, $4, $3
7054; MIPS32R6-NEXT:    sltiu $2, $1, 1
7055; MIPS32R6-NEXT:    sync
7056; MIPS32R6-NEXT:    jrc $ra
7057;
7058; MIPS32R6O0-LABEL: zeroreg:
7059; MIPS32R6O0:       # %bb.0: # %entry
7060; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
7061; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7062; MIPS32R6O0-NEXT:    addu $1, $2, $25
7063; MIPS32R6O0-NEXT:    sync
7064; MIPS32R6O0-NEXT:    lw $1, %got(a)($1)
7065; MIPS32R6O0-NEXT:    addiu $2, $zero, 0
7066; MIPS32R6O0-NEXT:    addiu $3, $zero, 1
7067; MIPS32R6O0-NEXT:    move $4, $3
7068; MIPS32R6O0-NEXT:  $BB17_1: # %entry
7069; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7070; MIPS32R6O0-NEXT:    ll $5, 0($1)
7071; MIPS32R6O0-NEXT:    bnec $5, $4, $BB17_3
7072; MIPS32R6O0-NEXT:  # %bb.2: # %entry
7073; MIPS32R6O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
7074; MIPS32R6O0-NEXT:    move $6, $2
7075; MIPS32R6O0-NEXT:    sc $6, 0($1)
7076; MIPS32R6O0-NEXT:    beqzc $6, $BB17_1
7077; MIPS32R6O0-NEXT:  $BB17_3: # %entry
7078; MIPS32R6O0-NEXT:    xor $1, $5, $3
7079; MIPS32R6O0-NEXT:    sltiu $2, $1, 1
7080; MIPS32R6O0-NEXT:    sync
7081; MIPS32R6O0-NEXT:    jrc $ra
7082;
7083; MIPS4-LABEL: zeroreg:
7084; MIPS4:       # %bb.0: # %entry
7085; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7086; MIPS4-NEXT:    daddu $1, $1, $25
7087; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7088; MIPS4-NEXT:    sync
7089; MIPS4-NEXT:    addiu $2, $zero, 0
7090; MIPS4-NEXT:    addiu $3, $zero, 1
7091; MIPS4-NEXT:    ld $1, %got_disp(a)($1)
7092; MIPS4-NEXT:  .LBB17_1: # %entry
7093; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
7094; MIPS4-NEXT:    ll $4, 0($1)
7095; MIPS4-NEXT:    bne $4, $3, .LBB17_3
7096; MIPS4-NEXT:    nop
7097; MIPS4-NEXT:  # %bb.2: # %entry
7098; MIPS4-NEXT:    # in Loop: Header=BB17_1 Depth=1
7099; MIPS4-NEXT:    move $5, $2
7100; MIPS4-NEXT:    sc $5, 0($1)
7101; MIPS4-NEXT:    beqz $5, .LBB17_1
7102; MIPS4-NEXT:    nop
7103; MIPS4-NEXT:  .LBB17_3: # %entry
7104; MIPS4-NEXT:    xor $1, $4, $3
7105; MIPS4-NEXT:    sltiu $2, $1, 1
7106; MIPS4-NEXT:    sync
7107; MIPS4-NEXT:    jr $ra
7108; MIPS4-NEXT:    nop
7109;
7110; MIPS64-LABEL: zeroreg:
7111; MIPS64:       # %bb.0: # %entry
7112; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7113; MIPS64-NEXT:    daddu $1, $1, $25
7114; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7115; MIPS64-NEXT:    sync
7116; MIPS64-NEXT:    addiu $2, $zero, 0
7117; MIPS64-NEXT:    addiu $3, $zero, 1
7118; MIPS64-NEXT:    ld $1, %got_disp(a)($1)
7119; MIPS64-NEXT:  .LBB17_1: # %entry
7120; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
7121; MIPS64-NEXT:    ll $4, 0($1)
7122; MIPS64-NEXT:    bne $4, $3, .LBB17_3
7123; MIPS64-NEXT:    nop
7124; MIPS64-NEXT:  # %bb.2: # %entry
7125; MIPS64-NEXT:    # in Loop: Header=BB17_1 Depth=1
7126; MIPS64-NEXT:    move $5, $2
7127; MIPS64-NEXT:    sc $5, 0($1)
7128; MIPS64-NEXT:    beqz $5, .LBB17_1
7129; MIPS64-NEXT:    nop
7130; MIPS64-NEXT:  .LBB17_3: # %entry
7131; MIPS64-NEXT:    xor $1, $4, $3
7132; MIPS64-NEXT:    sltiu $2, $1, 1
7133; MIPS64-NEXT:    sync
7134; MIPS64-NEXT:    jr $ra
7135; MIPS64-NEXT:    nop
7136;
7137; MIPS64R2-LABEL: zeroreg:
7138; MIPS64R2:       # %bb.0: # %entry
7139; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7140; MIPS64R2-NEXT:    daddu $1, $1, $25
7141; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7142; MIPS64R2-NEXT:    sync
7143; MIPS64R2-NEXT:    addiu $2, $zero, 0
7144; MIPS64R2-NEXT:    addiu $3, $zero, 1
7145; MIPS64R2-NEXT:    ld $1, %got_disp(a)($1)
7146; MIPS64R2-NEXT:  .LBB17_1: # %entry
7147; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
7148; MIPS64R2-NEXT:    ll $4, 0($1)
7149; MIPS64R2-NEXT:    bne $4, $3, .LBB17_3
7150; MIPS64R2-NEXT:    nop
7151; MIPS64R2-NEXT:  # %bb.2: # %entry
7152; MIPS64R2-NEXT:    # in Loop: Header=BB17_1 Depth=1
7153; MIPS64R2-NEXT:    move $5, $2
7154; MIPS64R2-NEXT:    sc $5, 0($1)
7155; MIPS64R2-NEXT:    beqz $5, .LBB17_1
7156; MIPS64R2-NEXT:    nop
7157; MIPS64R2-NEXT:  .LBB17_3: # %entry
7158; MIPS64R2-NEXT:    xor $1, $4, $3
7159; MIPS64R2-NEXT:    sltiu $2, $1, 1
7160; MIPS64R2-NEXT:    sync
7161; MIPS64R2-NEXT:    jr $ra
7162; MIPS64R2-NEXT:    nop
7163;
7164; MIPS64R6-LABEL: zeroreg:
7165; MIPS64R6:       # %bb.0: # %entry
7166; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7167; MIPS64R6-NEXT:    daddu $1, $1, $25
7168; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7169; MIPS64R6-NEXT:    sync
7170; MIPS64R6-NEXT:    addiu $2, $zero, 0
7171; MIPS64R6-NEXT:    addiu $3, $zero, 1
7172; MIPS64R6-NEXT:    ld $1, %got_disp(a)($1)
7173; MIPS64R6-NEXT:  .LBB17_1: # %entry
7174; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
7175; MIPS64R6-NEXT:    ll $4, 0($1)
7176; MIPS64R6-NEXT:    bnec $4, $3, .LBB17_3
7177; MIPS64R6-NEXT:  # %bb.2: # %entry
7178; MIPS64R6-NEXT:    # in Loop: Header=BB17_1 Depth=1
7179; MIPS64R6-NEXT:    move $5, $2
7180; MIPS64R6-NEXT:    sc $5, 0($1)
7181; MIPS64R6-NEXT:    beqzc $5, .LBB17_1
7182; MIPS64R6-NEXT:  .LBB17_3: # %entry
7183; MIPS64R6-NEXT:    xor $1, $4, $3
7184; MIPS64R6-NEXT:    sltiu $2, $1, 1
7185; MIPS64R6-NEXT:    sync
7186; MIPS64R6-NEXT:    jrc $ra
7187;
7188; MIPS64R6O0-LABEL: zeroreg:
7189; MIPS64R6O0:       # %bb.0: # %entry
7190; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7191; MIPS64R6O0-NEXT:    daddu $1, $1, $25
7192; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7193; MIPS64R6O0-NEXT:    sync
7194; MIPS64R6O0-NEXT:    ld $1, %got_disp(a)($1)
7195; MIPS64R6O0-NEXT:    addiu $2, $zero, 0
7196; MIPS64R6O0-NEXT:    addiu $3, $zero, 1
7197; MIPS64R6O0-NEXT:    move $4, $3
7198; MIPS64R6O0-NEXT:  .LBB17_1: # %entry
7199; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7200; MIPS64R6O0-NEXT:    ll $5, 0($1)
7201; MIPS64R6O0-NEXT:    bnec $5, $4, .LBB17_3
7202; MIPS64R6O0-NEXT:  # %bb.2: # %entry
7203; MIPS64R6O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
7204; MIPS64R6O0-NEXT:    move $6, $2
7205; MIPS64R6O0-NEXT:    sc $6, 0($1)
7206; MIPS64R6O0-NEXT:    beqzc $6, .LBB17_1
7207; MIPS64R6O0-NEXT:  .LBB17_3: # %entry
7208; MIPS64R6O0-NEXT:    xor $2, $5, $3
7209; MIPS64R6O0-NEXT:    sltiu $2, $2, 1
7210; MIPS64R6O0-NEXT:    sync
7211; MIPS64R6O0-NEXT:    jrc $ra
7212;
7213; MM32-LABEL: zeroreg:
7214; MM32:       # %bb.0: # %entry
7215; MM32-NEXT:    lui $2, %hi(_gp_disp)
7216; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7217; MM32-NEXT:    addu $2, $2, $25
7218; MM32-NEXT:    sync
7219; MM32-NEXT:    li16 $3, 0
7220; MM32-NEXT:    li16 $4, 1
7221; MM32-NEXT:    lw $1, %got(a)($2)
7222; MM32-NEXT:  $BB17_1: # %entry
7223; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
7224; MM32-NEXT:    ll $2, 0($1)
7225; MM32-NEXT:    bne $2, $4, $BB17_3
7226; MM32-NEXT:    nop
7227; MM32-NEXT:  # %bb.2: # %entry
7228; MM32-NEXT:    # in Loop: Header=BB17_1 Depth=1
7229; MM32-NEXT:    move $5, $3
7230; MM32-NEXT:    sc $5, 0($1)
7231; MM32-NEXT:    beqzc $5, $BB17_1
7232; MM32-NEXT:  $BB17_3: # %entry
7233; MM32-NEXT:    xor $1, $2, $4
7234; MM32-NEXT:    sltiu $2, $1, 1
7235; MM32-NEXT:    sync
7236; MM32-NEXT:    jrc $ra
7237;
7238; O1-LABEL: zeroreg:
7239; O1:       # %bb.0: # %entry
7240; O1-NEXT:    lui $2, %hi(_gp_disp)
7241; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
7242; O1-NEXT:    addu $1, $2, $25
7243; O1-NEXT:    sync
7244; O1-NEXT:    addiu $2, $zero, 0
7245; O1-NEXT:    addiu $3, $zero, 1
7246; O1-NEXT:    lw $1, %got(a)($1)
7247; O1-NEXT:  $BB17_1: # %entry
7248; O1-NEXT:    # =>This Inner Loop Header: Depth=1
7249; O1-NEXT:    ll $4, 0($1)
7250; O1-NEXT:    bne $4, $3, $BB17_3
7251; O1-NEXT:    nop
7252; O1-NEXT:  # %bb.2: # %entry
7253; O1-NEXT:    # in Loop: Header=BB17_1 Depth=1
7254; O1-NEXT:    move $5, $2
7255; O1-NEXT:    sc $5, 0($1)
7256; O1-NEXT:    beqz $5, $BB17_1
7257; O1-NEXT:    nop
7258; O1-NEXT:  $BB17_3: # %entry
7259; O1-NEXT:    xor $1, $4, $3
7260; O1-NEXT:    sltiu $2, $1, 1
7261; O1-NEXT:    sync
7262; O1-NEXT:    jr $ra
7263; O1-NEXT:    nop
7264;
7265; O2-LABEL: zeroreg:
7266; O2:       # %bb.0: # %entry
7267; O2-NEXT:    lui $2, %hi(_gp_disp)
7268; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7269; O2-NEXT:    addu $1, $2, $25
7270; O2-NEXT:    sync
7271; O2-NEXT:    addiu $2, $zero, 0
7272; O2-NEXT:    addiu $3, $zero, 1
7273; O2-NEXT:    lw $1, %got(a)($1)
7274; O2-NEXT:  $BB17_1: # %entry
7275; O2-NEXT:    # =>This Inner Loop Header: Depth=1
7276; O2-NEXT:    ll $4, 0($1)
7277; O2-NEXT:    bne $4, $3, $BB17_3
7278; O2-NEXT:    nop
7279; O2-NEXT:  # %bb.2: # %entry
7280; O2-NEXT:    # in Loop: Header=BB17_1 Depth=1
7281; O2-NEXT:    move $5, $2
7282; O2-NEXT:    sc $5, 0($1)
7283; O2-NEXT:    beqz $5, $BB17_1
7284; O2-NEXT:    nop
7285; O2-NEXT:  $BB17_3: # %entry
7286; O2-NEXT:    xor $1, $4, $3
7287; O2-NEXT:    sltiu $2, $1, 1
7288; O2-NEXT:    sync
7289; O2-NEXT:    jr $ra
7290; O2-NEXT:    nop
7291;
7292; O3-LABEL: zeroreg:
7293; O3:       # %bb.0: # %entry
7294; O3-NEXT:    lui $2, %hi(_gp_disp)
7295; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
7296; O3-NEXT:    addu $1, $2, $25
7297; O3-NEXT:    addiu $2, $zero, 0
7298; O3-NEXT:    addiu $3, $zero, 1
7299; O3-NEXT:    sync
7300; O3-NEXT:    lw $1, %got(a)($1)
7301; O3-NEXT:  $BB17_1: # %entry
7302; O3-NEXT:    # =>This Inner Loop Header: Depth=1
7303; O3-NEXT:    ll $4, 0($1)
7304; O3-NEXT:    bne $4, $3, $BB17_3
7305; O3-NEXT:    nop
7306; O3-NEXT:  # %bb.2: # %entry
7307; O3-NEXT:    # in Loop: Header=BB17_1 Depth=1
7308; O3-NEXT:    move $5, $2
7309; O3-NEXT:    sc $5, 0($1)
7310; O3-NEXT:    beqz $5, $BB17_1
7311; O3-NEXT:    nop
7312; O3-NEXT:  $BB17_3: # %entry
7313; O3-NEXT:    sync
7314; O3-NEXT:    xor $1, $4, $3
7315; O3-NEXT:    jr $ra
7316; O3-NEXT:    sltiu $2, $1, 1
7317;
7318; MIPS32EB-LABEL: zeroreg:
7319; MIPS32EB:       # %bb.0: # %entry
7320; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
7321; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
7322; MIPS32EB-NEXT:    addu $1, $2, $25
7323; MIPS32EB-NEXT:    sync
7324; MIPS32EB-NEXT:    addiu $2, $zero, 0
7325; MIPS32EB-NEXT:    addiu $3, $zero, 1
7326; MIPS32EB-NEXT:    lw $1, %got(a)($1)
7327; MIPS32EB-NEXT:  $BB17_1: # %entry
7328; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
7329; MIPS32EB-NEXT:    ll $4, 0($1)
7330; MIPS32EB-NEXT:    bne $4, $3, $BB17_3
7331; MIPS32EB-NEXT:    nop
7332; MIPS32EB-NEXT:  # %bb.2: # %entry
7333; MIPS32EB-NEXT:    # in Loop: Header=BB17_1 Depth=1
7334; MIPS32EB-NEXT:    move $5, $2
7335; MIPS32EB-NEXT:    sc $5, 0($1)
7336; MIPS32EB-NEXT:    beqz $5, $BB17_1
7337; MIPS32EB-NEXT:    nop
7338; MIPS32EB-NEXT:  $BB17_3: # %entry
7339; MIPS32EB-NEXT:    xor $1, $4, $3
7340; MIPS32EB-NEXT:    sltiu $2, $1, 1
7341; MIPS32EB-NEXT:    sync
7342; MIPS32EB-NEXT:    jr $ra
7343; MIPS32EB-NEXT:    nop
7344entry:
7345  %pair0 = cmpxchg i32* @a, i32 1, i32 0 seq_cst seq_cst
7346  %0 = extractvalue { i32, i1 } %pair0, 0
7347  %1 = icmp eq i32 %0, 1
7348  %conv = zext i1 %1 to i32
7349  ret i32 %conv
7350}
7351
7352; Check that MIPS32R6 has the correct offset range.
7353; FIXME: At the moment, we don't seem to do addr+offset for any atomic load/store.
7354define i32 @AtomicLoadAdd32_OffGt9Bit(i32 signext %incr) nounwind {
7355; MIPS32-LABEL: AtomicLoadAdd32_OffGt9Bit:
7356; MIPS32:       # %bb.0: # %entry
7357; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
7358; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7359; MIPS32-NEXT:    addu $1, $2, $25
7360; MIPS32-NEXT:    lw $1, %got(x)($1)
7361; MIPS32-NEXT:    addiu $1, $1, 1024
7362; MIPS32-NEXT:  $BB18_1: # %entry
7363; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
7364; MIPS32-NEXT:    ll $2, 0($1)
7365; MIPS32-NEXT:    addu $3, $2, $4
7366; MIPS32-NEXT:    sc $3, 0($1)
7367; MIPS32-NEXT:    beqz $3, $BB18_1
7368; MIPS32-NEXT:    nop
7369; MIPS32-NEXT:  # %bb.2: # %entry
7370; MIPS32-NEXT:    jr $ra
7371; MIPS32-NEXT:    nop
7372;
7373; MIPS32O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7374; MIPS32O0:       # %bb.0: # %entry
7375; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
7376; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7377; MIPS32O0-NEXT:    addu $1, $2, $25
7378; MIPS32O0-NEXT:    lw $1, %got(x)($1)
7379; MIPS32O0-NEXT:    addiu $1, $1, 1024
7380; MIPS32O0-NEXT:  $BB18_1: # %entry
7381; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
7382; MIPS32O0-NEXT:    ll $2, 0($1)
7383; MIPS32O0-NEXT:    addu $3, $2, $4
7384; MIPS32O0-NEXT:    sc $3, 0($1)
7385; MIPS32O0-NEXT:    beqz $3, $BB18_1
7386; MIPS32O0-NEXT:    nop
7387; MIPS32O0-NEXT:  # %bb.2: # %entry
7388; MIPS32O0-NEXT:    jr $ra
7389; MIPS32O0-NEXT:    nop
7390;
7391; MIPS32R2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7392; MIPS32R2:       # %bb.0: # %entry
7393; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
7394; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7395; MIPS32R2-NEXT:    addu $1, $2, $25
7396; MIPS32R2-NEXT:    lw $1, %got(x)($1)
7397; MIPS32R2-NEXT:    addiu $1, $1, 1024
7398; MIPS32R2-NEXT:  $BB18_1: # %entry
7399; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
7400; MIPS32R2-NEXT:    ll $2, 0($1)
7401; MIPS32R2-NEXT:    addu $3, $2, $4
7402; MIPS32R2-NEXT:    sc $3, 0($1)
7403; MIPS32R2-NEXT:    beqz $3, $BB18_1
7404; MIPS32R2-NEXT:    nop
7405; MIPS32R2-NEXT:  # %bb.2: # %entry
7406; MIPS32R2-NEXT:    jr $ra
7407; MIPS32R2-NEXT:    nop
7408;
7409; MIPS32R6-LABEL: AtomicLoadAdd32_OffGt9Bit:
7410; MIPS32R6:       # %bb.0: # %entry
7411; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
7412; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
7413; MIPS32R6-NEXT:    addu $1, $2, $25
7414; MIPS32R6-NEXT:    lw $1, %got(x)($1)
7415; MIPS32R6-NEXT:    addiu $1, $1, 1024
7416; MIPS32R6-NEXT:  $BB18_1: # %entry
7417; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
7418; MIPS32R6-NEXT:    ll $2, 0($1)
7419; MIPS32R6-NEXT:    addu $3, $2, $4
7420; MIPS32R6-NEXT:    sc $3, 0($1)
7421; MIPS32R6-NEXT:    beqzc $3, $BB18_1
7422; MIPS32R6-NEXT:    nop
7423; MIPS32R6-NEXT:  # %bb.2: # %entry
7424; MIPS32R6-NEXT:    jrc $ra
7425;
7426; MIPS32R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7427; MIPS32R6O0:       # %bb.0: # %entry
7428; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
7429; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7430; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
7431; MIPS32R6O0-NEXT:    addu $1, $2, $25
7432; MIPS32R6O0-NEXT:    move $2, $4
7433; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
7434; MIPS32R6O0-NEXT:    addiu $1, $1, 1024
7435; MIPS32R6O0-NEXT:  $BB18_1: # %entry
7436; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7437; MIPS32R6O0-NEXT:    ll $3, 0($1)
7438; MIPS32R6O0-NEXT:    addu $5, $3, $4
7439; MIPS32R6O0-NEXT:    sc $5, 0($1)
7440; MIPS32R6O0-NEXT:    beqzc $5, $BB18_1
7441; MIPS32R6O0-NEXT:  # %bb.2: # %entry
7442; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
7443; MIPS32R6O0-NEXT:    move $2, $3
7444; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
7445; MIPS32R6O0-NEXT:    jrc $ra
7446;
7447; MIPS4-LABEL: AtomicLoadAdd32_OffGt9Bit:
7448; MIPS4:       # %bb.0: # %entry
7449; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7450; MIPS4-NEXT:    daddu $1, $1, $25
7451; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7452; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
7453; MIPS4-NEXT:    daddiu $1, $1, 1024
7454; MIPS4-NEXT:  .LBB18_1: # %entry
7455; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
7456; MIPS4-NEXT:    ll $2, 0($1)
7457; MIPS4-NEXT:    addu $3, $2, $4
7458; MIPS4-NEXT:    sc $3, 0($1)
7459; MIPS4-NEXT:    beqz $3, .LBB18_1
7460; MIPS4-NEXT:    nop
7461; MIPS4-NEXT:  # %bb.2: # %entry
7462; MIPS4-NEXT:    jr $ra
7463; MIPS4-NEXT:    nop
7464;
7465; MIPS64-LABEL: AtomicLoadAdd32_OffGt9Bit:
7466; MIPS64:       # %bb.0: # %entry
7467; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7468; MIPS64-NEXT:    daddu $1, $1, $25
7469; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7470; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
7471; MIPS64-NEXT:    daddiu $1, $1, 1024
7472; MIPS64-NEXT:  .LBB18_1: # %entry
7473; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
7474; MIPS64-NEXT:    ll $2, 0($1)
7475; MIPS64-NEXT:    addu $3, $2, $4
7476; MIPS64-NEXT:    sc $3, 0($1)
7477; MIPS64-NEXT:    beqz $3, .LBB18_1
7478; MIPS64-NEXT:    nop
7479; MIPS64-NEXT:  # %bb.2: # %entry
7480; MIPS64-NEXT:    jr $ra
7481; MIPS64-NEXT:    nop
7482;
7483; MIPS64R2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7484; MIPS64R2:       # %bb.0: # %entry
7485; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7486; MIPS64R2-NEXT:    daddu $1, $1, $25
7487; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7488; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
7489; MIPS64R2-NEXT:    daddiu $1, $1, 1024
7490; MIPS64R2-NEXT:  .LBB18_1: # %entry
7491; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
7492; MIPS64R2-NEXT:    ll $2, 0($1)
7493; MIPS64R2-NEXT:    addu $3, $2, $4
7494; MIPS64R2-NEXT:    sc $3, 0($1)
7495; MIPS64R2-NEXT:    beqz $3, .LBB18_1
7496; MIPS64R2-NEXT:    nop
7497; MIPS64R2-NEXT:  # %bb.2: # %entry
7498; MIPS64R2-NEXT:    jr $ra
7499; MIPS64R2-NEXT:    nop
7500;
7501; MIPS64R6-LABEL: AtomicLoadAdd32_OffGt9Bit:
7502; MIPS64R6:       # %bb.0: # %entry
7503; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7504; MIPS64R6-NEXT:    daddu $1, $1, $25
7505; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7506; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
7507; MIPS64R6-NEXT:    daddiu $1, $1, 1024
7508; MIPS64R6-NEXT:  .LBB18_1: # %entry
7509; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
7510; MIPS64R6-NEXT:    ll $2, 0($1)
7511; MIPS64R6-NEXT:    addu $3, $2, $4
7512; MIPS64R6-NEXT:    sc $3, 0($1)
7513; MIPS64R6-NEXT:    beqzc $3, .LBB18_1
7514; MIPS64R6-NEXT:    nop
7515; MIPS64R6-NEXT:  # %bb.2: # %entry
7516; MIPS64R6-NEXT:    jrc $ra
7517;
7518; MIPS64R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7519; MIPS64R6O0:       # %bb.0: # %entry
7520; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7521; MIPS64R6O0-NEXT:    daddu $1, $1, $25
7522; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7523; MIPS64R6O0-NEXT:    move $2, $4
7524; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
7525; MIPS64R6O0-NEXT:    daddiu $1, $1, 1024
7526; MIPS64R6O0-NEXT:  .LBB18_1: # %entry
7527; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7528; MIPS64R6O0-NEXT:    ll $3, 0($1)
7529; MIPS64R6O0-NEXT:    addu $5, $3, $2
7530; MIPS64R6O0-NEXT:    sc $5, 0($1)
7531; MIPS64R6O0-NEXT:    beqzc $5, .LBB18_1
7532; MIPS64R6O0-NEXT:  # %bb.2: # %entry
7533; MIPS64R6O0-NEXT:    move $2, $3
7534; MIPS64R6O0-NEXT:    jrc $ra
7535;
7536; MM32-LABEL: AtomicLoadAdd32_OffGt9Bit:
7537; MM32:       # %bb.0: # %entry
7538; MM32-NEXT:    lui $2, %hi(_gp_disp)
7539; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7540; MM32-NEXT:    addu $2, $2, $25
7541; MM32-NEXT:    lw $1, %got(x)($2)
7542; MM32-NEXT:    addiu $1, $1, 1024
7543; MM32-NEXT:  $BB18_1: # %entry
7544; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
7545; MM32-NEXT:    ll $2, 0($1)
7546; MM32-NEXT:    addu16 $3, $2, $4
7547; MM32-NEXT:    sc $3, 0($1)
7548; MM32-NEXT:    beqzc $3, $BB18_1
7549; MM32-NEXT:  # %bb.2: # %entry
7550; MM32-NEXT:    jrc $ra
7551;
7552; O1-LABEL: AtomicLoadAdd32_OffGt9Bit:
7553; O1:       # %bb.0: # %entry
7554; O1-NEXT:    lui $2, %hi(_gp_disp)
7555; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
7556; O1-NEXT:    addu $1, $2, $25
7557; O1-NEXT:    lw $1, %got(x)($1)
7558; O1-NEXT:    addiu $1, $1, 1024
7559; O1-NEXT:  $BB18_1: # %entry
7560; O1-NEXT:    # =>This Inner Loop Header: Depth=1
7561; O1-NEXT:    ll $2, 0($1)
7562; O1-NEXT:    addu $3, $2, $4
7563; O1-NEXT:    sc $3, 0($1)
7564; O1-NEXT:    beqz $3, $BB18_1
7565; O1-NEXT:    nop
7566; O1-NEXT:  # %bb.2: # %entry
7567; O1-NEXT:    jr $ra
7568; O1-NEXT:    nop
7569;
7570; O2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7571; O2:       # %bb.0: # %entry
7572; O2-NEXT:    lui $2, %hi(_gp_disp)
7573; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7574; O2-NEXT:    addu $1, $2, $25
7575; O2-NEXT:    lw $1, %got(x)($1)
7576; O2-NEXT:    addiu $1, $1, 1024
7577; O2-NEXT:  $BB18_1: # %entry
7578; O2-NEXT:    # =>This Inner Loop Header: Depth=1
7579; O2-NEXT:    ll $2, 0($1)
7580; O2-NEXT:    addu $3, $2, $4
7581; O2-NEXT:    sc $3, 0($1)
7582; O2-NEXT:    beqz $3, $BB18_1
7583; O2-NEXT:    nop
7584; O2-NEXT:  # %bb.2: # %entry
7585; O2-NEXT:    jr $ra
7586; O2-NEXT:    nop
7587;
7588; O3-LABEL: AtomicLoadAdd32_OffGt9Bit:
7589; O3:       # %bb.0: # %entry
7590; O3-NEXT:    lui $2, %hi(_gp_disp)
7591; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
7592; O3-NEXT:    addu $1, $2, $25
7593; O3-NEXT:    lw $1, %got(x)($1)
7594; O3-NEXT:    addiu $1, $1, 1024
7595; O3-NEXT:  $BB18_1: # %entry
7596; O3-NEXT:    # =>This Inner Loop Header: Depth=1
7597; O3-NEXT:    ll $2, 0($1)
7598; O3-NEXT:    addu $3, $2, $4
7599; O3-NEXT:    sc $3, 0($1)
7600; O3-NEXT:    beqz $3, $BB18_1
7601; O3-NEXT:    nop
7602; O3-NEXT:  # %bb.2: # %entry
7603; O3-NEXT:    jr $ra
7604; O3-NEXT:    nop
7605;
7606; MIPS32EB-LABEL: AtomicLoadAdd32_OffGt9Bit:
7607; MIPS32EB:       # %bb.0: # %entry
7608; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
7609; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
7610; MIPS32EB-NEXT:    addu $1, $2, $25
7611; MIPS32EB-NEXT:    lw $1, %got(x)($1)
7612; MIPS32EB-NEXT:    addiu $1, $1, 1024
7613; MIPS32EB-NEXT:  $BB18_1: # %entry
7614; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
7615; MIPS32EB-NEXT:    ll $2, 0($1)
7616; MIPS32EB-NEXT:    addu $3, $2, $4
7617; MIPS32EB-NEXT:    sc $3, 0($1)
7618; MIPS32EB-NEXT:    beqz $3, $BB18_1
7619; MIPS32EB-NEXT:    nop
7620; MIPS32EB-NEXT:  # %bb.2: # %entry
7621; MIPS32EB-NEXT:    jr $ra
7622; MIPS32EB-NEXT:    nop
7623entry:
7624  %0 = atomicrmw add i32* getelementptr(i32, i32* @x, i32 256), i32 %incr monotonic
7625  ret i32 %0
7626
7627}
7628