• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 $2, $2, $25
60; MIPS32O0-NEXT:    lw $2, %got(x)($2)
61; MIPS32O0-NEXT:  $BB0_1: # %entry
62; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
63; MIPS32O0-NEXT:    ll $25, 0($2)
64; MIPS32O0-NEXT:    addu $1, $25, $4
65; MIPS32O0-NEXT:    sc $1, 0($2)
66; MIPS32O0-NEXT:    beqz $1, $BB0_1
67; MIPS32O0-NEXT:    nop
68; MIPS32O0-NEXT:  # %bb.2: # %entry
69; MIPS32O0-NEXT:    move $2, $25
70; MIPS32O0-NEXT:    jr $ra
71; MIPS32O0-NEXT:    nop
72;
73; MIPS32R2-LABEL: AtomicLoadAdd32:
74; MIPS32R2:       # %bb.0: # %entry
75; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
76; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
77; MIPS32R2-NEXT:    addu $1, $2, $25
78; MIPS32R2-NEXT:    lw $1, %got(x)($1)
79; MIPS32R2-NEXT:  $BB0_1: # %entry
80; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
81; MIPS32R2-NEXT:    ll $2, 0($1)
82; MIPS32R2-NEXT:    addu $3, $2, $4
83; MIPS32R2-NEXT:    sc $3, 0($1)
84; MIPS32R2-NEXT:    beqz $3, $BB0_1
85; MIPS32R2-NEXT:    nop
86; MIPS32R2-NEXT:  # %bb.2: # %entry
87; MIPS32R2-NEXT:    jr $ra
88; MIPS32R2-NEXT:    nop
89;
90; MIPS32R6-LABEL: AtomicLoadAdd32:
91; MIPS32R6:       # %bb.0: # %entry
92; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
93; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
94; MIPS32R6-NEXT:    addu $1, $2, $25
95; MIPS32R6-NEXT:    lw $1, %got(x)($1)
96; MIPS32R6-NEXT:  $BB0_1: # %entry
97; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
98; MIPS32R6-NEXT:    ll $2, 0($1)
99; MIPS32R6-NEXT:    addu $3, $2, $4
100; MIPS32R6-NEXT:    sc $3, 0($1)
101; MIPS32R6-NEXT:    beqzc $3, $BB0_1
102; MIPS32R6-NEXT:    nop
103; MIPS32R6-NEXT:  # %bb.2: # %entry
104; MIPS32R6-NEXT:    jrc $ra
105;
106; MIPS32R6O0-LABEL: AtomicLoadAdd32:
107; MIPS32R6O0:       # %bb.0: # %entry
108; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
109; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
110; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
111; MIPS32R6O0-NEXT:    addu $2, $2, $25
112; MIPS32R6O0-NEXT:    move $25, $4
113; MIPS32R6O0-NEXT:    lw $2, %got(x)($2)
114; MIPS32R6O0-NEXT:  $BB0_1: # %entry
115; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
116; MIPS32R6O0-NEXT:    ll $1, 0($2)
117; MIPS32R6O0-NEXT:    addu $3, $1, $4
118; MIPS32R6O0-NEXT:    sc $3, 0($2)
119; MIPS32R6O0-NEXT:    beqzc $3, $BB0_1
120; MIPS32R6O0-NEXT:  # %bb.2: # %entry
121; MIPS32R6O0-NEXT:    move $2, $1
122; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
123; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
124; MIPS32R6O0-NEXT:    jrc $ra
125;
126; MIPS4-LABEL: AtomicLoadAdd32:
127; MIPS4:       # %bb.0: # %entry
128; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
129; MIPS4-NEXT:    daddu $1, $1, $25
130; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
131; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
132; MIPS4-NEXT:  .LBB0_1: # %entry
133; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
134; MIPS4-NEXT:    ll $2, 0($1)
135; MIPS4-NEXT:    addu $3, $2, $4
136; MIPS4-NEXT:    sc $3, 0($1)
137; MIPS4-NEXT:    beqz $3, .LBB0_1
138; MIPS4-NEXT:    nop
139; MIPS4-NEXT:  # %bb.2: # %entry
140; MIPS4-NEXT:    jr $ra
141; MIPS4-NEXT:    nop
142;
143; MIPS64-LABEL: AtomicLoadAdd32:
144; MIPS64:       # %bb.0: # %entry
145; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
146; MIPS64-NEXT:    daddu $1, $1, $25
147; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
148; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
149; MIPS64-NEXT:  .LBB0_1: # %entry
150; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
151; MIPS64-NEXT:    ll $2, 0($1)
152; MIPS64-NEXT:    addu $3, $2, $4
153; MIPS64-NEXT:    sc $3, 0($1)
154; MIPS64-NEXT:    beqz $3, .LBB0_1
155; MIPS64-NEXT:    nop
156; MIPS64-NEXT:  # %bb.2: # %entry
157; MIPS64-NEXT:    jr $ra
158; MIPS64-NEXT:    nop
159;
160; MIPS64R2-LABEL: AtomicLoadAdd32:
161; MIPS64R2:       # %bb.0: # %entry
162; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
163; MIPS64R2-NEXT:    daddu $1, $1, $25
164; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
165; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
166; MIPS64R2-NEXT:  .LBB0_1: # %entry
167; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
168; MIPS64R2-NEXT:    ll $2, 0($1)
169; MIPS64R2-NEXT:    addu $3, $2, $4
170; MIPS64R2-NEXT:    sc $3, 0($1)
171; MIPS64R2-NEXT:    beqz $3, .LBB0_1
172; MIPS64R2-NEXT:    nop
173; MIPS64R2-NEXT:  # %bb.2: # %entry
174; MIPS64R2-NEXT:    jr $ra
175; MIPS64R2-NEXT:    nop
176;
177; MIPS64R6-LABEL: AtomicLoadAdd32:
178; MIPS64R6:       # %bb.0: # %entry
179; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
180; MIPS64R6-NEXT:    daddu $1, $1, $25
181; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
182; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
183; MIPS64R6-NEXT:  .LBB0_1: # %entry
184; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
185; MIPS64R6-NEXT:    ll $2, 0($1)
186; MIPS64R6-NEXT:    addu $3, $2, $4
187; MIPS64R6-NEXT:    sc $3, 0($1)
188; MIPS64R6-NEXT:    beqzc $3, .LBB0_1
189; MIPS64R6-NEXT:    nop
190; MIPS64R6-NEXT:  # %bb.2: # %entry
191; MIPS64R6-NEXT:    jrc $ra
192;
193; MIPS64R6O0-LABEL: AtomicLoadAdd32:
194; MIPS64R6O0:       # %bb.0: # %entry
195; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
196; MIPS64R6O0-NEXT:    daddu $1, $1, $25
197; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
198; MIPS64R6O0-NEXT:    move $2, $4
199; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
200; MIPS64R6O0-NEXT:  .LBB0_1: # %entry
201; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
202; MIPS64R6O0-NEXT:    ll $3, 0($1)
203; MIPS64R6O0-NEXT:    addu $5, $3, $2
204; MIPS64R6O0-NEXT:    sc $5, 0($1)
205; MIPS64R6O0-NEXT:    beqzc $5, .LBB0_1
206; MIPS64R6O0-NEXT:  # %bb.2: # %entry
207; MIPS64R6O0-NEXT:    move $2, $3
208; MIPS64R6O0-NEXT:    jrc $ra
209;
210; MM32-LABEL: AtomicLoadAdd32:
211; MM32:       # %bb.0: # %entry
212; MM32-NEXT:    lui $2, %hi(_gp_disp)
213; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
214; MM32-NEXT:    addu $2, $2, $25
215; MM32-NEXT:    lw $1, %got(x)($2)
216; MM32-NEXT:  $BB0_1: # %entry
217; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
218; MM32-NEXT:    ll $2, 0($1)
219; MM32-NEXT:    addu16 $3, $2, $4
220; MM32-NEXT:    sc $3, 0($1)
221; MM32-NEXT:    beqzc $3, $BB0_1
222; MM32-NEXT:  # %bb.2: # %entry
223; MM32-NEXT:    jrc $ra
224;
225; O1-LABEL: AtomicLoadAdd32:
226; O1:       # %bb.0: # %entry
227; O1-NEXT:    lui $2, %hi(_gp_disp)
228; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
229; O1-NEXT:    addu $1, $2, $25
230; O1-NEXT:    lw $1, %got(x)($1)
231; O1-NEXT:  $BB0_1: # %entry
232; O1-NEXT:    # =>This Inner Loop Header: Depth=1
233; O1-NEXT:    ll $2, 0($1)
234; O1-NEXT:    addu $3, $2, $4
235; O1-NEXT:    sc $3, 0($1)
236; O1-NEXT:    beqz $3, $BB0_1
237; O1-NEXT:    nop
238; O1-NEXT:  # %bb.2: # %entry
239; O1-NEXT:    jr $ra
240; O1-NEXT:    nop
241;
242; O2-LABEL: AtomicLoadAdd32:
243; O2:       # %bb.0: # %entry
244; O2-NEXT:    lui $2, %hi(_gp_disp)
245; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
246; O2-NEXT:    addu $1, $2, $25
247; O2-NEXT:    lw $1, %got(x)($1)
248; O2-NEXT:  $BB0_1: # %entry
249; O2-NEXT:    # =>This Inner Loop Header: Depth=1
250; O2-NEXT:    ll $2, 0($1)
251; O2-NEXT:    addu $3, $2, $4
252; O2-NEXT:    sc $3, 0($1)
253; O2-NEXT:    beqz $3, $BB0_1
254; O2-NEXT:    nop
255; O2-NEXT:  # %bb.2: # %entry
256; O2-NEXT:    jr $ra
257; O2-NEXT:    nop
258;
259; O3-LABEL: AtomicLoadAdd32:
260; O3:       # %bb.0: # %entry
261; O3-NEXT:    lui $2, %hi(_gp_disp)
262; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
263; O3-NEXT:    addu $1, $2, $25
264; O3-NEXT:    lw $1, %got(x)($1)
265; O3-NEXT:  $BB0_1: # %entry
266; O3-NEXT:    # =>This Inner Loop Header: Depth=1
267; O3-NEXT:    ll $2, 0($1)
268; O3-NEXT:    addu $3, $2, $4
269; O3-NEXT:    sc $3, 0($1)
270; O3-NEXT:    beqz $3, $BB0_1
271; O3-NEXT:    nop
272; O3-NEXT:  # %bb.2: # %entry
273; O3-NEXT:    jr $ra
274; O3-NEXT:    nop
275;
276; MIPS32EB-LABEL: AtomicLoadAdd32:
277; MIPS32EB:       # %bb.0: # %entry
278; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
279; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
280; MIPS32EB-NEXT:    addu $1, $2, $25
281; MIPS32EB-NEXT:    lw $1, %got(x)($1)
282; MIPS32EB-NEXT:  $BB0_1: # %entry
283; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
284; MIPS32EB-NEXT:    ll $2, 0($1)
285; MIPS32EB-NEXT:    addu $3, $2, $4
286; MIPS32EB-NEXT:    sc $3, 0($1)
287; MIPS32EB-NEXT:    beqz $3, $BB0_1
288; MIPS32EB-NEXT:    nop
289; MIPS32EB-NEXT:  # %bb.2: # %entry
290; MIPS32EB-NEXT:    jr $ra
291; MIPS32EB-NEXT:    nop
292entry:
293  %0 = atomicrmw add i32* @x, i32 %incr monotonic
294  ret i32 %0
295
296}
297
298define i32 @AtomicLoadSub32(i32 signext %incr) nounwind {
299; MIPS32-LABEL: AtomicLoadSub32:
300; MIPS32:       # %bb.0: # %entry
301; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
302; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
303; MIPS32-NEXT:    addu $1, $2, $25
304; MIPS32-NEXT:    lw $1, %got(x)($1)
305; MIPS32-NEXT:  $BB1_1: # %entry
306; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
307; MIPS32-NEXT:    ll $2, 0($1)
308; MIPS32-NEXT:    subu $3, $2, $4
309; MIPS32-NEXT:    sc $3, 0($1)
310; MIPS32-NEXT:    beqz $3, $BB1_1
311; MIPS32-NEXT:    nop
312; MIPS32-NEXT:  # %bb.2: # %entry
313; MIPS32-NEXT:    jr $ra
314; MIPS32-NEXT:    nop
315;
316; MIPS32O0-LABEL: AtomicLoadSub32:
317; MIPS32O0:       # %bb.0: # %entry
318; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
319; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
320; MIPS32O0-NEXT:    addu $2, $2, $25
321; MIPS32O0-NEXT:    lw $2, %got(x)($2)
322; MIPS32O0-NEXT:  $BB1_1: # %entry
323; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
324; MIPS32O0-NEXT:    ll $25, 0($2)
325; MIPS32O0-NEXT:    subu $1, $25, $4
326; MIPS32O0-NEXT:    sc $1, 0($2)
327; MIPS32O0-NEXT:    beqz $1, $BB1_1
328; MIPS32O0-NEXT:    nop
329; MIPS32O0-NEXT:  # %bb.2: # %entry
330; MIPS32O0-NEXT:    move $2, $25
331; MIPS32O0-NEXT:    jr $ra
332; MIPS32O0-NEXT:    nop
333;
334; MIPS32R2-LABEL: AtomicLoadSub32:
335; MIPS32R2:       # %bb.0: # %entry
336; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
337; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
338; MIPS32R2-NEXT:    addu $1, $2, $25
339; MIPS32R2-NEXT:    lw $1, %got(x)($1)
340; MIPS32R2-NEXT:  $BB1_1: # %entry
341; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
342; MIPS32R2-NEXT:    ll $2, 0($1)
343; MIPS32R2-NEXT:    subu $3, $2, $4
344; MIPS32R2-NEXT:    sc $3, 0($1)
345; MIPS32R2-NEXT:    beqz $3, $BB1_1
346; MIPS32R2-NEXT:    nop
347; MIPS32R2-NEXT:  # %bb.2: # %entry
348; MIPS32R2-NEXT:    jr $ra
349; MIPS32R2-NEXT:    nop
350;
351; MIPS32R6-LABEL: AtomicLoadSub32:
352; MIPS32R6:       # %bb.0: # %entry
353; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
354; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
355; MIPS32R6-NEXT:    addu $1, $2, $25
356; MIPS32R6-NEXT:    lw $1, %got(x)($1)
357; MIPS32R6-NEXT:  $BB1_1: # %entry
358; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
359; MIPS32R6-NEXT:    ll $2, 0($1)
360; MIPS32R6-NEXT:    subu $3, $2, $4
361; MIPS32R6-NEXT:    sc $3, 0($1)
362; MIPS32R6-NEXT:    beqzc $3, $BB1_1
363; MIPS32R6-NEXT:    nop
364; MIPS32R6-NEXT:  # %bb.2: # %entry
365; MIPS32R6-NEXT:    jrc $ra
366;
367; MIPS32R6O0-LABEL: AtomicLoadSub32:
368; MIPS32R6O0:       # %bb.0: # %entry
369; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
370; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
371; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
372; MIPS32R6O0-NEXT:    addu $2, $2, $25
373; MIPS32R6O0-NEXT:    move $25, $4
374; MIPS32R6O0-NEXT:    lw $2, %got(x)($2)
375; MIPS32R6O0-NEXT:  $BB1_1: # %entry
376; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
377; MIPS32R6O0-NEXT:    ll $1, 0($2)
378; MIPS32R6O0-NEXT:    subu $3, $1, $4
379; MIPS32R6O0-NEXT:    sc $3, 0($2)
380; MIPS32R6O0-NEXT:    beqzc $3, $BB1_1
381; MIPS32R6O0-NEXT:  # %bb.2: # %entry
382; MIPS32R6O0-NEXT:    move $2, $1
383; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
384; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
385; MIPS32R6O0-NEXT:    jrc $ra
386;
387; MIPS4-LABEL: AtomicLoadSub32:
388; MIPS4:       # %bb.0: # %entry
389; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
390; MIPS4-NEXT:    daddu $1, $1, $25
391; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
392; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
393; MIPS4-NEXT:  .LBB1_1: # %entry
394; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
395; MIPS4-NEXT:    ll $2, 0($1)
396; MIPS4-NEXT:    subu $3, $2, $4
397; MIPS4-NEXT:    sc $3, 0($1)
398; MIPS4-NEXT:    beqz $3, .LBB1_1
399; MIPS4-NEXT:    nop
400; MIPS4-NEXT:  # %bb.2: # %entry
401; MIPS4-NEXT:    jr $ra
402; MIPS4-NEXT:    nop
403;
404; MIPS64-LABEL: AtomicLoadSub32:
405; MIPS64:       # %bb.0: # %entry
406; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
407; MIPS64-NEXT:    daddu $1, $1, $25
408; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
409; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
410; MIPS64-NEXT:  .LBB1_1: # %entry
411; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
412; MIPS64-NEXT:    ll $2, 0($1)
413; MIPS64-NEXT:    subu $3, $2, $4
414; MIPS64-NEXT:    sc $3, 0($1)
415; MIPS64-NEXT:    beqz $3, .LBB1_1
416; MIPS64-NEXT:    nop
417; MIPS64-NEXT:  # %bb.2: # %entry
418; MIPS64-NEXT:    jr $ra
419; MIPS64-NEXT:    nop
420;
421; MIPS64R2-LABEL: AtomicLoadSub32:
422; MIPS64R2:       # %bb.0: # %entry
423; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
424; MIPS64R2-NEXT:    daddu $1, $1, $25
425; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
426; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
427; MIPS64R2-NEXT:  .LBB1_1: # %entry
428; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
429; MIPS64R2-NEXT:    ll $2, 0($1)
430; MIPS64R2-NEXT:    subu $3, $2, $4
431; MIPS64R2-NEXT:    sc $3, 0($1)
432; MIPS64R2-NEXT:    beqz $3, .LBB1_1
433; MIPS64R2-NEXT:    nop
434; MIPS64R2-NEXT:  # %bb.2: # %entry
435; MIPS64R2-NEXT:    jr $ra
436; MIPS64R2-NEXT:    nop
437;
438; MIPS64R6-LABEL: AtomicLoadSub32:
439; MIPS64R6:       # %bb.0: # %entry
440; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
441; MIPS64R6-NEXT:    daddu $1, $1, $25
442; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
443; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
444; MIPS64R6-NEXT:  .LBB1_1: # %entry
445; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
446; MIPS64R6-NEXT:    ll $2, 0($1)
447; MIPS64R6-NEXT:    subu $3, $2, $4
448; MIPS64R6-NEXT:    sc $3, 0($1)
449; MIPS64R6-NEXT:    beqzc $3, .LBB1_1
450; MIPS64R6-NEXT:    nop
451; MIPS64R6-NEXT:  # %bb.2: # %entry
452; MIPS64R6-NEXT:    jrc $ra
453;
454; MIPS64R6O0-LABEL: AtomicLoadSub32:
455; MIPS64R6O0:       # %bb.0: # %entry
456; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
457; MIPS64R6O0-NEXT:    daddu $1, $1, $25
458; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
459; MIPS64R6O0-NEXT:    move $2, $4
460; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
461; MIPS64R6O0-NEXT:  .LBB1_1: # %entry
462; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
463; MIPS64R6O0-NEXT:    ll $3, 0($1)
464; MIPS64R6O0-NEXT:    subu $5, $3, $2
465; MIPS64R6O0-NEXT:    sc $5, 0($1)
466; MIPS64R6O0-NEXT:    beqzc $5, .LBB1_1
467; MIPS64R6O0-NEXT:  # %bb.2: # %entry
468; MIPS64R6O0-NEXT:    move $2, $3
469; MIPS64R6O0-NEXT:    jrc $ra
470;
471; MM32-LABEL: AtomicLoadSub32:
472; MM32:       # %bb.0: # %entry
473; MM32-NEXT:    lui $2, %hi(_gp_disp)
474; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
475; MM32-NEXT:    addu $2, $2, $25
476; MM32-NEXT:    lw $1, %got(x)($2)
477; MM32-NEXT:  $BB1_1: # %entry
478; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
479; MM32-NEXT:    ll $2, 0($1)
480; MM32-NEXT:    subu16 $3, $2, $4
481; MM32-NEXT:    sc $3, 0($1)
482; MM32-NEXT:    beqzc $3, $BB1_1
483; MM32-NEXT:  # %bb.2: # %entry
484; MM32-NEXT:    jrc $ra
485;
486; O1-LABEL: AtomicLoadSub32:
487; O1:       # %bb.0: # %entry
488; O1-NEXT:    lui $2, %hi(_gp_disp)
489; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
490; O1-NEXT:    addu $1, $2, $25
491; O1-NEXT:    lw $1, %got(x)($1)
492; O1-NEXT:  $BB1_1: # %entry
493; O1-NEXT:    # =>This Inner Loop Header: Depth=1
494; O1-NEXT:    ll $2, 0($1)
495; O1-NEXT:    subu $3, $2, $4
496; O1-NEXT:    sc $3, 0($1)
497; O1-NEXT:    beqz $3, $BB1_1
498; O1-NEXT:    nop
499; O1-NEXT:  # %bb.2: # %entry
500; O1-NEXT:    jr $ra
501; O1-NEXT:    nop
502;
503; O2-LABEL: AtomicLoadSub32:
504; O2:       # %bb.0: # %entry
505; O2-NEXT:    lui $2, %hi(_gp_disp)
506; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
507; O2-NEXT:    addu $1, $2, $25
508; O2-NEXT:    lw $1, %got(x)($1)
509; O2-NEXT:  $BB1_1: # %entry
510; O2-NEXT:    # =>This Inner Loop Header: Depth=1
511; O2-NEXT:    ll $2, 0($1)
512; O2-NEXT:    subu $3, $2, $4
513; O2-NEXT:    sc $3, 0($1)
514; O2-NEXT:    beqz $3, $BB1_1
515; O2-NEXT:    nop
516; O2-NEXT:  # %bb.2: # %entry
517; O2-NEXT:    jr $ra
518; O2-NEXT:    nop
519;
520; O3-LABEL: AtomicLoadSub32:
521; O3:       # %bb.0: # %entry
522; O3-NEXT:    lui $2, %hi(_gp_disp)
523; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
524; O3-NEXT:    addu $1, $2, $25
525; O3-NEXT:    lw $1, %got(x)($1)
526; O3-NEXT:  $BB1_1: # %entry
527; O3-NEXT:    # =>This Inner Loop Header: Depth=1
528; O3-NEXT:    ll $2, 0($1)
529; O3-NEXT:    subu $3, $2, $4
530; O3-NEXT:    sc $3, 0($1)
531; O3-NEXT:    beqz $3, $BB1_1
532; O3-NEXT:    nop
533; O3-NEXT:  # %bb.2: # %entry
534; O3-NEXT:    jr $ra
535; O3-NEXT:    nop
536;
537; MIPS32EB-LABEL: AtomicLoadSub32:
538; MIPS32EB:       # %bb.0: # %entry
539; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
540; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
541; MIPS32EB-NEXT:    addu $1, $2, $25
542; MIPS32EB-NEXT:    lw $1, %got(x)($1)
543; MIPS32EB-NEXT:  $BB1_1: # %entry
544; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
545; MIPS32EB-NEXT:    ll $2, 0($1)
546; MIPS32EB-NEXT:    subu $3, $2, $4
547; MIPS32EB-NEXT:    sc $3, 0($1)
548; MIPS32EB-NEXT:    beqz $3, $BB1_1
549; MIPS32EB-NEXT:    nop
550; MIPS32EB-NEXT:  # %bb.2: # %entry
551; MIPS32EB-NEXT:    jr $ra
552; MIPS32EB-NEXT:    nop
553entry:
554  %0 = atomicrmw sub i32* @x, i32 %incr monotonic
555  ret i32 %0
556
557}
558
559define i32 @AtomicLoadXor32(i32 signext %incr) nounwind {
560; MIPS32-LABEL: AtomicLoadXor32:
561; MIPS32:       # %bb.0: # %entry
562; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
563; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
564; MIPS32-NEXT:    addu $1, $2, $25
565; MIPS32-NEXT:    lw $1, %got(x)($1)
566; MIPS32-NEXT:  $BB2_1: # %entry
567; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
568; MIPS32-NEXT:    ll $2, 0($1)
569; MIPS32-NEXT:    xor $3, $2, $4
570; MIPS32-NEXT:    sc $3, 0($1)
571; MIPS32-NEXT:    beqz $3, $BB2_1
572; MIPS32-NEXT:    nop
573; MIPS32-NEXT:  # %bb.2: # %entry
574; MIPS32-NEXT:    jr $ra
575; MIPS32-NEXT:    nop
576;
577; MIPS32O0-LABEL: AtomicLoadXor32:
578; MIPS32O0:       # %bb.0: # %entry
579; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
580; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
581; MIPS32O0-NEXT:    addu $2, $2, $25
582; MIPS32O0-NEXT:    lw $2, %got(x)($2)
583; MIPS32O0-NEXT:  $BB2_1: # %entry
584; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
585; MIPS32O0-NEXT:    ll $25, 0($2)
586; MIPS32O0-NEXT:    xor $1, $25, $4
587; MIPS32O0-NEXT:    sc $1, 0($2)
588; MIPS32O0-NEXT:    beqz $1, $BB2_1
589; MIPS32O0-NEXT:    nop
590; MIPS32O0-NEXT:  # %bb.2: # %entry
591; MIPS32O0-NEXT:    move $2, $25
592; MIPS32O0-NEXT:    jr $ra
593; MIPS32O0-NEXT:    nop
594;
595; MIPS32R2-LABEL: AtomicLoadXor32:
596; MIPS32R2:       # %bb.0: # %entry
597; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
598; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
599; MIPS32R2-NEXT:    addu $1, $2, $25
600; MIPS32R2-NEXT:    lw $1, %got(x)($1)
601; MIPS32R2-NEXT:  $BB2_1: # %entry
602; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
603; MIPS32R2-NEXT:    ll $2, 0($1)
604; MIPS32R2-NEXT:    xor $3, $2, $4
605; MIPS32R2-NEXT:    sc $3, 0($1)
606; MIPS32R2-NEXT:    beqz $3, $BB2_1
607; MIPS32R2-NEXT:    nop
608; MIPS32R2-NEXT:  # %bb.2: # %entry
609; MIPS32R2-NEXT:    jr $ra
610; MIPS32R2-NEXT:    nop
611;
612; MIPS32R6-LABEL: AtomicLoadXor32:
613; MIPS32R6:       # %bb.0: # %entry
614; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
615; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
616; MIPS32R6-NEXT:    addu $1, $2, $25
617; MIPS32R6-NEXT:    lw $1, %got(x)($1)
618; MIPS32R6-NEXT:  $BB2_1: # %entry
619; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
620; MIPS32R6-NEXT:    ll $2, 0($1)
621; MIPS32R6-NEXT:    xor $3, $2, $4
622; MIPS32R6-NEXT:    sc $3, 0($1)
623; MIPS32R6-NEXT:    beqzc $3, $BB2_1
624; MIPS32R6-NEXT:    nop
625; MIPS32R6-NEXT:  # %bb.2: # %entry
626; MIPS32R6-NEXT:    jrc $ra
627;
628; MIPS32R6O0-LABEL: AtomicLoadXor32:
629; MIPS32R6O0:       # %bb.0: # %entry
630; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
631; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
632; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
633; MIPS32R6O0-NEXT:    addu $2, $2, $25
634; MIPS32R6O0-NEXT:    move $25, $4
635; MIPS32R6O0-NEXT:    lw $2, %got(x)($2)
636; MIPS32R6O0-NEXT:  $BB2_1: # %entry
637; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
638; MIPS32R6O0-NEXT:    ll $1, 0($2)
639; MIPS32R6O0-NEXT:    xor $3, $1, $4
640; MIPS32R6O0-NEXT:    sc $3, 0($2)
641; MIPS32R6O0-NEXT:    beqzc $3, $BB2_1
642; MIPS32R6O0-NEXT:  # %bb.2: # %entry
643; MIPS32R6O0-NEXT:    move $2, $1
644; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
645; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
646; MIPS32R6O0-NEXT:    jrc $ra
647;
648; MIPS4-LABEL: AtomicLoadXor32:
649; MIPS4:       # %bb.0: # %entry
650; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
651; MIPS4-NEXT:    daddu $1, $1, $25
652; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
653; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
654; MIPS4-NEXT:  .LBB2_1: # %entry
655; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
656; MIPS4-NEXT:    ll $2, 0($1)
657; MIPS4-NEXT:    xor $3, $2, $4
658; MIPS4-NEXT:    sc $3, 0($1)
659; MIPS4-NEXT:    beqz $3, .LBB2_1
660; MIPS4-NEXT:    nop
661; MIPS4-NEXT:  # %bb.2: # %entry
662; MIPS4-NEXT:    jr $ra
663; MIPS4-NEXT:    nop
664;
665; MIPS64-LABEL: AtomicLoadXor32:
666; MIPS64:       # %bb.0: # %entry
667; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
668; MIPS64-NEXT:    daddu $1, $1, $25
669; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
670; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
671; MIPS64-NEXT:  .LBB2_1: # %entry
672; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
673; MIPS64-NEXT:    ll $2, 0($1)
674; MIPS64-NEXT:    xor $3, $2, $4
675; MIPS64-NEXT:    sc $3, 0($1)
676; MIPS64-NEXT:    beqz $3, .LBB2_1
677; MIPS64-NEXT:    nop
678; MIPS64-NEXT:  # %bb.2: # %entry
679; MIPS64-NEXT:    jr $ra
680; MIPS64-NEXT:    nop
681;
682; MIPS64R2-LABEL: AtomicLoadXor32:
683; MIPS64R2:       # %bb.0: # %entry
684; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
685; MIPS64R2-NEXT:    daddu $1, $1, $25
686; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
687; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
688; MIPS64R2-NEXT:  .LBB2_1: # %entry
689; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
690; MIPS64R2-NEXT:    ll $2, 0($1)
691; MIPS64R2-NEXT:    xor $3, $2, $4
692; MIPS64R2-NEXT:    sc $3, 0($1)
693; MIPS64R2-NEXT:    beqz $3, .LBB2_1
694; MIPS64R2-NEXT:    nop
695; MIPS64R2-NEXT:  # %bb.2: # %entry
696; MIPS64R2-NEXT:    jr $ra
697; MIPS64R2-NEXT:    nop
698;
699; MIPS64R6-LABEL: AtomicLoadXor32:
700; MIPS64R6:       # %bb.0: # %entry
701; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
702; MIPS64R6-NEXT:    daddu $1, $1, $25
703; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
704; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
705; MIPS64R6-NEXT:  .LBB2_1: # %entry
706; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
707; MIPS64R6-NEXT:    ll $2, 0($1)
708; MIPS64R6-NEXT:    xor $3, $2, $4
709; MIPS64R6-NEXT:    sc $3, 0($1)
710; MIPS64R6-NEXT:    beqzc $3, .LBB2_1
711; MIPS64R6-NEXT:    nop
712; MIPS64R6-NEXT:  # %bb.2: # %entry
713; MIPS64R6-NEXT:    jrc $ra
714;
715; MIPS64R6O0-LABEL: AtomicLoadXor32:
716; MIPS64R6O0:       # %bb.0: # %entry
717; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
718; MIPS64R6O0-NEXT:    daddu $1, $1, $25
719; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
720; MIPS64R6O0-NEXT:    move $2, $4
721; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
722; MIPS64R6O0-NEXT:  .LBB2_1: # %entry
723; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
724; MIPS64R6O0-NEXT:    ll $3, 0($1)
725; MIPS64R6O0-NEXT:    xor $5, $3, $2
726; MIPS64R6O0-NEXT:    sc $5, 0($1)
727; MIPS64R6O0-NEXT:    beqzc $5, .LBB2_1
728; MIPS64R6O0-NEXT:  # %bb.2: # %entry
729; MIPS64R6O0-NEXT:    move $2, $3
730; MIPS64R6O0-NEXT:    jrc $ra
731;
732; MM32-LABEL: AtomicLoadXor32:
733; MM32:       # %bb.0: # %entry
734; MM32-NEXT:    lui $2, %hi(_gp_disp)
735; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
736; MM32-NEXT:    addu $2, $2, $25
737; MM32-NEXT:    lw $1, %got(x)($2)
738; MM32-NEXT:  $BB2_1: # %entry
739; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
740; MM32-NEXT:    ll $2, 0($1)
741; MM32-NEXT:    xor $3, $2, $4
742; MM32-NEXT:    sc $3, 0($1)
743; MM32-NEXT:    beqzc $3, $BB2_1
744; MM32-NEXT:  # %bb.2: # %entry
745; MM32-NEXT:    jrc $ra
746;
747; O1-LABEL: AtomicLoadXor32:
748; O1:       # %bb.0: # %entry
749; O1-NEXT:    lui $2, %hi(_gp_disp)
750; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
751; O1-NEXT:    addu $1, $2, $25
752; O1-NEXT:    lw $1, %got(x)($1)
753; O1-NEXT:  $BB2_1: # %entry
754; O1-NEXT:    # =>This Inner Loop Header: Depth=1
755; O1-NEXT:    ll $2, 0($1)
756; O1-NEXT:    xor $3, $2, $4
757; O1-NEXT:    sc $3, 0($1)
758; O1-NEXT:    beqz $3, $BB2_1
759; O1-NEXT:    nop
760; O1-NEXT:  # %bb.2: # %entry
761; O1-NEXT:    jr $ra
762; O1-NEXT:    nop
763;
764; O2-LABEL: AtomicLoadXor32:
765; O2:       # %bb.0: # %entry
766; O2-NEXT:    lui $2, %hi(_gp_disp)
767; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
768; O2-NEXT:    addu $1, $2, $25
769; O2-NEXT:    lw $1, %got(x)($1)
770; O2-NEXT:  $BB2_1: # %entry
771; O2-NEXT:    # =>This Inner Loop Header: Depth=1
772; O2-NEXT:    ll $2, 0($1)
773; O2-NEXT:    xor $3, $2, $4
774; O2-NEXT:    sc $3, 0($1)
775; O2-NEXT:    beqz $3, $BB2_1
776; O2-NEXT:    nop
777; O2-NEXT:  # %bb.2: # %entry
778; O2-NEXT:    jr $ra
779; O2-NEXT:    nop
780;
781; O3-LABEL: AtomicLoadXor32:
782; O3:       # %bb.0: # %entry
783; O3-NEXT:    lui $2, %hi(_gp_disp)
784; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
785; O3-NEXT:    addu $1, $2, $25
786; O3-NEXT:    lw $1, %got(x)($1)
787; O3-NEXT:  $BB2_1: # %entry
788; O3-NEXT:    # =>This Inner Loop Header: Depth=1
789; O3-NEXT:    ll $2, 0($1)
790; O3-NEXT:    xor $3, $2, $4
791; O3-NEXT:    sc $3, 0($1)
792; O3-NEXT:    beqz $3, $BB2_1
793; O3-NEXT:    nop
794; O3-NEXT:  # %bb.2: # %entry
795; O3-NEXT:    jr $ra
796; O3-NEXT:    nop
797;
798; MIPS32EB-LABEL: AtomicLoadXor32:
799; MIPS32EB:       # %bb.0: # %entry
800; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
801; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
802; MIPS32EB-NEXT:    addu $1, $2, $25
803; MIPS32EB-NEXT:    lw $1, %got(x)($1)
804; MIPS32EB-NEXT:  $BB2_1: # %entry
805; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
806; MIPS32EB-NEXT:    ll $2, 0($1)
807; MIPS32EB-NEXT:    xor $3, $2, $4
808; MIPS32EB-NEXT:    sc $3, 0($1)
809; MIPS32EB-NEXT:    beqz $3, $BB2_1
810; MIPS32EB-NEXT:    nop
811; MIPS32EB-NEXT:  # %bb.2: # %entry
812; MIPS32EB-NEXT:    jr $ra
813; MIPS32EB-NEXT:    nop
814entry:
815  %0 = atomicrmw xor i32* @x, i32 %incr monotonic
816  ret i32 %0
817}
818
819define i32 @AtomicLoadOr32(i32 signext %incr) nounwind {
820; MIPS32-LABEL: AtomicLoadOr32:
821; MIPS32:       # %bb.0: # %entry
822; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
823; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
824; MIPS32-NEXT:    addu $1, $2, $25
825; MIPS32-NEXT:    lw $1, %got(x)($1)
826; MIPS32-NEXT:  $BB3_1: # %entry
827; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
828; MIPS32-NEXT:    ll $2, 0($1)
829; MIPS32-NEXT:    or $3, $2, $4
830; MIPS32-NEXT:    sc $3, 0($1)
831; MIPS32-NEXT:    beqz $3, $BB3_1
832; MIPS32-NEXT:    nop
833; MIPS32-NEXT:  # %bb.2: # %entry
834; MIPS32-NEXT:    jr $ra
835; MIPS32-NEXT:    nop
836;
837; MIPS32O0-LABEL: AtomicLoadOr32:
838; MIPS32O0:       # %bb.0: # %entry
839; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
840; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
841; MIPS32O0-NEXT:    addu $2, $2, $25
842; MIPS32O0-NEXT:    lw $2, %got(x)($2)
843; MIPS32O0-NEXT:  $BB3_1: # %entry
844; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
845; MIPS32O0-NEXT:    ll $25, 0($2)
846; MIPS32O0-NEXT:    or $1, $25, $4
847; MIPS32O0-NEXT:    sc $1, 0($2)
848; MIPS32O0-NEXT:    beqz $1, $BB3_1
849; MIPS32O0-NEXT:    nop
850; MIPS32O0-NEXT:  # %bb.2: # %entry
851; MIPS32O0-NEXT:    move $2, $25
852; MIPS32O0-NEXT:    jr $ra
853; MIPS32O0-NEXT:    nop
854;
855; MIPS32R2-LABEL: AtomicLoadOr32:
856; MIPS32R2:       # %bb.0: # %entry
857; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
858; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
859; MIPS32R2-NEXT:    addu $1, $2, $25
860; MIPS32R2-NEXT:    lw $1, %got(x)($1)
861; MIPS32R2-NEXT:  $BB3_1: # %entry
862; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
863; MIPS32R2-NEXT:    ll $2, 0($1)
864; MIPS32R2-NEXT:    or $3, $2, $4
865; MIPS32R2-NEXT:    sc $3, 0($1)
866; MIPS32R2-NEXT:    beqz $3, $BB3_1
867; MIPS32R2-NEXT:    nop
868; MIPS32R2-NEXT:  # %bb.2: # %entry
869; MIPS32R2-NEXT:    jr $ra
870; MIPS32R2-NEXT:    nop
871;
872; MIPS32R6-LABEL: AtomicLoadOr32:
873; MIPS32R6:       # %bb.0: # %entry
874; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
875; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
876; MIPS32R6-NEXT:    addu $1, $2, $25
877; MIPS32R6-NEXT:    lw $1, %got(x)($1)
878; MIPS32R6-NEXT:  $BB3_1: # %entry
879; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
880; MIPS32R6-NEXT:    ll $2, 0($1)
881; MIPS32R6-NEXT:    or $3, $2, $4
882; MIPS32R6-NEXT:    sc $3, 0($1)
883; MIPS32R6-NEXT:    beqzc $3, $BB3_1
884; MIPS32R6-NEXT:    nop
885; MIPS32R6-NEXT:  # %bb.2: # %entry
886; MIPS32R6-NEXT:    jrc $ra
887;
888; MIPS32R6O0-LABEL: AtomicLoadOr32:
889; MIPS32R6O0:       # %bb.0: # %entry
890; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
891; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
892; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
893; MIPS32R6O0-NEXT:    addu $2, $2, $25
894; MIPS32R6O0-NEXT:    move $25, $4
895; MIPS32R6O0-NEXT:    lw $2, %got(x)($2)
896; MIPS32R6O0-NEXT:  $BB3_1: # %entry
897; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
898; MIPS32R6O0-NEXT:    ll $1, 0($2)
899; MIPS32R6O0-NEXT:    or $3, $1, $4
900; MIPS32R6O0-NEXT:    sc $3, 0($2)
901; MIPS32R6O0-NEXT:    beqzc $3, $BB3_1
902; MIPS32R6O0-NEXT:  # %bb.2: # %entry
903; MIPS32R6O0-NEXT:    move $2, $1
904; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
905; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
906; MIPS32R6O0-NEXT:    jrc $ra
907;
908; MIPS4-LABEL: AtomicLoadOr32:
909; MIPS4:       # %bb.0: # %entry
910; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
911; MIPS4-NEXT:    daddu $1, $1, $25
912; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
913; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
914; MIPS4-NEXT:  .LBB3_1: # %entry
915; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
916; MIPS4-NEXT:    ll $2, 0($1)
917; MIPS4-NEXT:    or $3, $2, $4
918; MIPS4-NEXT:    sc $3, 0($1)
919; MIPS4-NEXT:    beqz $3, .LBB3_1
920; MIPS4-NEXT:    nop
921; MIPS4-NEXT:  # %bb.2: # %entry
922; MIPS4-NEXT:    jr $ra
923; MIPS4-NEXT:    nop
924;
925; MIPS64-LABEL: AtomicLoadOr32:
926; MIPS64:       # %bb.0: # %entry
927; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
928; MIPS64-NEXT:    daddu $1, $1, $25
929; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
930; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
931; MIPS64-NEXT:  .LBB3_1: # %entry
932; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
933; MIPS64-NEXT:    ll $2, 0($1)
934; MIPS64-NEXT:    or $3, $2, $4
935; MIPS64-NEXT:    sc $3, 0($1)
936; MIPS64-NEXT:    beqz $3, .LBB3_1
937; MIPS64-NEXT:    nop
938; MIPS64-NEXT:  # %bb.2: # %entry
939; MIPS64-NEXT:    jr $ra
940; MIPS64-NEXT:    nop
941;
942; MIPS64R2-LABEL: AtomicLoadOr32:
943; MIPS64R2:       # %bb.0: # %entry
944; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
945; MIPS64R2-NEXT:    daddu $1, $1, $25
946; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
947; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
948; MIPS64R2-NEXT:  .LBB3_1: # %entry
949; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
950; MIPS64R2-NEXT:    ll $2, 0($1)
951; MIPS64R2-NEXT:    or $3, $2, $4
952; MIPS64R2-NEXT:    sc $3, 0($1)
953; MIPS64R2-NEXT:    beqz $3, .LBB3_1
954; MIPS64R2-NEXT:    nop
955; MIPS64R2-NEXT:  # %bb.2: # %entry
956; MIPS64R2-NEXT:    jr $ra
957; MIPS64R2-NEXT:    nop
958;
959; MIPS64R6-LABEL: AtomicLoadOr32:
960; MIPS64R6:       # %bb.0: # %entry
961; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
962; MIPS64R6-NEXT:    daddu $1, $1, $25
963; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
964; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
965; MIPS64R6-NEXT:  .LBB3_1: # %entry
966; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
967; MIPS64R6-NEXT:    ll $2, 0($1)
968; MIPS64R6-NEXT:    or $3, $2, $4
969; MIPS64R6-NEXT:    sc $3, 0($1)
970; MIPS64R6-NEXT:    beqzc $3, .LBB3_1
971; MIPS64R6-NEXT:    nop
972; MIPS64R6-NEXT:  # %bb.2: # %entry
973; MIPS64R6-NEXT:    jrc $ra
974;
975; MIPS64R6O0-LABEL: AtomicLoadOr32:
976; MIPS64R6O0:       # %bb.0: # %entry
977; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
978; MIPS64R6O0-NEXT:    daddu $1, $1, $25
979; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
980; MIPS64R6O0-NEXT:    move $2, $4
981; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
982; MIPS64R6O0-NEXT:  .LBB3_1: # %entry
983; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
984; MIPS64R6O0-NEXT:    ll $3, 0($1)
985; MIPS64R6O0-NEXT:    or $5, $3, $2
986; MIPS64R6O0-NEXT:    sc $5, 0($1)
987; MIPS64R6O0-NEXT:    beqzc $5, .LBB3_1
988; MIPS64R6O0-NEXT:  # %bb.2: # %entry
989; MIPS64R6O0-NEXT:    move $2, $3
990; MIPS64R6O0-NEXT:    jrc $ra
991;
992; MM32-LABEL: AtomicLoadOr32:
993; MM32:       # %bb.0: # %entry
994; MM32-NEXT:    lui $2, %hi(_gp_disp)
995; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
996; MM32-NEXT:    addu $2, $2, $25
997; MM32-NEXT:    lw $1, %got(x)($2)
998; MM32-NEXT:  $BB3_1: # %entry
999; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1000; MM32-NEXT:    ll $2, 0($1)
1001; MM32-NEXT:    or $3, $2, $4
1002; MM32-NEXT:    sc $3, 0($1)
1003; MM32-NEXT:    beqzc $3, $BB3_1
1004; MM32-NEXT:  # %bb.2: # %entry
1005; MM32-NEXT:    jrc $ra
1006;
1007; O1-LABEL: AtomicLoadOr32:
1008; O1:       # %bb.0: # %entry
1009; O1-NEXT:    lui $2, %hi(_gp_disp)
1010; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1011; O1-NEXT:    addu $1, $2, $25
1012; O1-NEXT:    lw $1, %got(x)($1)
1013; O1-NEXT:  $BB3_1: # %entry
1014; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1015; O1-NEXT:    ll $2, 0($1)
1016; O1-NEXT:    or $3, $2, $4
1017; O1-NEXT:    sc $3, 0($1)
1018; O1-NEXT:    beqz $3, $BB3_1
1019; O1-NEXT:    nop
1020; O1-NEXT:  # %bb.2: # %entry
1021; O1-NEXT:    jr $ra
1022; O1-NEXT:    nop
1023;
1024; O2-LABEL: AtomicLoadOr32:
1025; O2:       # %bb.0: # %entry
1026; O2-NEXT:    lui $2, %hi(_gp_disp)
1027; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1028; O2-NEXT:    addu $1, $2, $25
1029; O2-NEXT:    lw $1, %got(x)($1)
1030; O2-NEXT:  $BB3_1: # %entry
1031; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1032; O2-NEXT:    ll $2, 0($1)
1033; O2-NEXT:    or $3, $2, $4
1034; O2-NEXT:    sc $3, 0($1)
1035; O2-NEXT:    beqz $3, $BB3_1
1036; O2-NEXT:    nop
1037; O2-NEXT:  # %bb.2: # %entry
1038; O2-NEXT:    jr $ra
1039; O2-NEXT:    nop
1040;
1041; O3-LABEL: AtomicLoadOr32:
1042; O3:       # %bb.0: # %entry
1043; O3-NEXT:    lui $2, %hi(_gp_disp)
1044; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1045; O3-NEXT:    addu $1, $2, $25
1046; O3-NEXT:    lw $1, %got(x)($1)
1047; O3-NEXT:  $BB3_1: # %entry
1048; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1049; O3-NEXT:    ll $2, 0($1)
1050; O3-NEXT:    or $3, $2, $4
1051; O3-NEXT:    sc $3, 0($1)
1052; O3-NEXT:    beqz $3, $BB3_1
1053; O3-NEXT:    nop
1054; O3-NEXT:  # %bb.2: # %entry
1055; O3-NEXT:    jr $ra
1056; O3-NEXT:    nop
1057;
1058; MIPS32EB-LABEL: AtomicLoadOr32:
1059; MIPS32EB:       # %bb.0: # %entry
1060; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1061; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1062; MIPS32EB-NEXT:    addu $1, $2, $25
1063; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1064; MIPS32EB-NEXT:  $BB3_1: # %entry
1065; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1066; MIPS32EB-NEXT:    ll $2, 0($1)
1067; MIPS32EB-NEXT:    or $3, $2, $4
1068; MIPS32EB-NEXT:    sc $3, 0($1)
1069; MIPS32EB-NEXT:    beqz $3, $BB3_1
1070; MIPS32EB-NEXT:    nop
1071; MIPS32EB-NEXT:  # %bb.2: # %entry
1072; MIPS32EB-NEXT:    jr $ra
1073; MIPS32EB-NEXT:    nop
1074entry:
1075  %0 = atomicrmw or i32* @x, i32 %incr monotonic
1076  ret i32 %0
1077}
1078
1079define i32 @AtomicLoadAnd32(i32 signext %incr) nounwind {
1080; MIPS32-LABEL: AtomicLoadAnd32:
1081; MIPS32:       # %bb.0: # %entry
1082; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1083; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1084; MIPS32-NEXT:    addu $1, $2, $25
1085; MIPS32-NEXT:    lw $1, %got(x)($1)
1086; MIPS32-NEXT:  $BB4_1: # %entry
1087; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1088; MIPS32-NEXT:    ll $2, 0($1)
1089; MIPS32-NEXT:    and $3, $2, $4
1090; MIPS32-NEXT:    sc $3, 0($1)
1091; MIPS32-NEXT:    beqz $3, $BB4_1
1092; MIPS32-NEXT:    nop
1093; MIPS32-NEXT:  # %bb.2: # %entry
1094; MIPS32-NEXT:    jr $ra
1095; MIPS32-NEXT:    nop
1096;
1097; MIPS32O0-LABEL: AtomicLoadAnd32:
1098; MIPS32O0:       # %bb.0: # %entry
1099; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1100; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1101; MIPS32O0-NEXT:    addu $2, $2, $25
1102; MIPS32O0-NEXT:    lw $2, %got(x)($2)
1103; MIPS32O0-NEXT:  $BB4_1: # %entry
1104; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1105; MIPS32O0-NEXT:    ll $25, 0($2)
1106; MIPS32O0-NEXT:    and $1, $25, $4
1107; MIPS32O0-NEXT:    sc $1, 0($2)
1108; MIPS32O0-NEXT:    beqz $1, $BB4_1
1109; MIPS32O0-NEXT:    nop
1110; MIPS32O0-NEXT:  # %bb.2: # %entry
1111; MIPS32O0-NEXT:    move $2, $25
1112; MIPS32O0-NEXT:    jr $ra
1113; MIPS32O0-NEXT:    nop
1114;
1115; MIPS32R2-LABEL: AtomicLoadAnd32:
1116; MIPS32R2:       # %bb.0: # %entry
1117; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1118; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1119; MIPS32R2-NEXT:    addu $1, $2, $25
1120; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1121; MIPS32R2-NEXT:  $BB4_1: # %entry
1122; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1123; MIPS32R2-NEXT:    ll $2, 0($1)
1124; MIPS32R2-NEXT:    and $3, $2, $4
1125; MIPS32R2-NEXT:    sc $3, 0($1)
1126; MIPS32R2-NEXT:    beqz $3, $BB4_1
1127; MIPS32R2-NEXT:    nop
1128; MIPS32R2-NEXT:  # %bb.2: # %entry
1129; MIPS32R2-NEXT:    jr $ra
1130; MIPS32R2-NEXT:    nop
1131;
1132; MIPS32R6-LABEL: AtomicLoadAnd32:
1133; MIPS32R6:       # %bb.0: # %entry
1134; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1135; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1136; MIPS32R6-NEXT:    addu $1, $2, $25
1137; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1138; MIPS32R6-NEXT:  $BB4_1: # %entry
1139; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1140; MIPS32R6-NEXT:    ll $2, 0($1)
1141; MIPS32R6-NEXT:    and $3, $2, $4
1142; MIPS32R6-NEXT:    sc $3, 0($1)
1143; MIPS32R6-NEXT:    beqzc $3, $BB4_1
1144; MIPS32R6-NEXT:    nop
1145; MIPS32R6-NEXT:  # %bb.2: # %entry
1146; MIPS32R6-NEXT:    jrc $ra
1147;
1148; MIPS32R6O0-LABEL: AtomicLoadAnd32:
1149; MIPS32R6O0:       # %bb.0: # %entry
1150; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1151; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1152; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
1153; MIPS32R6O0-NEXT:    addu $2, $2, $25
1154; MIPS32R6O0-NEXT:    move $25, $4
1155; MIPS32R6O0-NEXT:    lw $2, %got(x)($2)
1156; MIPS32R6O0-NEXT:  $BB4_1: # %entry
1157; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1158; MIPS32R6O0-NEXT:    ll $1, 0($2)
1159; MIPS32R6O0-NEXT:    and $3, $1, $4
1160; MIPS32R6O0-NEXT:    sc $3, 0($2)
1161; MIPS32R6O0-NEXT:    beqzc $3, $BB4_1
1162; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1163; MIPS32R6O0-NEXT:    move $2, $1
1164; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
1165; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
1166; MIPS32R6O0-NEXT:    jrc $ra
1167;
1168; MIPS4-LABEL: AtomicLoadAnd32:
1169; MIPS4:       # %bb.0: # %entry
1170; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1171; MIPS4-NEXT:    daddu $1, $1, $25
1172; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1173; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1174; MIPS4-NEXT:  .LBB4_1: # %entry
1175; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1176; MIPS4-NEXT:    ll $2, 0($1)
1177; MIPS4-NEXT:    and $3, $2, $4
1178; MIPS4-NEXT:    sc $3, 0($1)
1179; MIPS4-NEXT:    beqz $3, .LBB4_1
1180; MIPS4-NEXT:    nop
1181; MIPS4-NEXT:  # %bb.2: # %entry
1182; MIPS4-NEXT:    jr $ra
1183; MIPS4-NEXT:    nop
1184;
1185; MIPS64-LABEL: AtomicLoadAnd32:
1186; MIPS64:       # %bb.0: # %entry
1187; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1188; MIPS64-NEXT:    daddu $1, $1, $25
1189; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1190; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1191; MIPS64-NEXT:  .LBB4_1: # %entry
1192; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1193; MIPS64-NEXT:    ll $2, 0($1)
1194; MIPS64-NEXT:    and $3, $2, $4
1195; MIPS64-NEXT:    sc $3, 0($1)
1196; MIPS64-NEXT:    beqz $3, .LBB4_1
1197; MIPS64-NEXT:    nop
1198; MIPS64-NEXT:  # %bb.2: # %entry
1199; MIPS64-NEXT:    jr $ra
1200; MIPS64-NEXT:    nop
1201;
1202; MIPS64R2-LABEL: AtomicLoadAnd32:
1203; MIPS64R2:       # %bb.0: # %entry
1204; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1205; MIPS64R2-NEXT:    daddu $1, $1, $25
1206; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1207; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1208; MIPS64R2-NEXT:  .LBB4_1: # %entry
1209; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1210; MIPS64R2-NEXT:    ll $2, 0($1)
1211; MIPS64R2-NEXT:    and $3, $2, $4
1212; MIPS64R2-NEXT:    sc $3, 0($1)
1213; MIPS64R2-NEXT:    beqz $3, .LBB4_1
1214; MIPS64R2-NEXT:    nop
1215; MIPS64R2-NEXT:  # %bb.2: # %entry
1216; MIPS64R2-NEXT:    jr $ra
1217; MIPS64R2-NEXT:    nop
1218;
1219; MIPS64R6-LABEL: AtomicLoadAnd32:
1220; MIPS64R6:       # %bb.0: # %entry
1221; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1222; MIPS64R6-NEXT:    daddu $1, $1, $25
1223; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1224; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1225; MIPS64R6-NEXT:  .LBB4_1: # %entry
1226; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1227; MIPS64R6-NEXT:    ll $2, 0($1)
1228; MIPS64R6-NEXT:    and $3, $2, $4
1229; MIPS64R6-NEXT:    sc $3, 0($1)
1230; MIPS64R6-NEXT:    beqzc $3, .LBB4_1
1231; MIPS64R6-NEXT:    nop
1232; MIPS64R6-NEXT:  # %bb.2: # %entry
1233; MIPS64R6-NEXT:    jrc $ra
1234;
1235; MIPS64R6O0-LABEL: AtomicLoadAnd32:
1236; MIPS64R6O0:       # %bb.0: # %entry
1237; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1238; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1239; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1240; MIPS64R6O0-NEXT:    move $2, $4
1241; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
1242; MIPS64R6O0-NEXT:  .LBB4_1: # %entry
1243; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1244; MIPS64R6O0-NEXT:    ll $3, 0($1)
1245; MIPS64R6O0-NEXT:    and $5, $3, $2
1246; MIPS64R6O0-NEXT:    sc $5, 0($1)
1247; MIPS64R6O0-NEXT:    beqzc $5, .LBB4_1
1248; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1249; MIPS64R6O0-NEXT:    move $2, $3
1250; MIPS64R6O0-NEXT:    jrc $ra
1251;
1252; MM32-LABEL: AtomicLoadAnd32:
1253; MM32:       # %bb.0: # %entry
1254; MM32-NEXT:    lui $2, %hi(_gp_disp)
1255; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1256; MM32-NEXT:    addu $2, $2, $25
1257; MM32-NEXT:    lw $1, %got(x)($2)
1258; MM32-NEXT:  $BB4_1: # %entry
1259; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1260; MM32-NEXT:    ll $2, 0($1)
1261; MM32-NEXT:    and $3, $2, $4
1262; MM32-NEXT:    sc $3, 0($1)
1263; MM32-NEXT:    beqzc $3, $BB4_1
1264; MM32-NEXT:  # %bb.2: # %entry
1265; MM32-NEXT:    jrc $ra
1266;
1267; O1-LABEL: AtomicLoadAnd32:
1268; O1:       # %bb.0: # %entry
1269; O1-NEXT:    lui $2, %hi(_gp_disp)
1270; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1271; O1-NEXT:    addu $1, $2, $25
1272; O1-NEXT:    lw $1, %got(x)($1)
1273; O1-NEXT:  $BB4_1: # %entry
1274; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1275; O1-NEXT:    ll $2, 0($1)
1276; O1-NEXT:    and $3, $2, $4
1277; O1-NEXT:    sc $3, 0($1)
1278; O1-NEXT:    beqz $3, $BB4_1
1279; O1-NEXT:    nop
1280; O1-NEXT:  # %bb.2: # %entry
1281; O1-NEXT:    jr $ra
1282; O1-NEXT:    nop
1283;
1284; O2-LABEL: AtomicLoadAnd32:
1285; O2:       # %bb.0: # %entry
1286; O2-NEXT:    lui $2, %hi(_gp_disp)
1287; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1288; O2-NEXT:    addu $1, $2, $25
1289; O2-NEXT:    lw $1, %got(x)($1)
1290; O2-NEXT:  $BB4_1: # %entry
1291; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1292; O2-NEXT:    ll $2, 0($1)
1293; O2-NEXT:    and $3, $2, $4
1294; O2-NEXT:    sc $3, 0($1)
1295; O2-NEXT:    beqz $3, $BB4_1
1296; O2-NEXT:    nop
1297; O2-NEXT:  # %bb.2: # %entry
1298; O2-NEXT:    jr $ra
1299; O2-NEXT:    nop
1300;
1301; O3-LABEL: AtomicLoadAnd32:
1302; O3:       # %bb.0: # %entry
1303; O3-NEXT:    lui $2, %hi(_gp_disp)
1304; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1305; O3-NEXT:    addu $1, $2, $25
1306; O3-NEXT:    lw $1, %got(x)($1)
1307; O3-NEXT:  $BB4_1: # %entry
1308; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1309; O3-NEXT:    ll $2, 0($1)
1310; O3-NEXT:    and $3, $2, $4
1311; O3-NEXT:    sc $3, 0($1)
1312; O3-NEXT:    beqz $3, $BB4_1
1313; O3-NEXT:    nop
1314; O3-NEXT:  # %bb.2: # %entry
1315; O3-NEXT:    jr $ra
1316; O3-NEXT:    nop
1317;
1318; MIPS32EB-LABEL: AtomicLoadAnd32:
1319; MIPS32EB:       # %bb.0: # %entry
1320; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1321; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1322; MIPS32EB-NEXT:    addu $1, $2, $25
1323; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1324; MIPS32EB-NEXT:  $BB4_1: # %entry
1325; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1326; MIPS32EB-NEXT:    ll $2, 0($1)
1327; MIPS32EB-NEXT:    and $3, $2, $4
1328; MIPS32EB-NEXT:    sc $3, 0($1)
1329; MIPS32EB-NEXT:    beqz $3, $BB4_1
1330; MIPS32EB-NEXT:    nop
1331; MIPS32EB-NEXT:  # %bb.2: # %entry
1332; MIPS32EB-NEXT:    jr $ra
1333; MIPS32EB-NEXT:    nop
1334entry:
1335  %0 = atomicrmw and i32* @x, i32 %incr monotonic
1336  ret i32 %0
1337}
1338
1339define i32 @AtomicLoadNand32(i32 signext %incr) nounwind {
1340; MIPS32-LABEL: AtomicLoadNand32:
1341; MIPS32:       # %bb.0: # %entry
1342; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1343; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1344; MIPS32-NEXT:    addu $1, $2, $25
1345; MIPS32-NEXT:    lw $1, %got(x)($1)
1346; MIPS32-NEXT:  $BB5_1: # %entry
1347; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1348; MIPS32-NEXT:    ll $2, 0($1)
1349; MIPS32-NEXT:    and $3, $2, $4
1350; MIPS32-NEXT:    nor $3, $zero, $3
1351; MIPS32-NEXT:    sc $3, 0($1)
1352; MIPS32-NEXT:    beqz $3, $BB5_1
1353; MIPS32-NEXT:    nop
1354; MIPS32-NEXT:  # %bb.2: # %entry
1355; MIPS32-NEXT:    jr $ra
1356; MIPS32-NEXT:    nop
1357;
1358; MIPS32O0-LABEL: AtomicLoadNand32:
1359; MIPS32O0:       # %bb.0: # %entry
1360; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1361; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1362; MIPS32O0-NEXT:    addu $2, $2, $25
1363; MIPS32O0-NEXT:    lw $2, %got(x)($2)
1364; MIPS32O0-NEXT:  $BB5_1: # %entry
1365; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1366; MIPS32O0-NEXT:    ll $25, 0($2)
1367; MIPS32O0-NEXT:    and $1, $25, $4
1368; MIPS32O0-NEXT:    nor $1, $zero, $1
1369; MIPS32O0-NEXT:    sc $1, 0($2)
1370; MIPS32O0-NEXT:    beqz $1, $BB5_1
1371; MIPS32O0-NEXT:    nop
1372; MIPS32O0-NEXT:  # %bb.2: # %entry
1373; MIPS32O0-NEXT:    move $2, $25
1374; MIPS32O0-NEXT:    jr $ra
1375; MIPS32O0-NEXT:    nop
1376;
1377; MIPS32R2-LABEL: AtomicLoadNand32:
1378; MIPS32R2:       # %bb.0: # %entry
1379; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1380; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1381; MIPS32R2-NEXT:    addu $1, $2, $25
1382; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1383; MIPS32R2-NEXT:  $BB5_1: # %entry
1384; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1385; MIPS32R2-NEXT:    ll $2, 0($1)
1386; MIPS32R2-NEXT:    and $3, $2, $4
1387; MIPS32R2-NEXT:    nor $3, $zero, $3
1388; MIPS32R2-NEXT:    sc $3, 0($1)
1389; MIPS32R2-NEXT:    beqz $3, $BB5_1
1390; MIPS32R2-NEXT:    nop
1391; MIPS32R2-NEXT:  # %bb.2: # %entry
1392; MIPS32R2-NEXT:    jr $ra
1393; MIPS32R2-NEXT:    nop
1394;
1395; MIPS32R6-LABEL: AtomicLoadNand32:
1396; MIPS32R6:       # %bb.0: # %entry
1397; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1398; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1399; MIPS32R6-NEXT:    addu $1, $2, $25
1400; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1401; MIPS32R6-NEXT:  $BB5_1: # %entry
1402; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1403; MIPS32R6-NEXT:    ll $2, 0($1)
1404; MIPS32R6-NEXT:    and $3, $2, $4
1405; MIPS32R6-NEXT:    nor $3, $zero, $3
1406; MIPS32R6-NEXT:    sc $3, 0($1)
1407; MIPS32R6-NEXT:    beqzc $3, $BB5_1
1408; MIPS32R6-NEXT:    nop
1409; MIPS32R6-NEXT:  # %bb.2: # %entry
1410; MIPS32R6-NEXT:    jrc $ra
1411;
1412; MIPS32R6O0-LABEL: AtomicLoadNand32:
1413; MIPS32R6O0:       # %bb.0: # %entry
1414; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1415; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1416; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
1417; MIPS32R6O0-NEXT:    addu $2, $2, $25
1418; MIPS32R6O0-NEXT:    move $25, $4
1419; MIPS32R6O0-NEXT:    lw $2, %got(x)($2)
1420; MIPS32R6O0-NEXT:  $BB5_1: # %entry
1421; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1422; MIPS32R6O0-NEXT:    ll $1, 0($2)
1423; MIPS32R6O0-NEXT:    and $3, $1, $4
1424; MIPS32R6O0-NEXT:    nor $3, $zero, $3
1425; MIPS32R6O0-NEXT:    sc $3, 0($2)
1426; MIPS32R6O0-NEXT:    beqzc $3, $BB5_1
1427; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1428; MIPS32R6O0-NEXT:    move $2, $1
1429; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
1430; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
1431; MIPS32R6O0-NEXT:    jrc $ra
1432;
1433; MIPS4-LABEL: AtomicLoadNand32:
1434; MIPS4:       # %bb.0: # %entry
1435; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1436; MIPS4-NEXT:    daddu $1, $1, $25
1437; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1438; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1439; MIPS4-NEXT:  .LBB5_1: # %entry
1440; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1441; MIPS4-NEXT:    ll $2, 0($1)
1442; MIPS4-NEXT:    and $3, $2, $4
1443; MIPS4-NEXT:    nor $3, $zero, $3
1444; MIPS4-NEXT:    sc $3, 0($1)
1445; MIPS4-NEXT:    beqz $3, .LBB5_1
1446; MIPS4-NEXT:    nop
1447; MIPS4-NEXT:  # %bb.2: # %entry
1448; MIPS4-NEXT:    jr $ra
1449; MIPS4-NEXT:    nop
1450;
1451; MIPS64-LABEL: AtomicLoadNand32:
1452; MIPS64:       # %bb.0: # %entry
1453; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1454; MIPS64-NEXT:    daddu $1, $1, $25
1455; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1456; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1457; MIPS64-NEXT:  .LBB5_1: # %entry
1458; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1459; MIPS64-NEXT:    ll $2, 0($1)
1460; MIPS64-NEXT:    and $3, $2, $4
1461; MIPS64-NEXT:    nor $3, $zero, $3
1462; MIPS64-NEXT:    sc $3, 0($1)
1463; MIPS64-NEXT:    beqz $3, .LBB5_1
1464; MIPS64-NEXT:    nop
1465; MIPS64-NEXT:  # %bb.2: # %entry
1466; MIPS64-NEXT:    jr $ra
1467; MIPS64-NEXT:    nop
1468;
1469; MIPS64R2-LABEL: AtomicLoadNand32:
1470; MIPS64R2:       # %bb.0: # %entry
1471; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1472; MIPS64R2-NEXT:    daddu $1, $1, $25
1473; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1474; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1475; MIPS64R2-NEXT:  .LBB5_1: # %entry
1476; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1477; MIPS64R2-NEXT:    ll $2, 0($1)
1478; MIPS64R2-NEXT:    and $3, $2, $4
1479; MIPS64R2-NEXT:    nor $3, $zero, $3
1480; MIPS64R2-NEXT:    sc $3, 0($1)
1481; MIPS64R2-NEXT:    beqz $3, .LBB5_1
1482; MIPS64R2-NEXT:    nop
1483; MIPS64R2-NEXT:  # %bb.2: # %entry
1484; MIPS64R2-NEXT:    jr $ra
1485; MIPS64R2-NEXT:    nop
1486;
1487; MIPS64R6-LABEL: AtomicLoadNand32:
1488; MIPS64R6:       # %bb.0: # %entry
1489; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1490; MIPS64R6-NEXT:    daddu $1, $1, $25
1491; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1492; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1493; MIPS64R6-NEXT:  .LBB5_1: # %entry
1494; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1495; MIPS64R6-NEXT:    ll $2, 0($1)
1496; MIPS64R6-NEXT:    and $3, $2, $4
1497; MIPS64R6-NEXT:    nor $3, $zero, $3
1498; MIPS64R6-NEXT:    sc $3, 0($1)
1499; MIPS64R6-NEXT:    beqzc $3, .LBB5_1
1500; MIPS64R6-NEXT:    nop
1501; MIPS64R6-NEXT:  # %bb.2: # %entry
1502; MIPS64R6-NEXT:    jrc $ra
1503;
1504; MIPS64R6O0-LABEL: AtomicLoadNand32:
1505; MIPS64R6O0:       # %bb.0: # %entry
1506; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1507; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1508; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1509; MIPS64R6O0-NEXT:    move $2, $4
1510; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
1511; MIPS64R6O0-NEXT:  .LBB5_1: # %entry
1512; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1513; MIPS64R6O0-NEXT:    ll $3, 0($1)
1514; MIPS64R6O0-NEXT:    and $5, $3, $2
1515; MIPS64R6O0-NEXT:    nor $5, $zero, $5
1516; MIPS64R6O0-NEXT:    sc $5, 0($1)
1517; MIPS64R6O0-NEXT:    beqzc $5, .LBB5_1
1518; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1519; MIPS64R6O0-NEXT:    move $2, $3
1520; MIPS64R6O0-NEXT:    jrc $ra
1521;
1522; MM32-LABEL: AtomicLoadNand32:
1523; MM32:       # %bb.0: # %entry
1524; MM32-NEXT:    lui $2, %hi(_gp_disp)
1525; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1526; MM32-NEXT:    addu $2, $2, $25
1527; MM32-NEXT:    lw $1, %got(x)($2)
1528; MM32-NEXT:  $BB5_1: # %entry
1529; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1530; MM32-NEXT:    ll $2, 0($1)
1531; MM32-NEXT:    and $3, $2, $4
1532; MM32-NEXT:    nor $3, $zero, $3
1533; MM32-NEXT:    sc $3, 0($1)
1534; MM32-NEXT:    beqzc $3, $BB5_1
1535; MM32-NEXT:  # %bb.2: # %entry
1536; MM32-NEXT:    jrc $ra
1537;
1538; O1-LABEL: AtomicLoadNand32:
1539; O1:       # %bb.0: # %entry
1540; O1-NEXT:    lui $2, %hi(_gp_disp)
1541; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1542; O1-NEXT:    addu $1, $2, $25
1543; O1-NEXT:    lw $1, %got(x)($1)
1544; O1-NEXT:  $BB5_1: # %entry
1545; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1546; O1-NEXT:    ll $2, 0($1)
1547; O1-NEXT:    and $3, $2, $4
1548; O1-NEXT:    nor $3, $zero, $3
1549; O1-NEXT:    sc $3, 0($1)
1550; O1-NEXT:    beqz $3, $BB5_1
1551; O1-NEXT:    nop
1552; O1-NEXT:  # %bb.2: # %entry
1553; O1-NEXT:    jr $ra
1554; O1-NEXT:    nop
1555;
1556; O2-LABEL: AtomicLoadNand32:
1557; O2:       # %bb.0: # %entry
1558; O2-NEXT:    lui $2, %hi(_gp_disp)
1559; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1560; O2-NEXT:    addu $1, $2, $25
1561; O2-NEXT:    lw $1, %got(x)($1)
1562; O2-NEXT:  $BB5_1: # %entry
1563; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1564; O2-NEXT:    ll $2, 0($1)
1565; O2-NEXT:    and $3, $2, $4
1566; O2-NEXT:    nor $3, $zero, $3
1567; O2-NEXT:    sc $3, 0($1)
1568; O2-NEXT:    beqz $3, $BB5_1
1569; O2-NEXT:    nop
1570; O2-NEXT:  # %bb.2: # %entry
1571; O2-NEXT:    jr $ra
1572; O2-NEXT:    nop
1573;
1574; O3-LABEL: AtomicLoadNand32:
1575; O3:       # %bb.0: # %entry
1576; O3-NEXT:    lui $2, %hi(_gp_disp)
1577; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1578; O3-NEXT:    addu $1, $2, $25
1579; O3-NEXT:    lw $1, %got(x)($1)
1580; O3-NEXT:  $BB5_1: # %entry
1581; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1582; O3-NEXT:    ll $2, 0($1)
1583; O3-NEXT:    and $3, $2, $4
1584; O3-NEXT:    nor $3, $zero, $3
1585; O3-NEXT:    sc $3, 0($1)
1586; O3-NEXT:    beqz $3, $BB5_1
1587; O3-NEXT:    nop
1588; O3-NEXT:  # %bb.2: # %entry
1589; O3-NEXT:    jr $ra
1590; O3-NEXT:    nop
1591;
1592; MIPS32EB-LABEL: AtomicLoadNand32:
1593; MIPS32EB:       # %bb.0: # %entry
1594; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1595; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1596; MIPS32EB-NEXT:    addu $1, $2, $25
1597; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1598; MIPS32EB-NEXT:  $BB5_1: # %entry
1599; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1600; MIPS32EB-NEXT:    ll $2, 0($1)
1601; MIPS32EB-NEXT:    and $3, $2, $4
1602; MIPS32EB-NEXT:    nor $3, $zero, $3
1603; MIPS32EB-NEXT:    sc $3, 0($1)
1604; MIPS32EB-NEXT:    beqz $3, $BB5_1
1605; MIPS32EB-NEXT:    nop
1606; MIPS32EB-NEXT:  # %bb.2: # %entry
1607; MIPS32EB-NEXT:    jr $ra
1608; MIPS32EB-NEXT:    nop
1609entry:
1610  %0 = atomicrmw nand i32* @x, i32 %incr monotonic
1611  ret i32 %0
1612
1613}
1614
1615define i32 @AtomicSwap32(i32 signext %newval) nounwind {
1616; MIPS32-LABEL: AtomicSwap32:
1617; MIPS32:       # %bb.0: # %entry
1618; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1619; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1620; MIPS32-NEXT:    addiu $sp, $sp, -8
1621; MIPS32-NEXT:    addu $1, $2, $25
1622; MIPS32-NEXT:    sw $4, 4($sp)
1623; MIPS32-NEXT:    lw $1, %got(x)($1)
1624; MIPS32-NEXT:  $BB6_1: # %entry
1625; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1626; MIPS32-NEXT:    ll $2, 0($1)
1627; MIPS32-NEXT:    move $3, $4
1628; MIPS32-NEXT:    sc $3, 0($1)
1629; MIPS32-NEXT:    beqz $3, $BB6_1
1630; MIPS32-NEXT:    nop
1631; MIPS32-NEXT:  # %bb.2: # %entry
1632; MIPS32-NEXT:    jr $ra
1633; MIPS32-NEXT:    addiu $sp, $sp, 8
1634;
1635; MIPS32O0-LABEL: AtomicSwap32:
1636; MIPS32O0:       # %bb.0: # %entry
1637; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1638; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1639; MIPS32O0-NEXT:    addiu $sp, $sp, -8
1640; MIPS32O0-NEXT:    addu $2, $2, $25
1641; MIPS32O0-NEXT:    sw $4, 4($sp)
1642; MIPS32O0-NEXT:    lw $4, 4($sp)
1643; MIPS32O0-NEXT:    lw $2, %got(x)($2)
1644; MIPS32O0-NEXT:  $BB6_1: # %entry
1645; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1646; MIPS32O0-NEXT:    ll $25, 0($2)
1647; MIPS32O0-NEXT:    move $1, $4
1648; MIPS32O0-NEXT:    sc $1, 0($2)
1649; MIPS32O0-NEXT:    beqz $1, $BB6_1
1650; MIPS32O0-NEXT:    nop
1651; MIPS32O0-NEXT:  # %bb.2: # %entry
1652; MIPS32O0-NEXT:    move $2, $25
1653; MIPS32O0-NEXT:    addiu $sp, $sp, 8
1654; MIPS32O0-NEXT:    jr $ra
1655; MIPS32O0-NEXT:    nop
1656;
1657; MIPS32R2-LABEL: AtomicSwap32:
1658; MIPS32R2:       # %bb.0: # %entry
1659; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1660; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1661; MIPS32R2-NEXT:    addiu $sp, $sp, -8
1662; MIPS32R2-NEXT:    addu $1, $2, $25
1663; MIPS32R2-NEXT:    sw $4, 4($sp)
1664; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1665; MIPS32R2-NEXT:  $BB6_1: # %entry
1666; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1667; MIPS32R2-NEXT:    ll $2, 0($1)
1668; MIPS32R2-NEXT:    move $3, $4
1669; MIPS32R2-NEXT:    sc $3, 0($1)
1670; MIPS32R2-NEXT:    beqz $3, $BB6_1
1671; MIPS32R2-NEXT:    nop
1672; MIPS32R2-NEXT:  # %bb.2: # %entry
1673; MIPS32R2-NEXT:    jr $ra
1674; MIPS32R2-NEXT:    addiu $sp, $sp, 8
1675;
1676; MIPS32R6-LABEL: AtomicSwap32:
1677; MIPS32R6:       # %bb.0: # %entry
1678; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1679; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1680; MIPS32R6-NEXT:    addiu $sp, $sp, -8
1681; MIPS32R6-NEXT:    addu $1, $2, $25
1682; MIPS32R6-NEXT:    sw $4, 4($sp)
1683; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1684; MIPS32R6-NEXT:  $BB6_1: # %entry
1685; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1686; MIPS32R6-NEXT:    ll $2, 0($1)
1687; MIPS32R6-NEXT:    move $3, $4
1688; MIPS32R6-NEXT:    sc $3, 0($1)
1689; MIPS32R6-NEXT:    beqzc $3, $BB6_1
1690; MIPS32R6-NEXT:    nop
1691; MIPS32R6-NEXT:  # %bb.2: # %entry
1692; MIPS32R6-NEXT:    jr $ra
1693; MIPS32R6-NEXT:    addiu $sp, $sp, 8
1694;
1695; MIPS32R6O0-LABEL: AtomicSwap32:
1696; MIPS32R6O0:       # %bb.0: # %entry
1697; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1698; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1699; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
1700; MIPS32R6O0-NEXT:    addu $2, $2, $25
1701; MIPS32R6O0-NEXT:    move $25, $4
1702; MIPS32R6O0-NEXT:    sw $4, 4($sp)
1703; MIPS32R6O0-NEXT:    lw $4, 4($sp)
1704; MIPS32R6O0-NEXT:    lw $2, %got(x)($2)
1705; MIPS32R6O0-NEXT:  $BB6_1: # %entry
1706; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1707; MIPS32R6O0-NEXT:    ll $1, 0($2)
1708; MIPS32R6O0-NEXT:    move $3, $4
1709; MIPS32R6O0-NEXT:    sc $3, 0($2)
1710; MIPS32R6O0-NEXT:    beqzc $3, $BB6_1
1711; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1712; MIPS32R6O0-NEXT:    move $2, $1
1713; MIPS32R6O0-NEXT:    sw $25, 0($sp) # 4-byte Folded Spill
1714; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
1715; MIPS32R6O0-NEXT:    jrc $ra
1716;
1717; MIPS4-LABEL: AtomicSwap32:
1718; MIPS4:       # %bb.0: # %entry
1719; MIPS4-NEXT:    daddiu $sp, $sp, -16
1720; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1721; MIPS4-NEXT:    daddu $1, $1, $25
1722; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1723; MIPS4-NEXT:    sw $4, 12($sp)
1724; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1725; MIPS4-NEXT:  .LBB6_1: # %entry
1726; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1727; MIPS4-NEXT:    ll $2, 0($1)
1728; MIPS4-NEXT:    move $3, $4
1729; MIPS4-NEXT:    sc $3, 0($1)
1730; MIPS4-NEXT:    beqz $3, .LBB6_1
1731; MIPS4-NEXT:    nop
1732; MIPS4-NEXT:  # %bb.2: # %entry
1733; MIPS4-NEXT:    jr $ra
1734; MIPS4-NEXT:    daddiu $sp, $sp, 16
1735;
1736; MIPS64-LABEL: AtomicSwap32:
1737; MIPS64:       # %bb.0: # %entry
1738; MIPS64-NEXT:    daddiu $sp, $sp, -16
1739; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1740; MIPS64-NEXT:    daddu $1, $1, $25
1741; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1742; MIPS64-NEXT:    sw $4, 12($sp)
1743; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1744; MIPS64-NEXT:  .LBB6_1: # %entry
1745; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1746; MIPS64-NEXT:    ll $2, 0($1)
1747; MIPS64-NEXT:    move $3, $4
1748; MIPS64-NEXT:    sc $3, 0($1)
1749; MIPS64-NEXT:    beqz $3, .LBB6_1
1750; MIPS64-NEXT:    nop
1751; MIPS64-NEXT:  # %bb.2: # %entry
1752; MIPS64-NEXT:    jr $ra
1753; MIPS64-NEXT:    daddiu $sp, $sp, 16
1754;
1755; MIPS64R2-LABEL: AtomicSwap32:
1756; MIPS64R2:       # %bb.0: # %entry
1757; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
1758; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1759; MIPS64R2-NEXT:    daddu $1, $1, $25
1760; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1761; MIPS64R2-NEXT:    sw $4, 12($sp)
1762; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1763; MIPS64R2-NEXT:  .LBB6_1: # %entry
1764; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1765; MIPS64R2-NEXT:    ll $2, 0($1)
1766; MIPS64R2-NEXT:    move $3, $4
1767; MIPS64R2-NEXT:    sc $3, 0($1)
1768; MIPS64R2-NEXT:    beqz $3, .LBB6_1
1769; MIPS64R2-NEXT:    nop
1770; MIPS64R2-NEXT:  # %bb.2: # %entry
1771; MIPS64R2-NEXT:    jr $ra
1772; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
1773;
1774; MIPS64R6-LABEL: AtomicSwap32:
1775; MIPS64R6:       # %bb.0: # %entry
1776; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
1777; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1778; MIPS64R6-NEXT:    daddu $1, $1, $25
1779; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1780; MIPS64R6-NEXT:    sw $4, 12($sp)
1781; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1782; MIPS64R6-NEXT:  .LBB6_1: # %entry
1783; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1784; MIPS64R6-NEXT:    ll $2, 0($1)
1785; MIPS64R6-NEXT:    move $3, $4
1786; MIPS64R6-NEXT:    sc $3, 0($1)
1787; MIPS64R6-NEXT:    beqzc $3, .LBB6_1
1788; MIPS64R6-NEXT:    nop
1789; MIPS64R6-NEXT:  # %bb.2: # %entry
1790; MIPS64R6-NEXT:    jr $ra
1791; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
1792;
1793; MIPS64R6O0-LABEL: AtomicSwap32:
1794; MIPS64R6O0:       # %bb.0: # %entry
1795; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
1796; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1797; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1798; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1799; MIPS64R6O0-NEXT:    move $2, $4
1800; MIPS64R6O0-NEXT:    sw $2, 12($sp)
1801; MIPS64R6O0-NEXT:    lw $2, 12($sp)
1802; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
1803; MIPS64R6O0-NEXT:  .LBB6_1: # %entry
1804; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1805; MIPS64R6O0-NEXT:    ll $3, 0($1)
1806; MIPS64R6O0-NEXT:    move $5, $2
1807; MIPS64R6O0-NEXT:    sc $5, 0($1)
1808; MIPS64R6O0-NEXT:    beqzc $5, .LBB6_1
1809; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1810; MIPS64R6O0-NEXT:    move $2, $3
1811; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
1812; MIPS64R6O0-NEXT:    jrc $ra
1813;
1814; MM32-LABEL: AtomicSwap32:
1815; MM32:       # %bb.0: # %entry
1816; MM32-NEXT:    lui $2, %hi(_gp_disp)
1817; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1818; MM32-NEXT:    addiu $sp, $sp, -8
1819; MM32-NEXT:    addu $2, $2, $25
1820; MM32-NEXT:    sw $4, 4($sp)
1821; MM32-NEXT:    lw $1, %got(x)($2)
1822; MM32-NEXT:  $BB6_1: # %entry
1823; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1824; MM32-NEXT:    ll $2, 0($1)
1825; MM32-NEXT:    move $3, $4
1826; MM32-NEXT:    sc $3, 0($1)
1827; MM32-NEXT:    beqzc $3, $BB6_1
1828; MM32-NEXT:  # %bb.2: # %entry
1829; MM32-NEXT:    addiusp 8
1830; MM32-NEXT:    jrc $ra
1831;
1832; O1-LABEL: AtomicSwap32:
1833; O1:       # %bb.0: # %entry
1834; O1-NEXT:    lui $2, %hi(_gp_disp)
1835; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1836; O1-NEXT:    addiu $sp, $sp, -8
1837; O1-NEXT:    addu $1, $2, $25
1838; O1-NEXT:    sw $4, 4($sp)
1839; O1-NEXT:    lw $1, %got(x)($1)
1840; O1-NEXT:  $BB6_1: # %entry
1841; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1842; O1-NEXT:    ll $2, 0($1)
1843; O1-NEXT:    move $3, $4
1844; O1-NEXT:    sc $3, 0($1)
1845; O1-NEXT:    beqz $3, $BB6_1
1846; O1-NEXT:    nop
1847; O1-NEXT:  # %bb.2: # %entry
1848; O1-NEXT:    jr $ra
1849; O1-NEXT:    addiu $sp, $sp, 8
1850;
1851; O2-LABEL: AtomicSwap32:
1852; O2:       # %bb.0: # %entry
1853; O2-NEXT:    lui $2, %hi(_gp_disp)
1854; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1855; O2-NEXT:    addiu $sp, $sp, -8
1856; O2-NEXT:    addu $1, $2, $25
1857; O2-NEXT:    sw $4, 4($sp)
1858; O2-NEXT:    lw $1, %got(x)($1)
1859; O2-NEXT:  $BB6_1: # %entry
1860; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1861; O2-NEXT:    ll $2, 0($1)
1862; O2-NEXT:    move $3, $4
1863; O2-NEXT:    sc $3, 0($1)
1864; O2-NEXT:    beqz $3, $BB6_1
1865; O2-NEXT:    nop
1866; O2-NEXT:  # %bb.2: # %entry
1867; O2-NEXT:    jr $ra
1868; O2-NEXT:    addiu $sp, $sp, 8
1869;
1870; O3-LABEL: AtomicSwap32:
1871; O3:       # %bb.0: # %entry
1872; O3-NEXT:    lui $2, %hi(_gp_disp)
1873; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1874; O3-NEXT:    addiu $sp, $sp, -8
1875; O3-NEXT:    addu $1, $2, $25
1876; O3-NEXT:    sw $4, 4($sp)
1877; O3-NEXT:    lw $1, %got(x)($1)
1878; O3-NEXT:  $BB6_1: # %entry
1879; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1880; O3-NEXT:    ll $2, 0($1)
1881; O3-NEXT:    move $3, $4
1882; O3-NEXT:    sc $3, 0($1)
1883; O3-NEXT:    beqz $3, $BB6_1
1884; O3-NEXT:    nop
1885; O3-NEXT:  # %bb.2: # %entry
1886; O3-NEXT:    jr $ra
1887; O3-NEXT:    addiu $sp, $sp, 8
1888;
1889; MIPS32EB-LABEL: AtomicSwap32:
1890; MIPS32EB:       # %bb.0: # %entry
1891; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1892; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1893; MIPS32EB-NEXT:    addiu $sp, $sp, -8
1894; MIPS32EB-NEXT:    addu $1, $2, $25
1895; MIPS32EB-NEXT:    sw $4, 4($sp)
1896; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1897; MIPS32EB-NEXT:  $BB6_1: # %entry
1898; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1899; MIPS32EB-NEXT:    ll $2, 0($1)
1900; MIPS32EB-NEXT:    move $3, $4
1901; MIPS32EB-NEXT:    sc $3, 0($1)
1902; MIPS32EB-NEXT:    beqz $3, $BB6_1
1903; MIPS32EB-NEXT:    nop
1904; MIPS32EB-NEXT:  # %bb.2: # %entry
1905; MIPS32EB-NEXT:    jr $ra
1906; MIPS32EB-NEXT:    addiu $sp, $sp, 8
1907entry:
1908  %newval.addr = alloca i32, align 4
1909  store i32 %newval, i32* %newval.addr, align 4
1910  %tmp = load i32, i32* %newval.addr, align 4
1911  %0 = atomicrmw xchg i32* @x, i32 %tmp monotonic
1912  ret i32 %0
1913
1914}
1915
1916define i32 @AtomicCmpSwap32(i32 signext %oldval, i32 signext %newval) nounwind {
1917; MIPS32-LABEL: AtomicCmpSwap32:
1918; MIPS32:       # %bb.0: # %entry
1919; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1920; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1921; MIPS32-NEXT:    addiu $sp, $sp, -8
1922; MIPS32-NEXT:    addu $1, $2, $25
1923; MIPS32-NEXT:    sw $5, 4($sp)
1924; MIPS32-NEXT:    lw $1, %got(x)($1)
1925; MIPS32-NEXT:  $BB7_1: # %entry
1926; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1927; MIPS32-NEXT:    ll $2, 0($1)
1928; MIPS32-NEXT:    bne $2, $4, $BB7_3
1929; MIPS32-NEXT:    nop
1930; MIPS32-NEXT:  # %bb.2: # %entry
1931; MIPS32-NEXT:    # in Loop: Header=BB7_1 Depth=1
1932; MIPS32-NEXT:    move $3, $5
1933; MIPS32-NEXT:    sc $3, 0($1)
1934; MIPS32-NEXT:    beqz $3, $BB7_1
1935; MIPS32-NEXT:    nop
1936; MIPS32-NEXT:  $BB7_3: # %entry
1937; MIPS32-NEXT:    jr $ra
1938; MIPS32-NEXT:    addiu $sp, $sp, 8
1939;
1940; MIPS32O0-LABEL: AtomicCmpSwap32:
1941; MIPS32O0:       # %bb.0: # %entry
1942; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1943; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1944; MIPS32O0-NEXT:    addiu $sp, $sp, -16
1945; MIPS32O0-NEXT:    addu $2, $2, $25
1946; MIPS32O0-NEXT:    sw $5, 12($sp)
1947; MIPS32O0-NEXT:    lw $5, 12($sp)
1948; MIPS32O0-NEXT:    lw $2, %got(x)($2)
1949; MIPS32O0-NEXT:    lw $25, 8($sp) # 4-byte Folded Reload
1950; MIPS32O0-NEXT:    move $1, $4
1951; MIPS32O0-NEXT:  $BB7_1: # %entry
1952; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1953; MIPS32O0-NEXT:    ll $3, 0($2)
1954; MIPS32O0-NEXT:    bne $3, $1, $BB7_3
1955; MIPS32O0-NEXT:    nop
1956; MIPS32O0-NEXT:  # %bb.2: # %entry
1957; MIPS32O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
1958; MIPS32O0-NEXT:    move $6, $5
1959; MIPS32O0-NEXT:    sc $6, 0($2)
1960; MIPS32O0-NEXT:    beqz $6, $BB7_1
1961; MIPS32O0-NEXT:    nop
1962; MIPS32O0-NEXT:  $BB7_3: # %entry
1963; MIPS32O0-NEXT:    xor $1, $3, $4
1964; MIPS32O0-NEXT:    sltiu $1, $1, 1
1965; MIPS32O0-NEXT:    move $2, $3
1966; MIPS32O0-NEXT:    sw $3, 8($sp) # 4-byte Folded Spill
1967; MIPS32O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
1968; MIPS32O0-NEXT:    sw $1, 0($sp) # 4-byte Folded Spill
1969; MIPS32O0-NEXT:    addiu $sp, $sp, 16
1970; MIPS32O0-NEXT:    jr $ra
1971; MIPS32O0-NEXT:    nop
1972;
1973; MIPS32R2-LABEL: AtomicCmpSwap32:
1974; MIPS32R2:       # %bb.0: # %entry
1975; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1976; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1977; MIPS32R2-NEXT:    addiu $sp, $sp, -8
1978; MIPS32R2-NEXT:    addu $1, $2, $25
1979; MIPS32R2-NEXT:    sw $5, 4($sp)
1980; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1981; MIPS32R2-NEXT:  $BB7_1: # %entry
1982; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1983; MIPS32R2-NEXT:    ll $2, 0($1)
1984; MIPS32R2-NEXT:    bne $2, $4, $BB7_3
1985; MIPS32R2-NEXT:    nop
1986; MIPS32R2-NEXT:  # %bb.2: # %entry
1987; MIPS32R2-NEXT:    # in Loop: Header=BB7_1 Depth=1
1988; MIPS32R2-NEXT:    move $3, $5
1989; MIPS32R2-NEXT:    sc $3, 0($1)
1990; MIPS32R2-NEXT:    beqz $3, $BB7_1
1991; MIPS32R2-NEXT:    nop
1992; MIPS32R2-NEXT:  $BB7_3: # %entry
1993; MIPS32R2-NEXT:    jr $ra
1994; MIPS32R2-NEXT:    addiu $sp, $sp, 8
1995;
1996; MIPS32R6-LABEL: AtomicCmpSwap32:
1997; MIPS32R6:       # %bb.0: # %entry
1998; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1999; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
2000; MIPS32R6-NEXT:    addiu $sp, $sp, -8
2001; MIPS32R6-NEXT:    addu $1, $2, $25
2002; MIPS32R6-NEXT:    sw $5, 4($sp)
2003; MIPS32R6-NEXT:    lw $1, %got(x)($1)
2004; MIPS32R6-NEXT:  $BB7_1: # %entry
2005; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
2006; MIPS32R6-NEXT:    ll $2, 0($1)
2007; MIPS32R6-NEXT:    bnec $2, $4, $BB7_3
2008; MIPS32R6-NEXT:  # %bb.2: # %entry
2009; MIPS32R6-NEXT:    # in Loop: Header=BB7_1 Depth=1
2010; MIPS32R6-NEXT:    move $3, $5
2011; MIPS32R6-NEXT:    sc $3, 0($1)
2012; MIPS32R6-NEXT:    beqzc $3, $BB7_1
2013; MIPS32R6-NEXT:    nop
2014; MIPS32R6-NEXT:  $BB7_3: # %entry
2015; MIPS32R6-NEXT:    jr $ra
2016; MIPS32R6-NEXT:    addiu $sp, $sp, 8
2017;
2018; MIPS32R6O0-LABEL: AtomicCmpSwap32:
2019; MIPS32R6O0:       # %bb.0: # %entry
2020; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
2021; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2022; MIPS32R6O0-NEXT:    addiu $sp, $sp, -24
2023; MIPS32R6O0-NEXT:    addu $2, $2, $25
2024; MIPS32R6O0-NEXT:    move $25, $5
2025; MIPS32R6O0-NEXT:    move $1, $4
2026; MIPS32R6O0-NEXT:    sw $5, 20($sp)
2027; MIPS32R6O0-NEXT:    lw $5, 20($sp)
2028; MIPS32R6O0-NEXT:    lw $2, %got(x)($2)
2029; MIPS32R6O0-NEXT:    lw $3, 16($sp) # 4-byte Folded Reload
2030; MIPS32R6O0-NEXT:  $BB7_1: # %entry
2031; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2032; MIPS32R6O0-NEXT:    ll $6, 0($2)
2033; MIPS32R6O0-NEXT:    bnec $6, $4, $BB7_3
2034; MIPS32R6O0-NEXT:  # %bb.2: # %entry
2035; MIPS32R6O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
2036; MIPS32R6O0-NEXT:    move $7, $5
2037; MIPS32R6O0-NEXT:    sc $7, 0($2)
2038; MIPS32R6O0-NEXT:    beqzc $7, $BB7_1
2039; MIPS32R6O0-NEXT:  $BB7_3: # %entry
2040; MIPS32R6O0-NEXT:    move $2, $6
2041; MIPS32R6O0-NEXT:    sw $6, 16($sp) # 4-byte Folded Spill
2042; MIPS32R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
2043; MIPS32R6O0-NEXT:    sw $3, 8($sp) # 4-byte Folded Spill
2044; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
2045; MIPS32R6O0-NEXT:    addiu $sp, $sp, 24
2046; MIPS32R6O0-NEXT:    jrc $ra
2047;
2048; MIPS4-LABEL: AtomicCmpSwap32:
2049; MIPS4:       # %bb.0: # %entry
2050; MIPS4-NEXT:    daddiu $sp, $sp, -16
2051; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2052; MIPS4-NEXT:    daddu $1, $1, $25
2053; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2054; MIPS4-NEXT:    sw $5, 12($sp)
2055; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
2056; MIPS4-NEXT:  .LBB7_1: # %entry
2057; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2058; MIPS4-NEXT:    ll $2, 0($1)
2059; MIPS4-NEXT:    bne $2, $4, .LBB7_3
2060; MIPS4-NEXT:    nop
2061; MIPS4-NEXT:  # %bb.2: # %entry
2062; MIPS4-NEXT:    # in Loop: Header=BB7_1 Depth=1
2063; MIPS4-NEXT:    move $3, $5
2064; MIPS4-NEXT:    sc $3, 0($1)
2065; MIPS4-NEXT:    beqz $3, .LBB7_1
2066; MIPS4-NEXT:    nop
2067; MIPS4-NEXT:  .LBB7_3: # %entry
2068; MIPS4-NEXT:    jr $ra
2069; MIPS4-NEXT:    daddiu $sp, $sp, 16
2070;
2071; MIPS64-LABEL: AtomicCmpSwap32:
2072; MIPS64:       # %bb.0: # %entry
2073; MIPS64-NEXT:    daddiu $sp, $sp, -16
2074; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2075; MIPS64-NEXT:    daddu $1, $1, $25
2076; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2077; MIPS64-NEXT:    sw $5, 12($sp)
2078; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
2079; MIPS64-NEXT:  .LBB7_1: # %entry
2080; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2081; MIPS64-NEXT:    ll $2, 0($1)
2082; MIPS64-NEXT:    bne $2, $4, .LBB7_3
2083; MIPS64-NEXT:    nop
2084; MIPS64-NEXT:  # %bb.2: # %entry
2085; MIPS64-NEXT:    # in Loop: Header=BB7_1 Depth=1
2086; MIPS64-NEXT:    move $3, $5
2087; MIPS64-NEXT:    sc $3, 0($1)
2088; MIPS64-NEXT:    beqz $3, .LBB7_1
2089; MIPS64-NEXT:    nop
2090; MIPS64-NEXT:  .LBB7_3: # %entry
2091; MIPS64-NEXT:    jr $ra
2092; MIPS64-NEXT:    daddiu $sp, $sp, 16
2093;
2094; MIPS64R2-LABEL: AtomicCmpSwap32:
2095; MIPS64R2:       # %bb.0: # %entry
2096; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
2097; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2098; MIPS64R2-NEXT:    daddu $1, $1, $25
2099; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2100; MIPS64R2-NEXT:    sw $5, 12($sp)
2101; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
2102; MIPS64R2-NEXT:  .LBB7_1: # %entry
2103; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
2104; MIPS64R2-NEXT:    ll $2, 0($1)
2105; MIPS64R2-NEXT:    bne $2, $4, .LBB7_3
2106; MIPS64R2-NEXT:    nop
2107; MIPS64R2-NEXT:  # %bb.2: # %entry
2108; MIPS64R2-NEXT:    # in Loop: Header=BB7_1 Depth=1
2109; MIPS64R2-NEXT:    move $3, $5
2110; MIPS64R2-NEXT:    sc $3, 0($1)
2111; MIPS64R2-NEXT:    beqz $3, .LBB7_1
2112; MIPS64R2-NEXT:    nop
2113; MIPS64R2-NEXT:  .LBB7_3: # %entry
2114; MIPS64R2-NEXT:    jr $ra
2115; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
2116;
2117; MIPS64R6-LABEL: AtomicCmpSwap32:
2118; MIPS64R6:       # %bb.0: # %entry
2119; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
2120; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2121; MIPS64R6-NEXT:    daddu $1, $1, $25
2122; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2123; MIPS64R6-NEXT:    sw $5, 12($sp)
2124; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
2125; MIPS64R6-NEXT:  .LBB7_1: # %entry
2126; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
2127; MIPS64R6-NEXT:    ll $2, 0($1)
2128; MIPS64R6-NEXT:    bnec $2, $4, .LBB7_3
2129; MIPS64R6-NEXT:  # %bb.2: # %entry
2130; MIPS64R6-NEXT:    # in Loop: Header=BB7_1 Depth=1
2131; MIPS64R6-NEXT:    move $3, $5
2132; MIPS64R6-NEXT:    sc $3, 0($1)
2133; MIPS64R6-NEXT:    beqzc $3, .LBB7_1
2134; MIPS64R6-NEXT:    nop
2135; MIPS64R6-NEXT:  .LBB7_3: # %entry
2136; MIPS64R6-NEXT:    jr $ra
2137; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
2138;
2139; MIPS64R6O0-LABEL: AtomicCmpSwap32:
2140; MIPS64R6O0:       # %bb.0: # %entry
2141; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
2142; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2143; MIPS64R6O0-NEXT:    daddu $1, $1, $25
2144; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2145; MIPS64R6O0-NEXT:    move $2, $4
2146; MIPS64R6O0-NEXT:    move $3, $5
2147; MIPS64R6O0-NEXT:    sw $3, 12($sp)
2148; MIPS64R6O0-NEXT:    lw $3, 12($sp)
2149; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
2150; MIPS64R6O0-NEXT:    lw $6, 8($sp) # 4-byte Folded Reload
2151; MIPS64R6O0-NEXT:  .LBB7_1: # %entry
2152; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2153; MIPS64R6O0-NEXT:    ll $7, 0($1)
2154; MIPS64R6O0-NEXT:    bnec $7, $2, .LBB7_3
2155; MIPS64R6O0-NEXT:  # %bb.2: # %entry
2156; MIPS64R6O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
2157; MIPS64R6O0-NEXT:    move $8, $3
2158; MIPS64R6O0-NEXT:    sc $8, 0($1)
2159; MIPS64R6O0-NEXT:    beqzc $8, .LBB7_1
2160; MIPS64R6O0-NEXT:  .LBB7_3: # %entry
2161; MIPS64R6O0-NEXT:    move $2, $7
2162; MIPS64R6O0-NEXT:    sw $7, 8($sp) # 4-byte Folded Spill
2163; MIPS64R6O0-NEXT:    sw $6, 4($sp) # 4-byte Folded Spill
2164; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
2165; MIPS64R6O0-NEXT:    jrc $ra
2166;
2167; MM32-LABEL: AtomicCmpSwap32:
2168; MM32:       # %bb.0: # %entry
2169; MM32-NEXT:    lui $2, %hi(_gp_disp)
2170; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2171; MM32-NEXT:    addiu $sp, $sp, -8
2172; MM32-NEXT:    addu $2, $2, $25
2173; MM32-NEXT:    sw $5, 4($sp)
2174; MM32-NEXT:    lw $1, %got(x)($2)
2175; MM32-NEXT:  $BB7_1: # %entry
2176; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
2177; MM32-NEXT:    ll $2, 0($1)
2178; MM32-NEXT:    bne $2, $4, $BB7_3
2179; MM32-NEXT:    nop
2180; MM32-NEXT:  # %bb.2: # %entry
2181; MM32-NEXT:    # in Loop: Header=BB7_1 Depth=1
2182; MM32-NEXT:    move $3, $5
2183; MM32-NEXT:    sc $3, 0($1)
2184; MM32-NEXT:    beqzc $3, $BB7_1
2185; MM32-NEXT:  $BB7_3: # %entry
2186; MM32-NEXT:    addiusp 8
2187; MM32-NEXT:    jrc $ra
2188;
2189; O1-LABEL: AtomicCmpSwap32:
2190; O1:       # %bb.0: # %entry
2191; O1-NEXT:    lui $2, %hi(_gp_disp)
2192; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
2193; O1-NEXT:    addiu $sp, $sp, -8
2194; O1-NEXT:    addu $1, $2, $25
2195; O1-NEXT:    sw $5, 4($sp)
2196; O1-NEXT:    lw $1, %got(x)($1)
2197; O1-NEXT:  $BB7_1: # %entry
2198; O1-NEXT:    # =>This Inner Loop Header: Depth=1
2199; O1-NEXT:    ll $2, 0($1)
2200; O1-NEXT:    bne $2, $4, $BB7_3
2201; O1-NEXT:    nop
2202; O1-NEXT:  # %bb.2: # %entry
2203; O1-NEXT:    # in Loop: Header=BB7_1 Depth=1
2204; O1-NEXT:    move $3, $5
2205; O1-NEXT:    sc $3, 0($1)
2206; O1-NEXT:    beqz $3, $BB7_1
2207; O1-NEXT:    nop
2208; O1-NEXT:  $BB7_3: # %entry
2209; O1-NEXT:    jr $ra
2210; O1-NEXT:    addiu $sp, $sp, 8
2211;
2212; O2-LABEL: AtomicCmpSwap32:
2213; O2:       # %bb.0: # %entry
2214; O2-NEXT:    lui $2, %hi(_gp_disp)
2215; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2216; O2-NEXT:    addiu $sp, $sp, -8
2217; O2-NEXT:    addu $1, $2, $25
2218; O2-NEXT:    sw $5, 4($sp)
2219; O2-NEXT:    lw $1, %got(x)($1)
2220; O2-NEXT:  $BB7_1: # %entry
2221; O2-NEXT:    # =>This Inner Loop Header: Depth=1
2222; O2-NEXT:    ll $2, 0($1)
2223; O2-NEXT:    bne $2, $4, $BB7_3
2224; O2-NEXT:    nop
2225; O2-NEXT:  # %bb.2: # %entry
2226; O2-NEXT:    # in Loop: Header=BB7_1 Depth=1
2227; O2-NEXT:    move $3, $5
2228; O2-NEXT:    sc $3, 0($1)
2229; O2-NEXT:    beqz $3, $BB7_1
2230; O2-NEXT:    nop
2231; O2-NEXT:  $BB7_3: # %entry
2232; O2-NEXT:    jr $ra
2233; O2-NEXT:    addiu $sp, $sp, 8
2234;
2235; O3-LABEL: AtomicCmpSwap32:
2236; O3:       # %bb.0: # %entry
2237; O3-NEXT:    lui $2, %hi(_gp_disp)
2238; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
2239; O3-NEXT:    addiu $sp, $sp, -8
2240; O3-NEXT:    addu $1, $2, $25
2241; O3-NEXT:    sw $5, 4($sp)
2242; O3-NEXT:    lw $1, %got(x)($1)
2243; O3-NEXT:  $BB7_1: # %entry
2244; O3-NEXT:    # =>This Inner Loop Header: Depth=1
2245; O3-NEXT:    ll $2, 0($1)
2246; O3-NEXT:    bne $2, $4, $BB7_3
2247; O3-NEXT:    nop
2248; O3-NEXT:  # %bb.2: # %entry
2249; O3-NEXT:    # in Loop: Header=BB7_1 Depth=1
2250; O3-NEXT:    move $3, $5
2251; O3-NEXT:    sc $3, 0($1)
2252; O3-NEXT:    beqz $3, $BB7_1
2253; O3-NEXT:    nop
2254; O3-NEXT:  $BB7_3: # %entry
2255; O3-NEXT:    jr $ra
2256; O3-NEXT:    addiu $sp, $sp, 8
2257;
2258; MIPS32EB-LABEL: AtomicCmpSwap32:
2259; MIPS32EB:       # %bb.0: # %entry
2260; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
2261; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
2262; MIPS32EB-NEXT:    addiu $sp, $sp, -8
2263; MIPS32EB-NEXT:    addu $1, $2, $25
2264; MIPS32EB-NEXT:    sw $5, 4($sp)
2265; MIPS32EB-NEXT:    lw $1, %got(x)($1)
2266; MIPS32EB-NEXT:  $BB7_1: # %entry
2267; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
2268; MIPS32EB-NEXT:    ll $2, 0($1)
2269; MIPS32EB-NEXT:    bne $2, $4, $BB7_3
2270; MIPS32EB-NEXT:    nop
2271; MIPS32EB-NEXT:  # %bb.2: # %entry
2272; MIPS32EB-NEXT:    # in Loop: Header=BB7_1 Depth=1
2273; MIPS32EB-NEXT:    move $3, $5
2274; MIPS32EB-NEXT:    sc $3, 0($1)
2275; MIPS32EB-NEXT:    beqz $3, $BB7_1
2276; MIPS32EB-NEXT:    nop
2277; MIPS32EB-NEXT:  $BB7_3: # %entry
2278; MIPS32EB-NEXT:    jr $ra
2279; MIPS32EB-NEXT:    addiu $sp, $sp, 8
2280entry:
2281  %newval.addr = alloca i32, align 4
2282  store i32 %newval, i32* %newval.addr, align 4
2283  %tmp = load i32, i32* %newval.addr, align 4
2284  %0 = cmpxchg i32* @x, i32 %oldval, i32 %tmp monotonic monotonic
2285  %1 = extractvalue { i32, i1 } %0, 0
2286  ret i32 %1
2287
2288}
2289
2290@y = common global i8 0, align 1
2291
2292define signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind {
2293; MIPS32-LABEL: AtomicLoadAdd8:
2294; MIPS32:       # %bb.0: # %entry
2295; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
2296; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2297; MIPS32-NEXT:    addu $1, $2, $25
2298; MIPS32-NEXT:    lw $1, %got(y)($1)
2299; MIPS32-NEXT:    addiu $2, $zero, -4
2300; MIPS32-NEXT:    and $2, $1, $2
2301; MIPS32-NEXT:    andi $1, $1, 3
2302; MIPS32-NEXT:    sll $3, $1, 3
2303; MIPS32-NEXT:    ori $1, $zero, 255
2304; MIPS32-NEXT:    sllv $5, $1, $3
2305; MIPS32-NEXT:    nor $6, $zero, $5
2306; MIPS32-NEXT:    sllv $4, $4, $3
2307; MIPS32-NEXT:  $BB8_1: # %entry
2308; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
2309; MIPS32-NEXT:    ll $7, 0($2)
2310; MIPS32-NEXT:    addu $8, $7, $4
2311; MIPS32-NEXT:    and $8, $8, $5
2312; MIPS32-NEXT:    and $9, $7, $6
2313; MIPS32-NEXT:    or $9, $9, $8
2314; MIPS32-NEXT:    sc $9, 0($2)
2315; MIPS32-NEXT:    beqz $9, $BB8_1
2316; MIPS32-NEXT:    nop
2317; MIPS32-NEXT:  # %bb.2: # %entry
2318; MIPS32-NEXT:    and $1, $7, $5
2319; MIPS32-NEXT:    srlv $1, $1, $3
2320; MIPS32-NEXT:    sll $1, $1, 24
2321; MIPS32-NEXT:    sra $1, $1, 24
2322; MIPS32-NEXT:  # %bb.3: # %entry
2323; MIPS32-NEXT:    sll $1, $1, 24
2324; MIPS32-NEXT:    jr $ra
2325; MIPS32-NEXT:    sra $2, $1, 24
2326;
2327; MIPS32O0-LABEL: AtomicLoadAdd8:
2328; MIPS32O0:       # %bb.0: # %entry
2329; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
2330; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2331; MIPS32O0-NEXT:    addiu $sp, $sp, -8
2332; MIPS32O0-NEXT:    addu $2, $2, $25
2333; MIPS32O0-NEXT:    lw $2, %got(y)($2)
2334; MIPS32O0-NEXT:    addiu $25, $zero, -4
2335; MIPS32O0-NEXT:    and $25, $2, $25
2336; MIPS32O0-NEXT:    andi $2, $2, 3
2337; MIPS32O0-NEXT:    sll $2, $2, 3
2338; MIPS32O0-NEXT:    ori $1, $zero, 255
2339; MIPS32O0-NEXT:    sllv $1, $1, $2
2340; MIPS32O0-NEXT:    nor $3, $zero, $1
2341; MIPS32O0-NEXT:    sllv $4, $4, $2
2342; MIPS32O0-NEXT:  $BB8_1: # %entry
2343; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
2344; MIPS32O0-NEXT:    ll $6, 0($25)
2345; MIPS32O0-NEXT:    addu $7, $6, $4
2346; MIPS32O0-NEXT:    and $7, $7, $1
2347; MIPS32O0-NEXT:    and $8, $6, $3
2348; MIPS32O0-NEXT:    or $8, $8, $7
2349; MIPS32O0-NEXT:    sc $8, 0($25)
2350; MIPS32O0-NEXT:    beqz $8, $BB8_1
2351; MIPS32O0-NEXT:    nop
2352; MIPS32O0-NEXT:  # %bb.2: # %entry
2353; MIPS32O0-NEXT:    and $5, $6, $1
2354; MIPS32O0-NEXT:    srlv $5, $5, $2
2355; MIPS32O0-NEXT:    sll $5, $5, 24
2356; MIPS32O0-NEXT:    sra $5, $5, 24
2357; MIPS32O0-NEXT:  # %bb.3: # %entry
2358; MIPS32O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
2359; MIPS32O0-NEXT:  # %bb.4: # %entry
2360; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2361; MIPS32O0-NEXT:    sll $2, $1, 24
2362; MIPS32O0-NEXT:    sra $2, $2, 24
2363; MIPS32O0-NEXT:    addiu $sp, $sp, 8
2364; MIPS32O0-NEXT:    jr $ra
2365; MIPS32O0-NEXT:    nop
2366;
2367; MIPS32R2-LABEL: AtomicLoadAdd8:
2368; MIPS32R2:       # %bb.0: # %entry
2369; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
2370; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2371; MIPS32R2-NEXT:    addu $1, $2, $25
2372; MIPS32R2-NEXT:    lw $1, %got(y)($1)
2373; MIPS32R2-NEXT:    addiu $2, $zero, -4
2374; MIPS32R2-NEXT:    and $2, $1, $2
2375; MIPS32R2-NEXT:    andi $1, $1, 3
2376; MIPS32R2-NEXT:    sll $3, $1, 3
2377; MIPS32R2-NEXT:    ori $1, $zero, 255
2378; MIPS32R2-NEXT:    sllv $5, $1, $3
2379; MIPS32R2-NEXT:    nor $6, $zero, $5
2380; MIPS32R2-NEXT:    sllv $4, $4, $3
2381; MIPS32R2-NEXT:  $BB8_1: # %entry
2382; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
2383; MIPS32R2-NEXT:    ll $7, 0($2)
2384; MIPS32R2-NEXT:    addu $8, $7, $4
2385; MIPS32R2-NEXT:    and $8, $8, $5
2386; MIPS32R2-NEXT:    and $9, $7, $6
2387; MIPS32R2-NEXT:    or $9, $9, $8
2388; MIPS32R2-NEXT:    sc $9, 0($2)
2389; MIPS32R2-NEXT:    beqz $9, $BB8_1
2390; MIPS32R2-NEXT:    nop
2391; MIPS32R2-NEXT:  # %bb.2: # %entry
2392; MIPS32R2-NEXT:    and $1, $7, $5
2393; MIPS32R2-NEXT:    srlv $1, $1, $3
2394; MIPS32R2-NEXT:    seb $1, $1
2395; MIPS32R2-NEXT:  # %bb.3: # %entry
2396; MIPS32R2-NEXT:    jr $ra
2397; MIPS32R2-NEXT:    seb $2, $1
2398;
2399; MIPS32R6-LABEL: AtomicLoadAdd8:
2400; MIPS32R6:       # %bb.0: # %entry
2401; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
2402; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
2403; MIPS32R6-NEXT:    addu $1, $2, $25
2404; MIPS32R6-NEXT:    lw $1, %got(y)($1)
2405; MIPS32R6-NEXT:    addiu $2, $zero, -4
2406; MIPS32R6-NEXT:    and $2, $1, $2
2407; MIPS32R6-NEXT:    andi $1, $1, 3
2408; MIPS32R6-NEXT:    sll $3, $1, 3
2409; MIPS32R6-NEXT:    ori $1, $zero, 255
2410; MIPS32R6-NEXT:    sllv $5, $1, $3
2411; MIPS32R6-NEXT:    nor $6, $zero, $5
2412; MIPS32R6-NEXT:    sllv $4, $4, $3
2413; MIPS32R6-NEXT:  $BB8_1: # %entry
2414; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
2415; MIPS32R6-NEXT:    ll $7, 0($2)
2416; MIPS32R6-NEXT:    addu $8, $7, $4
2417; MIPS32R6-NEXT:    and $8, $8, $5
2418; MIPS32R6-NEXT:    and $9, $7, $6
2419; MIPS32R6-NEXT:    or $9, $9, $8
2420; MIPS32R6-NEXT:    sc $9, 0($2)
2421; MIPS32R6-NEXT:    beqzc $9, $BB8_1
2422; MIPS32R6-NEXT:  # %bb.2: # %entry
2423; MIPS32R6-NEXT:    and $1, $7, $5
2424; MIPS32R6-NEXT:    srlv $1, $1, $3
2425; MIPS32R6-NEXT:    seb $1, $1
2426; MIPS32R6-NEXT:  # %bb.3: # %entry
2427; MIPS32R6-NEXT:    jr $ra
2428; MIPS32R6-NEXT:    seb $2, $1
2429;
2430; MIPS32R6O0-LABEL: AtomicLoadAdd8:
2431; MIPS32R6O0:       # %bb.0: # %entry
2432; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
2433; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2434; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
2435; MIPS32R6O0-NEXT:    addu $2, $2, $25
2436; MIPS32R6O0-NEXT:    move $25, $4
2437; MIPS32R6O0-NEXT:    lw $2, %got(y)($2)
2438; MIPS32R6O0-NEXT:    addiu $1, $zero, -4
2439; MIPS32R6O0-NEXT:    and $1, $2, $1
2440; MIPS32R6O0-NEXT:    andi $2, $2, 3
2441; MIPS32R6O0-NEXT:    sll $2, $2, 3
2442; MIPS32R6O0-NEXT:    ori $3, $zero, 255
2443; MIPS32R6O0-NEXT:    sllv $3, $3, $2
2444; MIPS32R6O0-NEXT:    nor $5, $zero, $3
2445; MIPS32R6O0-NEXT:    sllv $4, $4, $2
2446; MIPS32R6O0-NEXT:  $BB8_1: # %entry
2447; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2448; MIPS32R6O0-NEXT:    ll $7, 0($1)
2449; MIPS32R6O0-NEXT:    addu $8, $7, $4
2450; MIPS32R6O0-NEXT:    and $8, $8, $3
2451; MIPS32R6O0-NEXT:    and $9, $7, $5
2452; MIPS32R6O0-NEXT:    or $9, $9, $8
2453; MIPS32R6O0-NEXT:    sc $9, 0($1)
2454; MIPS32R6O0-NEXT:    beqzc $9, $BB8_1
2455; MIPS32R6O0-NEXT:  # %bb.2: # %entry
2456; MIPS32R6O0-NEXT:    and $6, $7, $3
2457; MIPS32R6O0-NEXT:    srlv $6, $6, $2
2458; MIPS32R6O0-NEXT:    seb $6, $6
2459; MIPS32R6O0-NEXT:  # %bb.3: # %entry
2460; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
2461; MIPS32R6O0-NEXT:    sw $6, 0($sp) # 4-byte Folded Spill
2462; MIPS32R6O0-NEXT:  # %bb.4: # %entry
2463; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
2464; MIPS32R6O0-NEXT:    seb $2, $1
2465; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
2466; MIPS32R6O0-NEXT:    jrc $ra
2467;
2468; MIPS4-LABEL: AtomicLoadAdd8:
2469; MIPS4:       # %bb.0: # %entry
2470; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2471; MIPS4-NEXT:    daddu $1, $1, $25
2472; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2473; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
2474; MIPS4-NEXT:    daddiu $2, $zero, -4
2475; MIPS4-NEXT:    and $2, $1, $2
2476; MIPS4-NEXT:    andi $1, $1, 3
2477; MIPS4-NEXT:    sll $3, $1, 3
2478; MIPS4-NEXT:    ori $1, $zero, 255
2479; MIPS4-NEXT:    sllv $5, $1, $3
2480; MIPS4-NEXT:    nor $6, $zero, $5
2481; MIPS4-NEXT:    sllv $4, $4, $3
2482; MIPS4-NEXT:  .LBB8_1: # %entry
2483; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2484; MIPS4-NEXT:    ll $7, 0($2)
2485; MIPS4-NEXT:    addu $8, $7, $4
2486; MIPS4-NEXT:    and $8, $8, $5
2487; MIPS4-NEXT:    and $9, $7, $6
2488; MIPS4-NEXT:    or $9, $9, $8
2489; MIPS4-NEXT:    sc $9, 0($2)
2490; MIPS4-NEXT:    beqz $9, .LBB8_1
2491; MIPS4-NEXT:    nop
2492; MIPS4-NEXT:  # %bb.2: # %entry
2493; MIPS4-NEXT:    and $1, $7, $5
2494; MIPS4-NEXT:    srlv $1, $1, $3
2495; MIPS4-NEXT:    sll $1, $1, 24
2496; MIPS4-NEXT:    sra $1, $1, 24
2497; MIPS4-NEXT:  # %bb.3: # %entry
2498; MIPS4-NEXT:    sll $1, $1, 24
2499; MIPS4-NEXT:    jr $ra
2500; MIPS4-NEXT:    sra $2, $1, 24
2501;
2502; MIPS64-LABEL: AtomicLoadAdd8:
2503; MIPS64:       # %bb.0: # %entry
2504; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2505; MIPS64-NEXT:    daddu $1, $1, $25
2506; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2507; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
2508; MIPS64-NEXT:    daddiu $2, $zero, -4
2509; MIPS64-NEXT:    and $2, $1, $2
2510; MIPS64-NEXT:    andi $1, $1, 3
2511; MIPS64-NEXT:    sll $3, $1, 3
2512; MIPS64-NEXT:    ori $1, $zero, 255
2513; MIPS64-NEXT:    sllv $5, $1, $3
2514; MIPS64-NEXT:    nor $6, $zero, $5
2515; MIPS64-NEXT:    sllv $4, $4, $3
2516; MIPS64-NEXT:  .LBB8_1: # %entry
2517; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2518; MIPS64-NEXT:    ll $7, 0($2)
2519; MIPS64-NEXT:    addu $8, $7, $4
2520; MIPS64-NEXT:    and $8, $8, $5
2521; MIPS64-NEXT:    and $9, $7, $6
2522; MIPS64-NEXT:    or $9, $9, $8
2523; MIPS64-NEXT:    sc $9, 0($2)
2524; MIPS64-NEXT:    beqz $9, .LBB8_1
2525; MIPS64-NEXT:    nop
2526; MIPS64-NEXT:  # %bb.2: # %entry
2527; MIPS64-NEXT:    and $1, $7, $5
2528; MIPS64-NEXT:    srlv $1, $1, $3
2529; MIPS64-NEXT:    sll $1, $1, 24
2530; MIPS64-NEXT:    sra $1, $1, 24
2531; MIPS64-NEXT:  # %bb.3: # %entry
2532; MIPS64-NEXT:    sll $1, $1, 24
2533; MIPS64-NEXT:    jr $ra
2534; MIPS64-NEXT:    sra $2, $1, 24
2535;
2536; MIPS64R2-LABEL: AtomicLoadAdd8:
2537; MIPS64R2:       # %bb.0: # %entry
2538; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2539; MIPS64R2-NEXT:    daddu $1, $1, $25
2540; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2541; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
2542; MIPS64R2-NEXT:    daddiu $2, $zero, -4
2543; MIPS64R2-NEXT:    and $2, $1, $2
2544; MIPS64R2-NEXT:    andi $1, $1, 3
2545; MIPS64R2-NEXT:    sll $3, $1, 3
2546; MIPS64R2-NEXT:    ori $1, $zero, 255
2547; MIPS64R2-NEXT:    sllv $5, $1, $3
2548; MIPS64R2-NEXT:    nor $6, $zero, $5
2549; MIPS64R2-NEXT:    sllv $4, $4, $3
2550; MIPS64R2-NEXT:  .LBB8_1: # %entry
2551; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
2552; MIPS64R2-NEXT:    ll $7, 0($2)
2553; MIPS64R2-NEXT:    addu $8, $7, $4
2554; MIPS64R2-NEXT:    and $8, $8, $5
2555; MIPS64R2-NEXT:    and $9, $7, $6
2556; MIPS64R2-NEXT:    or $9, $9, $8
2557; MIPS64R2-NEXT:    sc $9, 0($2)
2558; MIPS64R2-NEXT:    beqz $9, .LBB8_1
2559; MIPS64R2-NEXT:    nop
2560; MIPS64R2-NEXT:  # %bb.2: # %entry
2561; MIPS64R2-NEXT:    and $1, $7, $5
2562; MIPS64R2-NEXT:    srlv $1, $1, $3
2563; MIPS64R2-NEXT:    seb $1, $1
2564; MIPS64R2-NEXT:  # %bb.3: # %entry
2565; MIPS64R2-NEXT:    jr $ra
2566; MIPS64R2-NEXT:    seb $2, $1
2567;
2568; MIPS64R6-LABEL: AtomicLoadAdd8:
2569; MIPS64R6:       # %bb.0: # %entry
2570; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2571; MIPS64R6-NEXT:    daddu $1, $1, $25
2572; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2573; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
2574; MIPS64R6-NEXT:    daddiu $2, $zero, -4
2575; MIPS64R6-NEXT:    and $2, $1, $2
2576; MIPS64R6-NEXT:    andi $1, $1, 3
2577; MIPS64R6-NEXT:    sll $3, $1, 3
2578; MIPS64R6-NEXT:    ori $1, $zero, 255
2579; MIPS64R6-NEXT:    sllv $5, $1, $3
2580; MIPS64R6-NEXT:    nor $6, $zero, $5
2581; MIPS64R6-NEXT:    sllv $4, $4, $3
2582; MIPS64R6-NEXT:  .LBB8_1: # %entry
2583; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
2584; MIPS64R6-NEXT:    ll $7, 0($2)
2585; MIPS64R6-NEXT:    addu $8, $7, $4
2586; MIPS64R6-NEXT:    and $8, $8, $5
2587; MIPS64R6-NEXT:    and $9, $7, $6
2588; MIPS64R6-NEXT:    or $9, $9, $8
2589; MIPS64R6-NEXT:    sc $9, 0($2)
2590; MIPS64R6-NEXT:    beqzc $9, .LBB8_1
2591; MIPS64R6-NEXT:  # %bb.2: # %entry
2592; MIPS64R6-NEXT:    and $1, $7, $5
2593; MIPS64R6-NEXT:    srlv $1, $1, $3
2594; MIPS64R6-NEXT:    seb $1, $1
2595; MIPS64R6-NEXT:  # %bb.3: # %entry
2596; MIPS64R6-NEXT:    jr $ra
2597; MIPS64R6-NEXT:    seb $2, $1
2598;
2599; MIPS64R6O0-LABEL: AtomicLoadAdd8:
2600; MIPS64R6O0:       # %bb.0: # %entry
2601; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
2602; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2603; MIPS64R6O0-NEXT:    daddu $1, $1, $25
2604; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2605; MIPS64R6O0-NEXT:    move $2, $4
2606; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
2607; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
2608; MIPS64R6O0-NEXT:    and $4, $1, $4
2609; MIPS64R6O0-NEXT:    andi $3, $1, 3
2610; MIPS64R6O0-NEXT:    xori $3, $3, 3
2611; MIPS64R6O0-NEXT:    sll $3, $3, 3
2612; MIPS64R6O0-NEXT:    ori $5, $zero, 255
2613; MIPS64R6O0-NEXT:    sllv $5, $5, $3
2614; MIPS64R6O0-NEXT:    nor $6, $zero, $5
2615; MIPS64R6O0-NEXT:    sllv $2, $2, $3
2616; MIPS64R6O0-NEXT:  .LBB8_1: # %entry
2617; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2618; MIPS64R6O0-NEXT:    ll $8, 0($4)
2619; MIPS64R6O0-NEXT:    addu $9, $8, $2
2620; MIPS64R6O0-NEXT:    and $9, $9, $5
2621; MIPS64R6O0-NEXT:    and $10, $8, $6
2622; MIPS64R6O0-NEXT:    or $10, $10, $9
2623; MIPS64R6O0-NEXT:    sc $10, 0($4)
2624; MIPS64R6O0-NEXT:    beqzc $10, .LBB8_1
2625; MIPS64R6O0-NEXT:  # %bb.2: # %entry
2626; MIPS64R6O0-NEXT:    and $7, $8, $5
2627; MIPS64R6O0-NEXT:    srlv $7, $7, $3
2628; MIPS64R6O0-NEXT:    seb $7, $7
2629; MIPS64R6O0-NEXT:  # %bb.3: # %entry
2630; MIPS64R6O0-NEXT:    sw $7, 12($sp) # 4-byte Folded Spill
2631; MIPS64R6O0-NEXT:  # %bb.4: # %entry
2632; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
2633; MIPS64R6O0-NEXT:    seb $2, $1
2634; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
2635; MIPS64R6O0-NEXT:    jrc $ra
2636;
2637; MM32-LABEL: AtomicLoadAdd8:
2638; MM32:       # %bb.0: # %entry
2639; MM32-NEXT:    lui $2, %hi(_gp_disp)
2640; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2641; MM32-NEXT:    addu $2, $2, $25
2642; MM32-NEXT:    lw $1, %got(y)($2)
2643; MM32-NEXT:    addiu $2, $zero, -4
2644; MM32-NEXT:    and $2, $1, $2
2645; MM32-NEXT:    andi $1, $1, 3
2646; MM32-NEXT:    sll $3, $1, 3
2647; MM32-NEXT:    ori $1, $zero, 255
2648; MM32-NEXT:    sllv $5, $1, $3
2649; MM32-NEXT:    nor $6, $zero, $5
2650; MM32-NEXT:    sllv $4, $4, $3
2651; MM32-NEXT:  $BB8_1: # %entry
2652; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
2653; MM32-NEXT:    ll $7, 0($2)
2654; MM32-NEXT:    addu $8, $7, $4
2655; MM32-NEXT:    and $8, $8, $5
2656; MM32-NEXT:    and $9, $7, $6
2657; MM32-NEXT:    or $9, $9, $8
2658; MM32-NEXT:    sc $9, 0($2)
2659; MM32-NEXT:    beqzc $9, $BB8_1
2660; MM32-NEXT:  # %bb.2: # %entry
2661; MM32-NEXT:    and $1, $7, $5
2662; MM32-NEXT:    srlv $1, $1, $3
2663; MM32-NEXT:    seb $1, $1
2664; MM32-NEXT:  # %bb.3: # %entry
2665; MM32-NEXT:    jr $ra
2666; MM32-NEXT:    seb $2, $1
2667;
2668; O1-LABEL: AtomicLoadAdd8:
2669; O1:       # %bb.0: # %entry
2670; O1-NEXT:    lui $2, %hi(_gp_disp)
2671; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
2672; O1-NEXT:    addu $1, $2, $25
2673; O1-NEXT:    lw $1, %got(y)($1)
2674; O1-NEXT:    addiu $2, $zero, -4
2675; O1-NEXT:    and $2, $1, $2
2676; O1-NEXT:    andi $1, $1, 3
2677; O1-NEXT:    sll $3, $1, 3
2678; O1-NEXT:    ori $1, $zero, 255
2679; O1-NEXT:    sllv $5, $1, $3
2680; O1-NEXT:    nor $6, $zero, $5
2681; O1-NEXT:    sllv $4, $4, $3
2682; O1-NEXT:  $BB8_1: # %entry
2683; O1-NEXT:    # =>This Inner Loop Header: Depth=1
2684; O1-NEXT:    ll $7, 0($2)
2685; O1-NEXT:    addu $8, $7, $4
2686; O1-NEXT:    and $8, $8, $5
2687; O1-NEXT:    and $9, $7, $6
2688; O1-NEXT:    or $9, $9, $8
2689; O1-NEXT:    sc $9, 0($2)
2690; O1-NEXT:    beqz $9, $BB8_1
2691; O1-NEXT:    nop
2692; O1-NEXT:  # %bb.2: # %entry
2693; O1-NEXT:    and $1, $7, $5
2694; O1-NEXT:    srlv $1, $1, $3
2695; O1-NEXT:    sll $1, $1, 24
2696; O1-NEXT:    sra $1, $1, 24
2697; O1-NEXT:  # %bb.3: # %entry
2698; O1-NEXT:    sll $1, $1, 24
2699; O1-NEXT:    jr $ra
2700; O1-NEXT:    sra $2, $1, 24
2701;
2702; O2-LABEL: AtomicLoadAdd8:
2703; O2:       # %bb.0: # %entry
2704; O2-NEXT:    lui $2, %hi(_gp_disp)
2705; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2706; O2-NEXT:    addu $1, $2, $25
2707; O2-NEXT:    lw $1, %got(y)($1)
2708; O2-NEXT:    addiu $2, $zero, -4
2709; O2-NEXT:    and $2, $1, $2
2710; O2-NEXT:    andi $1, $1, 3
2711; O2-NEXT:    sll $3, $1, 3
2712; O2-NEXT:    ori $1, $zero, 255
2713; O2-NEXT:    sllv $5, $1, $3
2714; O2-NEXT:    nor $6, $zero, $5
2715; O2-NEXT:    sllv $4, $4, $3
2716; O2-NEXT:  $BB8_1: # %entry
2717; O2-NEXT:    # =>This Inner Loop Header: Depth=1
2718; O2-NEXT:    ll $7, 0($2)
2719; O2-NEXT:    addu $8, $7, $4
2720; O2-NEXT:    and $8, $8, $5
2721; O2-NEXT:    and $9, $7, $6
2722; O2-NEXT:    or $9, $9, $8
2723; O2-NEXT:    sc $9, 0($2)
2724; O2-NEXT:    beqz $9, $BB8_1
2725; O2-NEXT:    nop
2726; O2-NEXT:  # %bb.2: # %entry
2727; O2-NEXT:    and $1, $7, $5
2728; O2-NEXT:    srlv $1, $1, $3
2729; O2-NEXT:    sll $1, $1, 24
2730; O2-NEXT:    sra $1, $1, 24
2731; O2-NEXT:  # %bb.3: # %entry
2732; O2-NEXT:    sll $1, $1, 24
2733; O2-NEXT:    jr $ra
2734; O2-NEXT:    sra $2, $1, 24
2735;
2736; O3-LABEL: AtomicLoadAdd8:
2737; O3:       # %bb.0: # %entry
2738; O3-NEXT:    lui $2, %hi(_gp_disp)
2739; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
2740; O3-NEXT:    addu $1, $2, $25
2741; O3-NEXT:    addiu $2, $zero, -4
2742; O3-NEXT:    lw $1, %got(y)($1)
2743; O3-NEXT:    and $2, $1, $2
2744; O3-NEXT:    andi $1, $1, 3
2745; O3-NEXT:    sll $3, $1, 3
2746; O3-NEXT:    ori $1, $zero, 255
2747; O3-NEXT:    sllv $5, $1, $3
2748; O3-NEXT:    sllv $4, $4, $3
2749; O3-NEXT:    nor $6, $zero, $5
2750; O3-NEXT:  $BB8_1: # %entry
2751; O3-NEXT:    # =>This Inner Loop Header: Depth=1
2752; O3-NEXT:    ll $7, 0($2)
2753; O3-NEXT:    addu $8, $7, $4
2754; O3-NEXT:    and $8, $8, $5
2755; O3-NEXT:    and $9, $7, $6
2756; O3-NEXT:    or $9, $9, $8
2757; O3-NEXT:    sc $9, 0($2)
2758; O3-NEXT:    beqz $9, $BB8_1
2759; O3-NEXT:    nop
2760; O3-NEXT:  # %bb.2: # %entry
2761; O3-NEXT:    and $1, $7, $5
2762; O3-NEXT:    srlv $1, $1, $3
2763; O3-NEXT:    sll $1, $1, 24
2764; O3-NEXT:    sra $1, $1, 24
2765; O3-NEXT:  # %bb.3: # %entry
2766; O3-NEXT:    sll $1, $1, 24
2767; O3-NEXT:    jr $ra
2768; O3-NEXT:    sra $2, $1, 24
2769;
2770; MIPS32EB-LABEL: AtomicLoadAdd8:
2771; MIPS32EB:       # %bb.0: # %entry
2772; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
2773; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
2774; MIPS32EB-NEXT:    addu $1, $2, $25
2775; MIPS32EB-NEXT:    lw $1, %got(y)($1)
2776; MIPS32EB-NEXT:    addiu $2, $zero, -4
2777; MIPS32EB-NEXT:    and $2, $1, $2
2778; MIPS32EB-NEXT:    andi $1, $1, 3
2779; MIPS32EB-NEXT:    xori $1, $1, 3
2780; MIPS32EB-NEXT:    sll $3, $1, 3
2781; MIPS32EB-NEXT:    ori $1, $zero, 255
2782; MIPS32EB-NEXT:    sllv $5, $1, $3
2783; MIPS32EB-NEXT:    nor $6, $zero, $5
2784; MIPS32EB-NEXT:    sllv $4, $4, $3
2785; MIPS32EB-NEXT:  $BB8_1: # %entry
2786; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
2787; MIPS32EB-NEXT:    ll $7, 0($2)
2788; MIPS32EB-NEXT:    addu $8, $7, $4
2789; MIPS32EB-NEXT:    and $8, $8, $5
2790; MIPS32EB-NEXT:    and $9, $7, $6
2791; MIPS32EB-NEXT:    or $9, $9, $8
2792; MIPS32EB-NEXT:    sc $9, 0($2)
2793; MIPS32EB-NEXT:    beqz $9, $BB8_1
2794; MIPS32EB-NEXT:    nop
2795; MIPS32EB-NEXT:  # %bb.2: # %entry
2796; MIPS32EB-NEXT:    and $1, $7, $5
2797; MIPS32EB-NEXT:    srlv $1, $1, $3
2798; MIPS32EB-NEXT:    sll $1, $1, 24
2799; MIPS32EB-NEXT:    sra $1, $1, 24
2800; MIPS32EB-NEXT:  # %bb.3: # %entry
2801; MIPS32EB-NEXT:    sll $1, $1, 24
2802; MIPS32EB-NEXT:    jr $ra
2803; MIPS32EB-NEXT:    sra $2, $1, 24
2804entry:
2805  %0 = atomicrmw add i8* @y, i8 %incr monotonic
2806  ret i8 %0
2807}
2808
2809define signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind {
2810; MIPS32-LABEL: AtomicLoadSub8:
2811; MIPS32:       # %bb.0: # %entry
2812; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
2813; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2814; MIPS32-NEXT:    addu $1, $2, $25
2815; MIPS32-NEXT:    lw $1, %got(y)($1)
2816; MIPS32-NEXT:    addiu $2, $zero, -4
2817; MIPS32-NEXT:    and $2, $1, $2
2818; MIPS32-NEXT:    andi $1, $1, 3
2819; MIPS32-NEXT:    sll $3, $1, 3
2820; MIPS32-NEXT:    ori $1, $zero, 255
2821; MIPS32-NEXT:    sllv $5, $1, $3
2822; MIPS32-NEXT:    nor $6, $zero, $5
2823; MIPS32-NEXT:    sllv $4, $4, $3
2824; MIPS32-NEXT:  $BB9_1: # %entry
2825; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
2826; MIPS32-NEXT:    ll $7, 0($2)
2827; MIPS32-NEXT:    subu $8, $7, $4
2828; MIPS32-NEXT:    and $8, $8, $5
2829; MIPS32-NEXT:    and $9, $7, $6
2830; MIPS32-NEXT:    or $9, $9, $8
2831; MIPS32-NEXT:    sc $9, 0($2)
2832; MIPS32-NEXT:    beqz $9, $BB9_1
2833; MIPS32-NEXT:    nop
2834; MIPS32-NEXT:  # %bb.2: # %entry
2835; MIPS32-NEXT:    and $1, $7, $5
2836; MIPS32-NEXT:    srlv $1, $1, $3
2837; MIPS32-NEXT:    sll $1, $1, 24
2838; MIPS32-NEXT:    sra $1, $1, 24
2839; MIPS32-NEXT:  # %bb.3: # %entry
2840; MIPS32-NEXT:    sll $1, $1, 24
2841; MIPS32-NEXT:    jr $ra
2842; MIPS32-NEXT:    sra $2, $1, 24
2843;
2844; MIPS32O0-LABEL: AtomicLoadSub8:
2845; MIPS32O0:       # %bb.0: # %entry
2846; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
2847; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2848; MIPS32O0-NEXT:    addiu $sp, $sp, -8
2849; MIPS32O0-NEXT:    addu $2, $2, $25
2850; MIPS32O0-NEXT:    lw $2, %got(y)($2)
2851; MIPS32O0-NEXT:    addiu $25, $zero, -4
2852; MIPS32O0-NEXT:    and $25, $2, $25
2853; MIPS32O0-NEXT:    andi $2, $2, 3
2854; MIPS32O0-NEXT:    sll $2, $2, 3
2855; MIPS32O0-NEXT:    ori $1, $zero, 255
2856; MIPS32O0-NEXT:    sllv $1, $1, $2
2857; MIPS32O0-NEXT:    nor $3, $zero, $1
2858; MIPS32O0-NEXT:    sllv $4, $4, $2
2859; MIPS32O0-NEXT:  $BB9_1: # %entry
2860; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
2861; MIPS32O0-NEXT:    ll $6, 0($25)
2862; MIPS32O0-NEXT:    subu $7, $6, $4
2863; MIPS32O0-NEXT:    and $7, $7, $1
2864; MIPS32O0-NEXT:    and $8, $6, $3
2865; MIPS32O0-NEXT:    or $8, $8, $7
2866; MIPS32O0-NEXT:    sc $8, 0($25)
2867; MIPS32O0-NEXT:    beqz $8, $BB9_1
2868; MIPS32O0-NEXT:    nop
2869; MIPS32O0-NEXT:  # %bb.2: # %entry
2870; MIPS32O0-NEXT:    and $5, $6, $1
2871; MIPS32O0-NEXT:    srlv $5, $5, $2
2872; MIPS32O0-NEXT:    sll $5, $5, 24
2873; MIPS32O0-NEXT:    sra $5, $5, 24
2874; MIPS32O0-NEXT:  # %bb.3: # %entry
2875; MIPS32O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
2876; MIPS32O0-NEXT:  # %bb.4: # %entry
2877; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2878; MIPS32O0-NEXT:    sll $2, $1, 24
2879; MIPS32O0-NEXT:    sra $2, $2, 24
2880; MIPS32O0-NEXT:    addiu $sp, $sp, 8
2881; MIPS32O0-NEXT:    jr $ra
2882; MIPS32O0-NEXT:    nop
2883;
2884; MIPS32R2-LABEL: AtomicLoadSub8:
2885; MIPS32R2:       # %bb.0: # %entry
2886; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
2887; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2888; MIPS32R2-NEXT:    addu $1, $2, $25
2889; MIPS32R2-NEXT:    lw $1, %got(y)($1)
2890; MIPS32R2-NEXT:    addiu $2, $zero, -4
2891; MIPS32R2-NEXT:    and $2, $1, $2
2892; MIPS32R2-NEXT:    andi $1, $1, 3
2893; MIPS32R2-NEXT:    sll $3, $1, 3
2894; MIPS32R2-NEXT:    ori $1, $zero, 255
2895; MIPS32R2-NEXT:    sllv $5, $1, $3
2896; MIPS32R2-NEXT:    nor $6, $zero, $5
2897; MIPS32R2-NEXT:    sllv $4, $4, $3
2898; MIPS32R2-NEXT:  $BB9_1: # %entry
2899; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
2900; MIPS32R2-NEXT:    ll $7, 0($2)
2901; MIPS32R2-NEXT:    subu $8, $7, $4
2902; MIPS32R2-NEXT:    and $8, $8, $5
2903; MIPS32R2-NEXT:    and $9, $7, $6
2904; MIPS32R2-NEXT:    or $9, $9, $8
2905; MIPS32R2-NEXT:    sc $9, 0($2)
2906; MIPS32R2-NEXT:    beqz $9, $BB9_1
2907; MIPS32R2-NEXT:    nop
2908; MIPS32R2-NEXT:  # %bb.2: # %entry
2909; MIPS32R2-NEXT:    and $1, $7, $5
2910; MIPS32R2-NEXT:    srlv $1, $1, $3
2911; MIPS32R2-NEXT:    seb $1, $1
2912; MIPS32R2-NEXT:  # %bb.3: # %entry
2913; MIPS32R2-NEXT:    jr $ra
2914; MIPS32R2-NEXT:    seb $2, $1
2915;
2916; MIPS32R6-LABEL: AtomicLoadSub8:
2917; MIPS32R6:       # %bb.0: # %entry
2918; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
2919; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
2920; MIPS32R6-NEXT:    addu $1, $2, $25
2921; MIPS32R6-NEXT:    lw $1, %got(y)($1)
2922; MIPS32R6-NEXT:    addiu $2, $zero, -4
2923; MIPS32R6-NEXT:    and $2, $1, $2
2924; MIPS32R6-NEXT:    andi $1, $1, 3
2925; MIPS32R6-NEXT:    sll $3, $1, 3
2926; MIPS32R6-NEXT:    ori $1, $zero, 255
2927; MIPS32R6-NEXT:    sllv $5, $1, $3
2928; MIPS32R6-NEXT:    nor $6, $zero, $5
2929; MIPS32R6-NEXT:    sllv $4, $4, $3
2930; MIPS32R6-NEXT:  $BB9_1: # %entry
2931; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
2932; MIPS32R6-NEXT:    ll $7, 0($2)
2933; MIPS32R6-NEXT:    subu $8, $7, $4
2934; MIPS32R6-NEXT:    and $8, $8, $5
2935; MIPS32R6-NEXT:    and $9, $7, $6
2936; MIPS32R6-NEXT:    or $9, $9, $8
2937; MIPS32R6-NEXT:    sc $9, 0($2)
2938; MIPS32R6-NEXT:    beqzc $9, $BB9_1
2939; MIPS32R6-NEXT:  # %bb.2: # %entry
2940; MIPS32R6-NEXT:    and $1, $7, $5
2941; MIPS32R6-NEXT:    srlv $1, $1, $3
2942; MIPS32R6-NEXT:    seb $1, $1
2943; MIPS32R6-NEXT:  # %bb.3: # %entry
2944; MIPS32R6-NEXT:    jr $ra
2945; MIPS32R6-NEXT:    seb $2, $1
2946;
2947; MIPS32R6O0-LABEL: AtomicLoadSub8:
2948; MIPS32R6O0:       # %bb.0: # %entry
2949; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
2950; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2951; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
2952; MIPS32R6O0-NEXT:    addu $2, $2, $25
2953; MIPS32R6O0-NEXT:    move $25, $4
2954; MIPS32R6O0-NEXT:    lw $2, %got(y)($2)
2955; MIPS32R6O0-NEXT:    addiu $1, $zero, -4
2956; MIPS32R6O0-NEXT:    and $1, $2, $1
2957; MIPS32R6O0-NEXT:    andi $2, $2, 3
2958; MIPS32R6O0-NEXT:    sll $2, $2, 3
2959; MIPS32R6O0-NEXT:    ori $3, $zero, 255
2960; MIPS32R6O0-NEXT:    sllv $3, $3, $2
2961; MIPS32R6O0-NEXT:    nor $5, $zero, $3
2962; MIPS32R6O0-NEXT:    sllv $4, $4, $2
2963; MIPS32R6O0-NEXT:  $BB9_1: # %entry
2964; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2965; MIPS32R6O0-NEXT:    ll $7, 0($1)
2966; MIPS32R6O0-NEXT:    subu $8, $7, $4
2967; MIPS32R6O0-NEXT:    and $8, $8, $3
2968; MIPS32R6O0-NEXT:    and $9, $7, $5
2969; MIPS32R6O0-NEXT:    or $9, $9, $8
2970; MIPS32R6O0-NEXT:    sc $9, 0($1)
2971; MIPS32R6O0-NEXT:    beqzc $9, $BB9_1
2972; MIPS32R6O0-NEXT:  # %bb.2: # %entry
2973; MIPS32R6O0-NEXT:    and $6, $7, $3
2974; MIPS32R6O0-NEXT:    srlv $6, $6, $2
2975; MIPS32R6O0-NEXT:    seb $6, $6
2976; MIPS32R6O0-NEXT:  # %bb.3: # %entry
2977; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
2978; MIPS32R6O0-NEXT:    sw $6, 0($sp) # 4-byte Folded Spill
2979; MIPS32R6O0-NEXT:  # %bb.4: # %entry
2980; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
2981; MIPS32R6O0-NEXT:    seb $2, $1
2982; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
2983; MIPS32R6O0-NEXT:    jrc $ra
2984;
2985; MIPS4-LABEL: AtomicLoadSub8:
2986; MIPS4:       # %bb.0: # %entry
2987; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
2988; MIPS4-NEXT:    daddu $1, $1, $25
2989; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
2990; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
2991; MIPS4-NEXT:    daddiu $2, $zero, -4
2992; MIPS4-NEXT:    and $2, $1, $2
2993; MIPS4-NEXT:    andi $1, $1, 3
2994; MIPS4-NEXT:    sll $3, $1, 3
2995; MIPS4-NEXT:    ori $1, $zero, 255
2996; MIPS4-NEXT:    sllv $5, $1, $3
2997; MIPS4-NEXT:    nor $6, $zero, $5
2998; MIPS4-NEXT:    sllv $4, $4, $3
2999; MIPS4-NEXT:  .LBB9_1: # %entry
3000; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
3001; MIPS4-NEXT:    ll $7, 0($2)
3002; MIPS4-NEXT:    subu $8, $7, $4
3003; MIPS4-NEXT:    and $8, $8, $5
3004; MIPS4-NEXT:    and $9, $7, $6
3005; MIPS4-NEXT:    or $9, $9, $8
3006; MIPS4-NEXT:    sc $9, 0($2)
3007; MIPS4-NEXT:    beqz $9, .LBB9_1
3008; MIPS4-NEXT:    nop
3009; MIPS4-NEXT:  # %bb.2: # %entry
3010; MIPS4-NEXT:    and $1, $7, $5
3011; MIPS4-NEXT:    srlv $1, $1, $3
3012; MIPS4-NEXT:    sll $1, $1, 24
3013; MIPS4-NEXT:    sra $1, $1, 24
3014; MIPS4-NEXT:  # %bb.3: # %entry
3015; MIPS4-NEXT:    sll $1, $1, 24
3016; MIPS4-NEXT:    jr $ra
3017; MIPS4-NEXT:    sra $2, $1, 24
3018;
3019; MIPS64-LABEL: AtomicLoadSub8:
3020; MIPS64:       # %bb.0: # %entry
3021; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3022; MIPS64-NEXT:    daddu $1, $1, $25
3023; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3024; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
3025; MIPS64-NEXT:    daddiu $2, $zero, -4
3026; MIPS64-NEXT:    and $2, $1, $2
3027; MIPS64-NEXT:    andi $1, $1, 3
3028; MIPS64-NEXT:    sll $3, $1, 3
3029; MIPS64-NEXT:    ori $1, $zero, 255
3030; MIPS64-NEXT:    sllv $5, $1, $3
3031; MIPS64-NEXT:    nor $6, $zero, $5
3032; MIPS64-NEXT:    sllv $4, $4, $3
3033; MIPS64-NEXT:  .LBB9_1: # %entry
3034; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
3035; MIPS64-NEXT:    ll $7, 0($2)
3036; MIPS64-NEXT:    subu $8, $7, $4
3037; MIPS64-NEXT:    and $8, $8, $5
3038; MIPS64-NEXT:    and $9, $7, $6
3039; MIPS64-NEXT:    or $9, $9, $8
3040; MIPS64-NEXT:    sc $9, 0($2)
3041; MIPS64-NEXT:    beqz $9, .LBB9_1
3042; MIPS64-NEXT:    nop
3043; MIPS64-NEXT:  # %bb.2: # %entry
3044; MIPS64-NEXT:    and $1, $7, $5
3045; MIPS64-NEXT:    srlv $1, $1, $3
3046; MIPS64-NEXT:    sll $1, $1, 24
3047; MIPS64-NEXT:    sra $1, $1, 24
3048; MIPS64-NEXT:  # %bb.3: # %entry
3049; MIPS64-NEXT:    sll $1, $1, 24
3050; MIPS64-NEXT:    jr $ra
3051; MIPS64-NEXT:    sra $2, $1, 24
3052;
3053; MIPS64R2-LABEL: AtomicLoadSub8:
3054; MIPS64R2:       # %bb.0: # %entry
3055; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3056; MIPS64R2-NEXT:    daddu $1, $1, $25
3057; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3058; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
3059; MIPS64R2-NEXT:    daddiu $2, $zero, -4
3060; MIPS64R2-NEXT:    and $2, $1, $2
3061; MIPS64R2-NEXT:    andi $1, $1, 3
3062; MIPS64R2-NEXT:    sll $3, $1, 3
3063; MIPS64R2-NEXT:    ori $1, $zero, 255
3064; MIPS64R2-NEXT:    sllv $5, $1, $3
3065; MIPS64R2-NEXT:    nor $6, $zero, $5
3066; MIPS64R2-NEXT:    sllv $4, $4, $3
3067; MIPS64R2-NEXT:  .LBB9_1: # %entry
3068; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
3069; MIPS64R2-NEXT:    ll $7, 0($2)
3070; MIPS64R2-NEXT:    subu $8, $7, $4
3071; MIPS64R2-NEXT:    and $8, $8, $5
3072; MIPS64R2-NEXT:    and $9, $7, $6
3073; MIPS64R2-NEXT:    or $9, $9, $8
3074; MIPS64R2-NEXT:    sc $9, 0($2)
3075; MIPS64R2-NEXT:    beqz $9, .LBB9_1
3076; MIPS64R2-NEXT:    nop
3077; MIPS64R2-NEXT:  # %bb.2: # %entry
3078; MIPS64R2-NEXT:    and $1, $7, $5
3079; MIPS64R2-NEXT:    srlv $1, $1, $3
3080; MIPS64R2-NEXT:    seb $1, $1
3081; MIPS64R2-NEXT:  # %bb.3: # %entry
3082; MIPS64R2-NEXT:    jr $ra
3083; MIPS64R2-NEXT:    seb $2, $1
3084;
3085; MIPS64R6-LABEL: AtomicLoadSub8:
3086; MIPS64R6:       # %bb.0: # %entry
3087; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3088; MIPS64R6-NEXT:    daddu $1, $1, $25
3089; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3090; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
3091; MIPS64R6-NEXT:    daddiu $2, $zero, -4
3092; MIPS64R6-NEXT:    and $2, $1, $2
3093; MIPS64R6-NEXT:    andi $1, $1, 3
3094; MIPS64R6-NEXT:    sll $3, $1, 3
3095; MIPS64R6-NEXT:    ori $1, $zero, 255
3096; MIPS64R6-NEXT:    sllv $5, $1, $3
3097; MIPS64R6-NEXT:    nor $6, $zero, $5
3098; MIPS64R6-NEXT:    sllv $4, $4, $3
3099; MIPS64R6-NEXT:  .LBB9_1: # %entry
3100; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
3101; MIPS64R6-NEXT:    ll $7, 0($2)
3102; MIPS64R6-NEXT:    subu $8, $7, $4
3103; MIPS64R6-NEXT:    and $8, $8, $5
3104; MIPS64R6-NEXT:    and $9, $7, $6
3105; MIPS64R6-NEXT:    or $9, $9, $8
3106; MIPS64R6-NEXT:    sc $9, 0($2)
3107; MIPS64R6-NEXT:    beqzc $9, .LBB9_1
3108; MIPS64R6-NEXT:  # %bb.2: # %entry
3109; MIPS64R6-NEXT:    and $1, $7, $5
3110; MIPS64R6-NEXT:    srlv $1, $1, $3
3111; MIPS64R6-NEXT:    seb $1, $1
3112; MIPS64R6-NEXT:  # %bb.3: # %entry
3113; MIPS64R6-NEXT:    jr $ra
3114; MIPS64R6-NEXT:    seb $2, $1
3115;
3116; MIPS64R6O0-LABEL: AtomicLoadSub8:
3117; MIPS64R6O0:       # %bb.0: # %entry
3118; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
3119; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3120; MIPS64R6O0-NEXT:    daddu $1, $1, $25
3121; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3122; MIPS64R6O0-NEXT:    move $2, $4
3123; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
3124; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
3125; MIPS64R6O0-NEXT:    and $4, $1, $4
3126; MIPS64R6O0-NEXT:    andi $3, $1, 3
3127; MIPS64R6O0-NEXT:    xori $3, $3, 3
3128; MIPS64R6O0-NEXT:    sll $3, $3, 3
3129; MIPS64R6O0-NEXT:    ori $5, $zero, 255
3130; MIPS64R6O0-NEXT:    sllv $5, $5, $3
3131; MIPS64R6O0-NEXT:    nor $6, $zero, $5
3132; MIPS64R6O0-NEXT:    sllv $2, $2, $3
3133; MIPS64R6O0-NEXT:  .LBB9_1: # %entry
3134; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3135; MIPS64R6O0-NEXT:    ll $8, 0($4)
3136; MIPS64R6O0-NEXT:    subu $9, $8, $2
3137; MIPS64R6O0-NEXT:    and $9, $9, $5
3138; MIPS64R6O0-NEXT:    and $10, $8, $6
3139; MIPS64R6O0-NEXT:    or $10, $10, $9
3140; MIPS64R6O0-NEXT:    sc $10, 0($4)
3141; MIPS64R6O0-NEXT:    beqzc $10, .LBB9_1
3142; MIPS64R6O0-NEXT:  # %bb.2: # %entry
3143; MIPS64R6O0-NEXT:    and $7, $8, $5
3144; MIPS64R6O0-NEXT:    srlv $7, $7, $3
3145; MIPS64R6O0-NEXT:    seb $7, $7
3146; MIPS64R6O0-NEXT:  # %bb.3: # %entry
3147; MIPS64R6O0-NEXT:    sw $7, 12($sp) # 4-byte Folded Spill
3148; MIPS64R6O0-NEXT:  # %bb.4: # %entry
3149; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
3150; MIPS64R6O0-NEXT:    seb $2, $1
3151; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
3152; MIPS64R6O0-NEXT:    jrc $ra
3153;
3154; MM32-LABEL: AtomicLoadSub8:
3155; MM32:       # %bb.0: # %entry
3156; MM32-NEXT:    lui $2, %hi(_gp_disp)
3157; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3158; MM32-NEXT:    addu $2, $2, $25
3159; MM32-NEXT:    lw $1, %got(y)($2)
3160; MM32-NEXT:    addiu $2, $zero, -4
3161; MM32-NEXT:    and $2, $1, $2
3162; MM32-NEXT:    andi $1, $1, 3
3163; MM32-NEXT:    sll $3, $1, 3
3164; MM32-NEXT:    ori $1, $zero, 255
3165; MM32-NEXT:    sllv $5, $1, $3
3166; MM32-NEXT:    nor $6, $zero, $5
3167; MM32-NEXT:    sllv $4, $4, $3
3168; MM32-NEXT:  $BB9_1: # %entry
3169; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
3170; MM32-NEXT:    ll $7, 0($2)
3171; MM32-NEXT:    subu $8, $7, $4
3172; MM32-NEXT:    and $8, $8, $5
3173; MM32-NEXT:    and $9, $7, $6
3174; MM32-NEXT:    or $9, $9, $8
3175; MM32-NEXT:    sc $9, 0($2)
3176; MM32-NEXT:    beqzc $9, $BB9_1
3177; MM32-NEXT:  # %bb.2: # %entry
3178; MM32-NEXT:    and $1, $7, $5
3179; MM32-NEXT:    srlv $1, $1, $3
3180; MM32-NEXT:    seb $1, $1
3181; MM32-NEXT:  # %bb.3: # %entry
3182; MM32-NEXT:    jr $ra
3183; MM32-NEXT:    seb $2, $1
3184;
3185; O1-LABEL: AtomicLoadSub8:
3186; O1:       # %bb.0: # %entry
3187; O1-NEXT:    lui $2, %hi(_gp_disp)
3188; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
3189; O1-NEXT:    addu $1, $2, $25
3190; O1-NEXT:    lw $1, %got(y)($1)
3191; O1-NEXT:    addiu $2, $zero, -4
3192; O1-NEXT:    and $2, $1, $2
3193; O1-NEXT:    andi $1, $1, 3
3194; O1-NEXT:    sll $3, $1, 3
3195; O1-NEXT:    ori $1, $zero, 255
3196; O1-NEXT:    sllv $5, $1, $3
3197; O1-NEXT:    nor $6, $zero, $5
3198; O1-NEXT:    sllv $4, $4, $3
3199; O1-NEXT:  $BB9_1: # %entry
3200; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3201; O1-NEXT:    ll $7, 0($2)
3202; O1-NEXT:    subu $8, $7, $4
3203; O1-NEXT:    and $8, $8, $5
3204; O1-NEXT:    and $9, $7, $6
3205; O1-NEXT:    or $9, $9, $8
3206; O1-NEXT:    sc $9, 0($2)
3207; O1-NEXT:    beqz $9, $BB9_1
3208; O1-NEXT:    nop
3209; O1-NEXT:  # %bb.2: # %entry
3210; O1-NEXT:    and $1, $7, $5
3211; O1-NEXT:    srlv $1, $1, $3
3212; O1-NEXT:    sll $1, $1, 24
3213; O1-NEXT:    sra $1, $1, 24
3214; O1-NEXT:  # %bb.3: # %entry
3215; O1-NEXT:    sll $1, $1, 24
3216; O1-NEXT:    jr $ra
3217; O1-NEXT:    sra $2, $1, 24
3218;
3219; O2-LABEL: AtomicLoadSub8:
3220; O2:       # %bb.0: # %entry
3221; O2-NEXT:    lui $2, %hi(_gp_disp)
3222; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3223; O2-NEXT:    addu $1, $2, $25
3224; O2-NEXT:    lw $1, %got(y)($1)
3225; O2-NEXT:    addiu $2, $zero, -4
3226; O2-NEXT:    and $2, $1, $2
3227; O2-NEXT:    andi $1, $1, 3
3228; O2-NEXT:    sll $3, $1, 3
3229; O2-NEXT:    ori $1, $zero, 255
3230; O2-NEXT:    sllv $5, $1, $3
3231; O2-NEXT:    nor $6, $zero, $5
3232; O2-NEXT:    sllv $4, $4, $3
3233; O2-NEXT:  $BB9_1: # %entry
3234; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3235; O2-NEXT:    ll $7, 0($2)
3236; O2-NEXT:    subu $8, $7, $4
3237; O2-NEXT:    and $8, $8, $5
3238; O2-NEXT:    and $9, $7, $6
3239; O2-NEXT:    or $9, $9, $8
3240; O2-NEXT:    sc $9, 0($2)
3241; O2-NEXT:    beqz $9, $BB9_1
3242; O2-NEXT:    nop
3243; O2-NEXT:  # %bb.2: # %entry
3244; O2-NEXT:    and $1, $7, $5
3245; O2-NEXT:    srlv $1, $1, $3
3246; O2-NEXT:    sll $1, $1, 24
3247; O2-NEXT:    sra $1, $1, 24
3248; O2-NEXT:  # %bb.3: # %entry
3249; O2-NEXT:    sll $1, $1, 24
3250; O2-NEXT:    jr $ra
3251; O2-NEXT:    sra $2, $1, 24
3252;
3253; O3-LABEL: AtomicLoadSub8:
3254; O3:       # %bb.0: # %entry
3255; O3-NEXT:    lui $2, %hi(_gp_disp)
3256; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
3257; O3-NEXT:    addu $1, $2, $25
3258; O3-NEXT:    addiu $2, $zero, -4
3259; O3-NEXT:    lw $1, %got(y)($1)
3260; O3-NEXT:    and $2, $1, $2
3261; O3-NEXT:    andi $1, $1, 3
3262; O3-NEXT:    sll $3, $1, 3
3263; O3-NEXT:    ori $1, $zero, 255
3264; O3-NEXT:    sllv $5, $1, $3
3265; O3-NEXT:    sllv $4, $4, $3
3266; O3-NEXT:    nor $6, $zero, $5
3267; O3-NEXT:  $BB9_1: # %entry
3268; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3269; O3-NEXT:    ll $7, 0($2)
3270; O3-NEXT:    subu $8, $7, $4
3271; O3-NEXT:    and $8, $8, $5
3272; O3-NEXT:    and $9, $7, $6
3273; O3-NEXT:    or $9, $9, $8
3274; O3-NEXT:    sc $9, 0($2)
3275; O3-NEXT:    beqz $9, $BB9_1
3276; O3-NEXT:    nop
3277; O3-NEXT:  # %bb.2: # %entry
3278; O3-NEXT:    and $1, $7, $5
3279; O3-NEXT:    srlv $1, $1, $3
3280; O3-NEXT:    sll $1, $1, 24
3281; O3-NEXT:    sra $1, $1, 24
3282; O3-NEXT:  # %bb.3: # %entry
3283; O3-NEXT:    sll $1, $1, 24
3284; O3-NEXT:    jr $ra
3285; O3-NEXT:    sra $2, $1, 24
3286;
3287; MIPS32EB-LABEL: AtomicLoadSub8:
3288; MIPS32EB:       # %bb.0: # %entry
3289; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
3290; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
3291; MIPS32EB-NEXT:    addu $1, $2, $25
3292; MIPS32EB-NEXT:    lw $1, %got(y)($1)
3293; MIPS32EB-NEXT:    addiu $2, $zero, -4
3294; MIPS32EB-NEXT:    and $2, $1, $2
3295; MIPS32EB-NEXT:    andi $1, $1, 3
3296; MIPS32EB-NEXT:    xori $1, $1, 3
3297; MIPS32EB-NEXT:    sll $3, $1, 3
3298; MIPS32EB-NEXT:    ori $1, $zero, 255
3299; MIPS32EB-NEXT:    sllv $5, $1, $3
3300; MIPS32EB-NEXT:    nor $6, $zero, $5
3301; MIPS32EB-NEXT:    sllv $4, $4, $3
3302; MIPS32EB-NEXT:  $BB9_1: # %entry
3303; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
3304; MIPS32EB-NEXT:    ll $7, 0($2)
3305; MIPS32EB-NEXT:    subu $8, $7, $4
3306; MIPS32EB-NEXT:    and $8, $8, $5
3307; MIPS32EB-NEXT:    and $9, $7, $6
3308; MIPS32EB-NEXT:    or $9, $9, $8
3309; MIPS32EB-NEXT:    sc $9, 0($2)
3310; MIPS32EB-NEXT:    beqz $9, $BB9_1
3311; MIPS32EB-NEXT:    nop
3312; MIPS32EB-NEXT:  # %bb.2: # %entry
3313; MIPS32EB-NEXT:    and $1, $7, $5
3314; MIPS32EB-NEXT:    srlv $1, $1, $3
3315; MIPS32EB-NEXT:    sll $1, $1, 24
3316; MIPS32EB-NEXT:    sra $1, $1, 24
3317; MIPS32EB-NEXT:  # %bb.3: # %entry
3318; MIPS32EB-NEXT:    sll $1, $1, 24
3319; MIPS32EB-NEXT:    jr $ra
3320; MIPS32EB-NEXT:    sra $2, $1, 24
3321entry:
3322  %0 = atomicrmw sub i8* @y, i8 %incr monotonic
3323  ret i8 %0
3324
3325}
3326
3327define signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind {
3328; MIPS32-LABEL: AtomicLoadNand8:
3329; MIPS32:       # %bb.0: # %entry
3330; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
3331; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3332; MIPS32-NEXT:    addu $1, $2, $25
3333; MIPS32-NEXT:    lw $1, %got(y)($1)
3334; MIPS32-NEXT:    addiu $2, $zero, -4
3335; MIPS32-NEXT:    and $2, $1, $2
3336; MIPS32-NEXT:    andi $1, $1, 3
3337; MIPS32-NEXT:    sll $3, $1, 3
3338; MIPS32-NEXT:    ori $1, $zero, 255
3339; MIPS32-NEXT:    sllv $5, $1, $3
3340; MIPS32-NEXT:    nor $6, $zero, $5
3341; MIPS32-NEXT:    sllv $4, $4, $3
3342; MIPS32-NEXT:  $BB10_1: # %entry
3343; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
3344; MIPS32-NEXT:    ll $7, 0($2)
3345; MIPS32-NEXT:    and $8, $7, $4
3346; MIPS32-NEXT:    nor $8, $zero, $8
3347; MIPS32-NEXT:    and $8, $8, $5
3348; MIPS32-NEXT:    and $9, $7, $6
3349; MIPS32-NEXT:    or $9, $9, $8
3350; MIPS32-NEXT:    sc $9, 0($2)
3351; MIPS32-NEXT:    beqz $9, $BB10_1
3352; MIPS32-NEXT:    nop
3353; MIPS32-NEXT:  # %bb.2: # %entry
3354; MIPS32-NEXT:    and $1, $7, $5
3355; MIPS32-NEXT:    srlv $1, $1, $3
3356; MIPS32-NEXT:    sll $1, $1, 24
3357; MIPS32-NEXT:    sra $1, $1, 24
3358; MIPS32-NEXT:  # %bb.3: # %entry
3359; MIPS32-NEXT:    sll $1, $1, 24
3360; MIPS32-NEXT:    jr $ra
3361; MIPS32-NEXT:    sra $2, $1, 24
3362;
3363; MIPS32O0-LABEL: AtomicLoadNand8:
3364; MIPS32O0:       # %bb.0: # %entry
3365; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
3366; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3367; MIPS32O0-NEXT:    addiu $sp, $sp, -8
3368; MIPS32O0-NEXT:    addu $2, $2, $25
3369; MIPS32O0-NEXT:    lw $2, %got(y)($2)
3370; MIPS32O0-NEXT:    addiu $25, $zero, -4
3371; MIPS32O0-NEXT:    and $25, $2, $25
3372; MIPS32O0-NEXT:    andi $2, $2, 3
3373; MIPS32O0-NEXT:    sll $2, $2, 3
3374; MIPS32O0-NEXT:    ori $1, $zero, 255
3375; MIPS32O0-NEXT:    sllv $1, $1, $2
3376; MIPS32O0-NEXT:    nor $3, $zero, $1
3377; MIPS32O0-NEXT:    sllv $4, $4, $2
3378; MIPS32O0-NEXT:  $BB10_1: # %entry
3379; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
3380; MIPS32O0-NEXT:    ll $6, 0($25)
3381; MIPS32O0-NEXT:    and $7, $6, $4
3382; MIPS32O0-NEXT:    nor $7, $zero, $7
3383; MIPS32O0-NEXT:    and $7, $7, $1
3384; MIPS32O0-NEXT:    and $8, $6, $3
3385; MIPS32O0-NEXT:    or $8, $8, $7
3386; MIPS32O0-NEXT:    sc $8, 0($25)
3387; MIPS32O0-NEXT:    beqz $8, $BB10_1
3388; MIPS32O0-NEXT:    nop
3389; MIPS32O0-NEXT:  # %bb.2: # %entry
3390; MIPS32O0-NEXT:    and $5, $6, $1
3391; MIPS32O0-NEXT:    srlv $5, $5, $2
3392; MIPS32O0-NEXT:    sll $5, $5, 24
3393; MIPS32O0-NEXT:    sra $5, $5, 24
3394; MIPS32O0-NEXT:  # %bb.3: # %entry
3395; MIPS32O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
3396; MIPS32O0-NEXT:  # %bb.4: # %entry
3397; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3398; MIPS32O0-NEXT:    sll $2, $1, 24
3399; MIPS32O0-NEXT:    sra $2, $2, 24
3400; MIPS32O0-NEXT:    addiu $sp, $sp, 8
3401; MIPS32O0-NEXT:    jr $ra
3402; MIPS32O0-NEXT:    nop
3403;
3404; MIPS32R2-LABEL: AtomicLoadNand8:
3405; MIPS32R2:       # %bb.0: # %entry
3406; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
3407; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3408; MIPS32R2-NEXT:    addu $1, $2, $25
3409; MIPS32R2-NEXT:    lw $1, %got(y)($1)
3410; MIPS32R2-NEXT:    addiu $2, $zero, -4
3411; MIPS32R2-NEXT:    and $2, $1, $2
3412; MIPS32R2-NEXT:    andi $1, $1, 3
3413; MIPS32R2-NEXT:    sll $3, $1, 3
3414; MIPS32R2-NEXT:    ori $1, $zero, 255
3415; MIPS32R2-NEXT:    sllv $5, $1, $3
3416; MIPS32R2-NEXT:    nor $6, $zero, $5
3417; MIPS32R2-NEXT:    sllv $4, $4, $3
3418; MIPS32R2-NEXT:  $BB10_1: # %entry
3419; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
3420; MIPS32R2-NEXT:    ll $7, 0($2)
3421; MIPS32R2-NEXT:    and $8, $7, $4
3422; MIPS32R2-NEXT:    nor $8, $zero, $8
3423; MIPS32R2-NEXT:    and $8, $8, $5
3424; MIPS32R2-NEXT:    and $9, $7, $6
3425; MIPS32R2-NEXT:    or $9, $9, $8
3426; MIPS32R2-NEXT:    sc $9, 0($2)
3427; MIPS32R2-NEXT:    beqz $9, $BB10_1
3428; MIPS32R2-NEXT:    nop
3429; MIPS32R2-NEXT:  # %bb.2: # %entry
3430; MIPS32R2-NEXT:    and $1, $7, $5
3431; MIPS32R2-NEXT:    srlv $1, $1, $3
3432; MIPS32R2-NEXT:    seb $1, $1
3433; MIPS32R2-NEXT:  # %bb.3: # %entry
3434; MIPS32R2-NEXT:    jr $ra
3435; MIPS32R2-NEXT:    seb $2, $1
3436;
3437; MIPS32R6-LABEL: AtomicLoadNand8:
3438; MIPS32R6:       # %bb.0: # %entry
3439; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
3440; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
3441; MIPS32R6-NEXT:    addu $1, $2, $25
3442; MIPS32R6-NEXT:    lw $1, %got(y)($1)
3443; MIPS32R6-NEXT:    addiu $2, $zero, -4
3444; MIPS32R6-NEXT:    and $2, $1, $2
3445; MIPS32R6-NEXT:    andi $1, $1, 3
3446; MIPS32R6-NEXT:    sll $3, $1, 3
3447; MIPS32R6-NEXT:    ori $1, $zero, 255
3448; MIPS32R6-NEXT:    sllv $5, $1, $3
3449; MIPS32R6-NEXT:    nor $6, $zero, $5
3450; MIPS32R6-NEXT:    sllv $4, $4, $3
3451; MIPS32R6-NEXT:  $BB10_1: # %entry
3452; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
3453; MIPS32R6-NEXT:    ll $7, 0($2)
3454; MIPS32R6-NEXT:    and $8, $7, $4
3455; MIPS32R6-NEXT:    nor $8, $zero, $8
3456; MIPS32R6-NEXT:    and $8, $8, $5
3457; MIPS32R6-NEXT:    and $9, $7, $6
3458; MIPS32R6-NEXT:    or $9, $9, $8
3459; MIPS32R6-NEXT:    sc $9, 0($2)
3460; MIPS32R6-NEXT:    beqzc $9, $BB10_1
3461; MIPS32R6-NEXT:  # %bb.2: # %entry
3462; MIPS32R6-NEXT:    and $1, $7, $5
3463; MIPS32R6-NEXT:    srlv $1, $1, $3
3464; MIPS32R6-NEXT:    seb $1, $1
3465; MIPS32R6-NEXT:  # %bb.3: # %entry
3466; MIPS32R6-NEXT:    jr $ra
3467; MIPS32R6-NEXT:    seb $2, $1
3468;
3469; MIPS32R6O0-LABEL: AtomicLoadNand8:
3470; MIPS32R6O0:       # %bb.0: # %entry
3471; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
3472; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3473; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
3474; MIPS32R6O0-NEXT:    addu $2, $2, $25
3475; MIPS32R6O0-NEXT:    move $25, $4
3476; MIPS32R6O0-NEXT:    lw $2, %got(y)($2)
3477; MIPS32R6O0-NEXT:    addiu $1, $zero, -4
3478; MIPS32R6O0-NEXT:    and $1, $2, $1
3479; MIPS32R6O0-NEXT:    andi $2, $2, 3
3480; MIPS32R6O0-NEXT:    sll $2, $2, 3
3481; MIPS32R6O0-NEXT:    ori $3, $zero, 255
3482; MIPS32R6O0-NEXT:    sllv $3, $3, $2
3483; MIPS32R6O0-NEXT:    nor $5, $zero, $3
3484; MIPS32R6O0-NEXT:    sllv $4, $4, $2
3485; MIPS32R6O0-NEXT:  $BB10_1: # %entry
3486; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3487; MIPS32R6O0-NEXT:    ll $7, 0($1)
3488; MIPS32R6O0-NEXT:    and $8, $7, $4
3489; MIPS32R6O0-NEXT:    nor $8, $zero, $8
3490; MIPS32R6O0-NEXT:    and $8, $8, $3
3491; MIPS32R6O0-NEXT:    and $9, $7, $5
3492; MIPS32R6O0-NEXT:    or $9, $9, $8
3493; MIPS32R6O0-NEXT:    sc $9, 0($1)
3494; MIPS32R6O0-NEXT:    beqzc $9, $BB10_1
3495; MIPS32R6O0-NEXT:  # %bb.2: # %entry
3496; MIPS32R6O0-NEXT:    and $6, $7, $3
3497; MIPS32R6O0-NEXT:    srlv $6, $6, $2
3498; MIPS32R6O0-NEXT:    seb $6, $6
3499; MIPS32R6O0-NEXT:  # %bb.3: # %entry
3500; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
3501; MIPS32R6O0-NEXT:    sw $6, 0($sp) # 4-byte Folded Spill
3502; MIPS32R6O0-NEXT:  # %bb.4: # %entry
3503; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
3504; MIPS32R6O0-NEXT:    seb $2, $1
3505; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
3506; MIPS32R6O0-NEXT:    jrc $ra
3507;
3508; MIPS4-LABEL: AtomicLoadNand8:
3509; MIPS4:       # %bb.0: # %entry
3510; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3511; MIPS4-NEXT:    daddu $1, $1, $25
3512; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3513; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
3514; MIPS4-NEXT:    daddiu $2, $zero, -4
3515; MIPS4-NEXT:    and $2, $1, $2
3516; MIPS4-NEXT:    andi $1, $1, 3
3517; MIPS4-NEXT:    sll $3, $1, 3
3518; MIPS4-NEXT:    ori $1, $zero, 255
3519; MIPS4-NEXT:    sllv $5, $1, $3
3520; MIPS4-NEXT:    nor $6, $zero, $5
3521; MIPS4-NEXT:    sllv $4, $4, $3
3522; MIPS4-NEXT:  .LBB10_1: # %entry
3523; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
3524; MIPS4-NEXT:    ll $7, 0($2)
3525; MIPS4-NEXT:    and $8, $7, $4
3526; MIPS4-NEXT:    nor $8, $zero, $8
3527; MIPS4-NEXT:    and $8, $8, $5
3528; MIPS4-NEXT:    and $9, $7, $6
3529; MIPS4-NEXT:    or $9, $9, $8
3530; MIPS4-NEXT:    sc $9, 0($2)
3531; MIPS4-NEXT:    beqz $9, .LBB10_1
3532; MIPS4-NEXT:    nop
3533; MIPS4-NEXT:  # %bb.2: # %entry
3534; MIPS4-NEXT:    and $1, $7, $5
3535; MIPS4-NEXT:    srlv $1, $1, $3
3536; MIPS4-NEXT:    sll $1, $1, 24
3537; MIPS4-NEXT:    sra $1, $1, 24
3538; MIPS4-NEXT:  # %bb.3: # %entry
3539; MIPS4-NEXT:    sll $1, $1, 24
3540; MIPS4-NEXT:    jr $ra
3541; MIPS4-NEXT:    sra $2, $1, 24
3542;
3543; MIPS64-LABEL: AtomicLoadNand8:
3544; MIPS64:       # %bb.0: # %entry
3545; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3546; MIPS64-NEXT:    daddu $1, $1, $25
3547; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3548; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
3549; MIPS64-NEXT:    daddiu $2, $zero, -4
3550; MIPS64-NEXT:    and $2, $1, $2
3551; MIPS64-NEXT:    andi $1, $1, 3
3552; MIPS64-NEXT:    sll $3, $1, 3
3553; MIPS64-NEXT:    ori $1, $zero, 255
3554; MIPS64-NEXT:    sllv $5, $1, $3
3555; MIPS64-NEXT:    nor $6, $zero, $5
3556; MIPS64-NEXT:    sllv $4, $4, $3
3557; MIPS64-NEXT:  .LBB10_1: # %entry
3558; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
3559; MIPS64-NEXT:    ll $7, 0($2)
3560; MIPS64-NEXT:    and $8, $7, $4
3561; MIPS64-NEXT:    nor $8, $zero, $8
3562; MIPS64-NEXT:    and $8, $8, $5
3563; MIPS64-NEXT:    and $9, $7, $6
3564; MIPS64-NEXT:    or $9, $9, $8
3565; MIPS64-NEXT:    sc $9, 0($2)
3566; MIPS64-NEXT:    beqz $9, .LBB10_1
3567; MIPS64-NEXT:    nop
3568; MIPS64-NEXT:  # %bb.2: # %entry
3569; MIPS64-NEXT:    and $1, $7, $5
3570; MIPS64-NEXT:    srlv $1, $1, $3
3571; MIPS64-NEXT:    sll $1, $1, 24
3572; MIPS64-NEXT:    sra $1, $1, 24
3573; MIPS64-NEXT:  # %bb.3: # %entry
3574; MIPS64-NEXT:    sll $1, $1, 24
3575; MIPS64-NEXT:    jr $ra
3576; MIPS64-NEXT:    sra $2, $1, 24
3577;
3578; MIPS64R2-LABEL: AtomicLoadNand8:
3579; MIPS64R2:       # %bb.0: # %entry
3580; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3581; MIPS64R2-NEXT:    daddu $1, $1, $25
3582; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3583; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
3584; MIPS64R2-NEXT:    daddiu $2, $zero, -4
3585; MIPS64R2-NEXT:    and $2, $1, $2
3586; MIPS64R2-NEXT:    andi $1, $1, 3
3587; MIPS64R2-NEXT:    sll $3, $1, 3
3588; MIPS64R2-NEXT:    ori $1, $zero, 255
3589; MIPS64R2-NEXT:    sllv $5, $1, $3
3590; MIPS64R2-NEXT:    nor $6, $zero, $5
3591; MIPS64R2-NEXT:    sllv $4, $4, $3
3592; MIPS64R2-NEXT:  .LBB10_1: # %entry
3593; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
3594; MIPS64R2-NEXT:    ll $7, 0($2)
3595; MIPS64R2-NEXT:    and $8, $7, $4
3596; MIPS64R2-NEXT:    nor $8, $zero, $8
3597; MIPS64R2-NEXT:    and $8, $8, $5
3598; MIPS64R2-NEXT:    and $9, $7, $6
3599; MIPS64R2-NEXT:    or $9, $9, $8
3600; MIPS64R2-NEXT:    sc $9, 0($2)
3601; MIPS64R2-NEXT:    beqz $9, .LBB10_1
3602; MIPS64R2-NEXT:    nop
3603; MIPS64R2-NEXT:  # %bb.2: # %entry
3604; MIPS64R2-NEXT:    and $1, $7, $5
3605; MIPS64R2-NEXT:    srlv $1, $1, $3
3606; MIPS64R2-NEXT:    seb $1, $1
3607; MIPS64R2-NEXT:  # %bb.3: # %entry
3608; MIPS64R2-NEXT:    jr $ra
3609; MIPS64R2-NEXT:    seb $2, $1
3610;
3611; MIPS64R6-LABEL: AtomicLoadNand8:
3612; MIPS64R6:       # %bb.0: # %entry
3613; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3614; MIPS64R6-NEXT:    daddu $1, $1, $25
3615; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3616; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
3617; MIPS64R6-NEXT:    daddiu $2, $zero, -4
3618; MIPS64R6-NEXT:    and $2, $1, $2
3619; MIPS64R6-NEXT:    andi $1, $1, 3
3620; MIPS64R6-NEXT:    sll $3, $1, 3
3621; MIPS64R6-NEXT:    ori $1, $zero, 255
3622; MIPS64R6-NEXT:    sllv $5, $1, $3
3623; MIPS64R6-NEXT:    nor $6, $zero, $5
3624; MIPS64R6-NEXT:    sllv $4, $4, $3
3625; MIPS64R6-NEXT:  .LBB10_1: # %entry
3626; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
3627; MIPS64R6-NEXT:    ll $7, 0($2)
3628; MIPS64R6-NEXT:    and $8, $7, $4
3629; MIPS64R6-NEXT:    nor $8, $zero, $8
3630; MIPS64R6-NEXT:    and $8, $8, $5
3631; MIPS64R6-NEXT:    and $9, $7, $6
3632; MIPS64R6-NEXT:    or $9, $9, $8
3633; MIPS64R6-NEXT:    sc $9, 0($2)
3634; MIPS64R6-NEXT:    beqzc $9, .LBB10_1
3635; MIPS64R6-NEXT:  # %bb.2: # %entry
3636; MIPS64R6-NEXT:    and $1, $7, $5
3637; MIPS64R6-NEXT:    srlv $1, $1, $3
3638; MIPS64R6-NEXT:    seb $1, $1
3639; MIPS64R6-NEXT:  # %bb.3: # %entry
3640; MIPS64R6-NEXT:    jr $ra
3641; MIPS64R6-NEXT:    seb $2, $1
3642;
3643; MIPS64R6O0-LABEL: AtomicLoadNand8:
3644; MIPS64R6O0:       # %bb.0: # %entry
3645; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
3646; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3647; MIPS64R6O0-NEXT:    daddu $1, $1, $25
3648; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3649; MIPS64R6O0-NEXT:    move $2, $4
3650; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
3651; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
3652; MIPS64R6O0-NEXT:    and $4, $1, $4
3653; MIPS64R6O0-NEXT:    andi $3, $1, 3
3654; MIPS64R6O0-NEXT:    xori $3, $3, 3
3655; MIPS64R6O0-NEXT:    sll $3, $3, 3
3656; MIPS64R6O0-NEXT:    ori $5, $zero, 255
3657; MIPS64R6O0-NEXT:    sllv $5, $5, $3
3658; MIPS64R6O0-NEXT:    nor $6, $zero, $5
3659; MIPS64R6O0-NEXT:    sllv $2, $2, $3
3660; MIPS64R6O0-NEXT:  .LBB10_1: # %entry
3661; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3662; MIPS64R6O0-NEXT:    ll $8, 0($4)
3663; MIPS64R6O0-NEXT:    and $9, $8, $2
3664; MIPS64R6O0-NEXT:    nor $9, $zero, $9
3665; MIPS64R6O0-NEXT:    and $9, $9, $5
3666; MIPS64R6O0-NEXT:    and $10, $8, $6
3667; MIPS64R6O0-NEXT:    or $10, $10, $9
3668; MIPS64R6O0-NEXT:    sc $10, 0($4)
3669; MIPS64R6O0-NEXT:    beqzc $10, .LBB10_1
3670; MIPS64R6O0-NEXT:  # %bb.2: # %entry
3671; MIPS64R6O0-NEXT:    and $7, $8, $5
3672; MIPS64R6O0-NEXT:    srlv $7, $7, $3
3673; MIPS64R6O0-NEXT:    seb $7, $7
3674; MIPS64R6O0-NEXT:  # %bb.3: # %entry
3675; MIPS64R6O0-NEXT:    sw $7, 12($sp) # 4-byte Folded Spill
3676; MIPS64R6O0-NEXT:  # %bb.4: # %entry
3677; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
3678; MIPS64R6O0-NEXT:    seb $2, $1
3679; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
3680; MIPS64R6O0-NEXT:    jrc $ra
3681;
3682; MM32-LABEL: AtomicLoadNand8:
3683; MM32:       # %bb.0: # %entry
3684; MM32-NEXT:    lui $2, %hi(_gp_disp)
3685; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3686; MM32-NEXT:    addu $2, $2, $25
3687; MM32-NEXT:    lw $1, %got(y)($2)
3688; MM32-NEXT:    addiu $2, $zero, -4
3689; MM32-NEXT:    and $2, $1, $2
3690; MM32-NEXT:    andi $1, $1, 3
3691; MM32-NEXT:    sll $3, $1, 3
3692; MM32-NEXT:    ori $1, $zero, 255
3693; MM32-NEXT:    sllv $5, $1, $3
3694; MM32-NEXT:    nor $6, $zero, $5
3695; MM32-NEXT:    sllv $4, $4, $3
3696; MM32-NEXT:  $BB10_1: # %entry
3697; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
3698; MM32-NEXT:    ll $7, 0($2)
3699; MM32-NEXT:    and $8, $7, $4
3700; MM32-NEXT:    nor $8, $zero, $8
3701; MM32-NEXT:    and $8, $8, $5
3702; MM32-NEXT:    and $9, $7, $6
3703; MM32-NEXT:    or $9, $9, $8
3704; MM32-NEXT:    sc $9, 0($2)
3705; MM32-NEXT:    beqzc $9, $BB10_1
3706; MM32-NEXT:  # %bb.2: # %entry
3707; MM32-NEXT:    and $1, $7, $5
3708; MM32-NEXT:    srlv $1, $1, $3
3709; MM32-NEXT:    seb $1, $1
3710; MM32-NEXT:  # %bb.3: # %entry
3711; MM32-NEXT:    jr $ra
3712; MM32-NEXT:    seb $2, $1
3713;
3714; O1-LABEL: AtomicLoadNand8:
3715; O1:       # %bb.0: # %entry
3716; O1-NEXT:    lui $2, %hi(_gp_disp)
3717; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
3718; O1-NEXT:    addu $1, $2, $25
3719; O1-NEXT:    lw $1, %got(y)($1)
3720; O1-NEXT:    addiu $2, $zero, -4
3721; O1-NEXT:    and $2, $1, $2
3722; O1-NEXT:    andi $1, $1, 3
3723; O1-NEXT:    sll $3, $1, 3
3724; O1-NEXT:    ori $1, $zero, 255
3725; O1-NEXT:    sllv $5, $1, $3
3726; O1-NEXT:    nor $6, $zero, $5
3727; O1-NEXT:    sllv $4, $4, $3
3728; O1-NEXT:  $BB10_1: # %entry
3729; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3730; O1-NEXT:    ll $7, 0($2)
3731; O1-NEXT:    and $8, $7, $4
3732; O1-NEXT:    nor $8, $zero, $8
3733; O1-NEXT:    and $8, $8, $5
3734; O1-NEXT:    and $9, $7, $6
3735; O1-NEXT:    or $9, $9, $8
3736; O1-NEXT:    sc $9, 0($2)
3737; O1-NEXT:    beqz $9, $BB10_1
3738; O1-NEXT:    nop
3739; O1-NEXT:  # %bb.2: # %entry
3740; O1-NEXT:    and $1, $7, $5
3741; O1-NEXT:    srlv $1, $1, $3
3742; O1-NEXT:    sll $1, $1, 24
3743; O1-NEXT:    sra $1, $1, 24
3744; O1-NEXT:  # %bb.3: # %entry
3745; O1-NEXT:    sll $1, $1, 24
3746; O1-NEXT:    jr $ra
3747; O1-NEXT:    sra $2, $1, 24
3748;
3749; O2-LABEL: AtomicLoadNand8:
3750; O2:       # %bb.0: # %entry
3751; O2-NEXT:    lui $2, %hi(_gp_disp)
3752; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3753; O2-NEXT:    addu $1, $2, $25
3754; O2-NEXT:    lw $1, %got(y)($1)
3755; O2-NEXT:    addiu $2, $zero, -4
3756; O2-NEXT:    and $2, $1, $2
3757; O2-NEXT:    andi $1, $1, 3
3758; O2-NEXT:    sll $3, $1, 3
3759; O2-NEXT:    ori $1, $zero, 255
3760; O2-NEXT:    sllv $5, $1, $3
3761; O2-NEXT:    nor $6, $zero, $5
3762; O2-NEXT:    sllv $4, $4, $3
3763; O2-NEXT:  $BB10_1: # %entry
3764; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3765; O2-NEXT:    ll $7, 0($2)
3766; O2-NEXT:    and $8, $7, $4
3767; O2-NEXT:    nor $8, $zero, $8
3768; O2-NEXT:    and $8, $8, $5
3769; O2-NEXT:    and $9, $7, $6
3770; O2-NEXT:    or $9, $9, $8
3771; O2-NEXT:    sc $9, 0($2)
3772; O2-NEXT:    beqz $9, $BB10_1
3773; O2-NEXT:    nop
3774; O2-NEXT:  # %bb.2: # %entry
3775; O2-NEXT:    and $1, $7, $5
3776; O2-NEXT:    srlv $1, $1, $3
3777; O2-NEXT:    sll $1, $1, 24
3778; O2-NEXT:    sra $1, $1, 24
3779; O2-NEXT:  # %bb.3: # %entry
3780; O2-NEXT:    sll $1, $1, 24
3781; O2-NEXT:    jr $ra
3782; O2-NEXT:    sra $2, $1, 24
3783;
3784; O3-LABEL: AtomicLoadNand8:
3785; O3:       # %bb.0: # %entry
3786; O3-NEXT:    lui $2, %hi(_gp_disp)
3787; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
3788; O3-NEXT:    addu $1, $2, $25
3789; O3-NEXT:    addiu $2, $zero, -4
3790; O3-NEXT:    lw $1, %got(y)($1)
3791; O3-NEXT:    and $2, $1, $2
3792; O3-NEXT:    andi $1, $1, 3
3793; O3-NEXT:    sll $3, $1, 3
3794; O3-NEXT:    ori $1, $zero, 255
3795; O3-NEXT:    sllv $5, $1, $3
3796; O3-NEXT:    sllv $4, $4, $3
3797; O3-NEXT:    nor $6, $zero, $5
3798; O3-NEXT:  $BB10_1: # %entry
3799; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3800; O3-NEXT:    ll $7, 0($2)
3801; O3-NEXT:    and $8, $7, $4
3802; O3-NEXT:    nor $8, $zero, $8
3803; O3-NEXT:    and $8, $8, $5
3804; O3-NEXT:    and $9, $7, $6
3805; O3-NEXT:    or $9, $9, $8
3806; O3-NEXT:    sc $9, 0($2)
3807; O3-NEXT:    beqz $9, $BB10_1
3808; O3-NEXT:    nop
3809; O3-NEXT:  # %bb.2: # %entry
3810; O3-NEXT:    and $1, $7, $5
3811; O3-NEXT:    srlv $1, $1, $3
3812; O3-NEXT:    sll $1, $1, 24
3813; O3-NEXT:    sra $1, $1, 24
3814; O3-NEXT:  # %bb.3: # %entry
3815; O3-NEXT:    sll $1, $1, 24
3816; O3-NEXT:    jr $ra
3817; O3-NEXT:    sra $2, $1, 24
3818;
3819; MIPS32EB-LABEL: AtomicLoadNand8:
3820; MIPS32EB:       # %bb.0: # %entry
3821; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
3822; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
3823; MIPS32EB-NEXT:    addu $1, $2, $25
3824; MIPS32EB-NEXT:    lw $1, %got(y)($1)
3825; MIPS32EB-NEXT:    addiu $2, $zero, -4
3826; MIPS32EB-NEXT:    and $2, $1, $2
3827; MIPS32EB-NEXT:    andi $1, $1, 3
3828; MIPS32EB-NEXT:    xori $1, $1, 3
3829; MIPS32EB-NEXT:    sll $3, $1, 3
3830; MIPS32EB-NEXT:    ori $1, $zero, 255
3831; MIPS32EB-NEXT:    sllv $5, $1, $3
3832; MIPS32EB-NEXT:    nor $6, $zero, $5
3833; MIPS32EB-NEXT:    sllv $4, $4, $3
3834; MIPS32EB-NEXT:  $BB10_1: # %entry
3835; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
3836; MIPS32EB-NEXT:    ll $7, 0($2)
3837; MIPS32EB-NEXT:    and $8, $7, $4
3838; MIPS32EB-NEXT:    nor $8, $zero, $8
3839; MIPS32EB-NEXT:    and $8, $8, $5
3840; MIPS32EB-NEXT:    and $9, $7, $6
3841; MIPS32EB-NEXT:    or $9, $9, $8
3842; MIPS32EB-NEXT:    sc $9, 0($2)
3843; MIPS32EB-NEXT:    beqz $9, $BB10_1
3844; MIPS32EB-NEXT:    nop
3845; MIPS32EB-NEXT:  # %bb.2: # %entry
3846; MIPS32EB-NEXT:    and $1, $7, $5
3847; MIPS32EB-NEXT:    srlv $1, $1, $3
3848; MIPS32EB-NEXT:    sll $1, $1, 24
3849; MIPS32EB-NEXT:    sra $1, $1, 24
3850; MIPS32EB-NEXT:  # %bb.3: # %entry
3851; MIPS32EB-NEXT:    sll $1, $1, 24
3852; MIPS32EB-NEXT:    jr $ra
3853; MIPS32EB-NEXT:    sra $2, $1, 24
3854entry:
3855  %0 = atomicrmw nand i8* @y, i8 %incr monotonic
3856  ret i8 %0
3857
3858}
3859
3860define signext i8 @AtomicSwap8(i8 signext %newval) nounwind {
3861; MIPS32-LABEL: AtomicSwap8:
3862; MIPS32:       # %bb.0: # %entry
3863; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
3864; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3865; MIPS32-NEXT:    addu $1, $2, $25
3866; MIPS32-NEXT:    lw $1, %got(y)($1)
3867; MIPS32-NEXT:    addiu $2, $zero, -4
3868; MIPS32-NEXT:    and $2, $1, $2
3869; MIPS32-NEXT:    andi $1, $1, 3
3870; MIPS32-NEXT:    sll $3, $1, 3
3871; MIPS32-NEXT:    ori $1, $zero, 255
3872; MIPS32-NEXT:    sllv $5, $1, $3
3873; MIPS32-NEXT:    nor $6, $zero, $5
3874; MIPS32-NEXT:    sllv $4, $4, $3
3875; MIPS32-NEXT:  $BB11_1: # %entry
3876; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
3877; MIPS32-NEXT:    ll $7, 0($2)
3878; MIPS32-NEXT:    and $8, $4, $5
3879; MIPS32-NEXT:    and $9, $7, $6
3880; MIPS32-NEXT:    or $9, $9, $8
3881; MIPS32-NEXT:    sc $9, 0($2)
3882; MIPS32-NEXT:    beqz $9, $BB11_1
3883; MIPS32-NEXT:    nop
3884; MIPS32-NEXT:  # %bb.2: # %entry
3885; MIPS32-NEXT:    and $1, $7, $5
3886; MIPS32-NEXT:    srlv $1, $1, $3
3887; MIPS32-NEXT:    sll $1, $1, 24
3888; MIPS32-NEXT:    sra $1, $1, 24
3889; MIPS32-NEXT:  # %bb.3: # %entry
3890; MIPS32-NEXT:    sll $1, $1, 24
3891; MIPS32-NEXT:    jr $ra
3892; MIPS32-NEXT:    sra $2, $1, 24
3893;
3894; MIPS32O0-LABEL: AtomicSwap8:
3895; MIPS32O0:       # %bb.0: # %entry
3896; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
3897; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3898; MIPS32O0-NEXT:    addiu $sp, $sp, -8
3899; MIPS32O0-NEXT:    addu $2, $2, $25
3900; MIPS32O0-NEXT:    lw $2, %got(y)($2)
3901; MIPS32O0-NEXT:    addiu $25, $zero, -4
3902; MIPS32O0-NEXT:    and $25, $2, $25
3903; MIPS32O0-NEXT:    andi $2, $2, 3
3904; MIPS32O0-NEXT:    sll $2, $2, 3
3905; MIPS32O0-NEXT:    ori $1, $zero, 255
3906; MIPS32O0-NEXT:    sllv $1, $1, $2
3907; MIPS32O0-NEXT:    nor $3, $zero, $1
3908; MIPS32O0-NEXT:    sllv $4, $4, $2
3909; MIPS32O0-NEXT:  $BB11_1: # %entry
3910; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
3911; MIPS32O0-NEXT:    ll $6, 0($25)
3912; MIPS32O0-NEXT:    and $7, $4, $1
3913; MIPS32O0-NEXT:    and $8, $6, $3
3914; MIPS32O0-NEXT:    or $8, $8, $7
3915; MIPS32O0-NEXT:    sc $8, 0($25)
3916; MIPS32O0-NEXT:    beqz $8, $BB11_1
3917; MIPS32O0-NEXT:    nop
3918; MIPS32O0-NEXT:  # %bb.2: # %entry
3919; MIPS32O0-NEXT:    and $5, $6, $1
3920; MIPS32O0-NEXT:    srlv $5, $5, $2
3921; MIPS32O0-NEXT:    sll $5, $5, 24
3922; MIPS32O0-NEXT:    sra $5, $5, 24
3923; MIPS32O0-NEXT:  # %bb.3: # %entry
3924; MIPS32O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
3925; MIPS32O0-NEXT:  # %bb.4: # %entry
3926; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3927; MIPS32O0-NEXT:    sll $2, $1, 24
3928; MIPS32O0-NEXT:    sra $2, $2, 24
3929; MIPS32O0-NEXT:    addiu $sp, $sp, 8
3930; MIPS32O0-NEXT:    jr $ra
3931; MIPS32O0-NEXT:    nop
3932;
3933; MIPS32R2-LABEL: AtomicSwap8:
3934; MIPS32R2:       # %bb.0: # %entry
3935; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
3936; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3937; MIPS32R2-NEXT:    addu $1, $2, $25
3938; MIPS32R2-NEXT:    lw $1, %got(y)($1)
3939; MIPS32R2-NEXT:    addiu $2, $zero, -4
3940; MIPS32R2-NEXT:    and $2, $1, $2
3941; MIPS32R2-NEXT:    andi $1, $1, 3
3942; MIPS32R2-NEXT:    sll $3, $1, 3
3943; MIPS32R2-NEXT:    ori $1, $zero, 255
3944; MIPS32R2-NEXT:    sllv $5, $1, $3
3945; MIPS32R2-NEXT:    nor $6, $zero, $5
3946; MIPS32R2-NEXT:    sllv $4, $4, $3
3947; MIPS32R2-NEXT:  $BB11_1: # %entry
3948; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
3949; MIPS32R2-NEXT:    ll $7, 0($2)
3950; MIPS32R2-NEXT:    and $8, $4, $5
3951; MIPS32R2-NEXT:    and $9, $7, $6
3952; MIPS32R2-NEXT:    or $9, $9, $8
3953; MIPS32R2-NEXT:    sc $9, 0($2)
3954; MIPS32R2-NEXT:    beqz $9, $BB11_1
3955; MIPS32R2-NEXT:    nop
3956; MIPS32R2-NEXT:  # %bb.2: # %entry
3957; MIPS32R2-NEXT:    and $1, $7, $5
3958; MIPS32R2-NEXT:    srlv $1, $1, $3
3959; MIPS32R2-NEXT:    seb $1, $1
3960; MIPS32R2-NEXT:  # %bb.3: # %entry
3961; MIPS32R2-NEXT:    jr $ra
3962; MIPS32R2-NEXT:    seb $2, $1
3963;
3964; MIPS32R6-LABEL: AtomicSwap8:
3965; MIPS32R6:       # %bb.0: # %entry
3966; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
3967; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
3968; MIPS32R6-NEXT:    addu $1, $2, $25
3969; MIPS32R6-NEXT:    lw $1, %got(y)($1)
3970; MIPS32R6-NEXT:    addiu $2, $zero, -4
3971; MIPS32R6-NEXT:    and $2, $1, $2
3972; MIPS32R6-NEXT:    andi $1, $1, 3
3973; MIPS32R6-NEXT:    sll $3, $1, 3
3974; MIPS32R6-NEXT:    ori $1, $zero, 255
3975; MIPS32R6-NEXT:    sllv $5, $1, $3
3976; MIPS32R6-NEXT:    nor $6, $zero, $5
3977; MIPS32R6-NEXT:    sllv $4, $4, $3
3978; MIPS32R6-NEXT:  $BB11_1: # %entry
3979; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
3980; MIPS32R6-NEXT:    ll $7, 0($2)
3981; MIPS32R6-NEXT:    and $8, $4, $5
3982; MIPS32R6-NEXT:    and $9, $7, $6
3983; MIPS32R6-NEXT:    or $9, $9, $8
3984; MIPS32R6-NEXT:    sc $9, 0($2)
3985; MIPS32R6-NEXT:    beqzc $9, $BB11_1
3986; MIPS32R6-NEXT:  # %bb.2: # %entry
3987; MIPS32R6-NEXT:    and $1, $7, $5
3988; MIPS32R6-NEXT:    srlv $1, $1, $3
3989; MIPS32R6-NEXT:    seb $1, $1
3990; MIPS32R6-NEXT:  # %bb.3: # %entry
3991; MIPS32R6-NEXT:    jr $ra
3992; MIPS32R6-NEXT:    seb $2, $1
3993;
3994; MIPS32R6O0-LABEL: AtomicSwap8:
3995; MIPS32R6O0:       # %bb.0: # %entry
3996; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
3997; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3998; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
3999; MIPS32R6O0-NEXT:    addu $2, $2, $25
4000; MIPS32R6O0-NEXT:    move $25, $4
4001; MIPS32R6O0-NEXT:    lw $2, %got(y)($2)
4002; MIPS32R6O0-NEXT:    addiu $1, $zero, -4
4003; MIPS32R6O0-NEXT:    and $1, $2, $1
4004; MIPS32R6O0-NEXT:    andi $2, $2, 3
4005; MIPS32R6O0-NEXT:    sll $2, $2, 3
4006; MIPS32R6O0-NEXT:    ori $3, $zero, 255
4007; MIPS32R6O0-NEXT:    sllv $3, $3, $2
4008; MIPS32R6O0-NEXT:    nor $5, $zero, $3
4009; MIPS32R6O0-NEXT:    sllv $4, $4, $2
4010; MIPS32R6O0-NEXT:  $BB11_1: # %entry
4011; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4012; MIPS32R6O0-NEXT:    ll $7, 0($1)
4013; MIPS32R6O0-NEXT:    and $8, $4, $3
4014; MIPS32R6O0-NEXT:    and $9, $7, $5
4015; MIPS32R6O0-NEXT:    or $9, $9, $8
4016; MIPS32R6O0-NEXT:    sc $9, 0($1)
4017; MIPS32R6O0-NEXT:    beqzc $9, $BB11_1
4018; MIPS32R6O0-NEXT:  # %bb.2: # %entry
4019; MIPS32R6O0-NEXT:    and $6, $7, $3
4020; MIPS32R6O0-NEXT:    srlv $6, $6, $2
4021; MIPS32R6O0-NEXT:    seb $6, $6
4022; MIPS32R6O0-NEXT:  # %bb.3: # %entry
4023; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
4024; MIPS32R6O0-NEXT:    sw $6, 0($sp) # 4-byte Folded Spill
4025; MIPS32R6O0-NEXT:  # %bb.4: # %entry
4026; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
4027; MIPS32R6O0-NEXT:    seb $2, $1
4028; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
4029; MIPS32R6O0-NEXT:    jrc $ra
4030;
4031; MIPS4-LABEL: AtomicSwap8:
4032; MIPS4:       # %bb.0: # %entry
4033; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4034; MIPS4-NEXT:    daddu $1, $1, $25
4035; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4036; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
4037; MIPS4-NEXT:    daddiu $2, $zero, -4
4038; MIPS4-NEXT:    and $2, $1, $2
4039; MIPS4-NEXT:    andi $1, $1, 3
4040; MIPS4-NEXT:    sll $3, $1, 3
4041; MIPS4-NEXT:    ori $1, $zero, 255
4042; MIPS4-NEXT:    sllv $5, $1, $3
4043; MIPS4-NEXT:    nor $6, $zero, $5
4044; MIPS4-NEXT:    sllv $4, $4, $3
4045; MIPS4-NEXT:  .LBB11_1: # %entry
4046; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
4047; MIPS4-NEXT:    ll $7, 0($2)
4048; MIPS4-NEXT:    and $8, $4, $5
4049; MIPS4-NEXT:    and $9, $7, $6
4050; MIPS4-NEXT:    or $9, $9, $8
4051; MIPS4-NEXT:    sc $9, 0($2)
4052; MIPS4-NEXT:    beqz $9, .LBB11_1
4053; MIPS4-NEXT:    nop
4054; MIPS4-NEXT:  # %bb.2: # %entry
4055; MIPS4-NEXT:    and $1, $7, $5
4056; MIPS4-NEXT:    srlv $1, $1, $3
4057; MIPS4-NEXT:    sll $1, $1, 24
4058; MIPS4-NEXT:    sra $1, $1, 24
4059; MIPS4-NEXT:  # %bb.3: # %entry
4060; MIPS4-NEXT:    sll $1, $1, 24
4061; MIPS4-NEXT:    jr $ra
4062; MIPS4-NEXT:    sra $2, $1, 24
4063;
4064; MIPS64-LABEL: AtomicSwap8:
4065; MIPS64:       # %bb.0: # %entry
4066; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4067; MIPS64-NEXT:    daddu $1, $1, $25
4068; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4069; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
4070; MIPS64-NEXT:    daddiu $2, $zero, -4
4071; MIPS64-NEXT:    and $2, $1, $2
4072; MIPS64-NEXT:    andi $1, $1, 3
4073; MIPS64-NEXT:    sll $3, $1, 3
4074; MIPS64-NEXT:    ori $1, $zero, 255
4075; MIPS64-NEXT:    sllv $5, $1, $3
4076; MIPS64-NEXT:    nor $6, $zero, $5
4077; MIPS64-NEXT:    sllv $4, $4, $3
4078; MIPS64-NEXT:  .LBB11_1: # %entry
4079; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
4080; MIPS64-NEXT:    ll $7, 0($2)
4081; MIPS64-NEXT:    and $8, $4, $5
4082; MIPS64-NEXT:    and $9, $7, $6
4083; MIPS64-NEXT:    or $9, $9, $8
4084; MIPS64-NEXT:    sc $9, 0($2)
4085; MIPS64-NEXT:    beqz $9, .LBB11_1
4086; MIPS64-NEXT:    nop
4087; MIPS64-NEXT:  # %bb.2: # %entry
4088; MIPS64-NEXT:    and $1, $7, $5
4089; MIPS64-NEXT:    srlv $1, $1, $3
4090; MIPS64-NEXT:    sll $1, $1, 24
4091; MIPS64-NEXT:    sra $1, $1, 24
4092; MIPS64-NEXT:  # %bb.3: # %entry
4093; MIPS64-NEXT:    sll $1, $1, 24
4094; MIPS64-NEXT:    jr $ra
4095; MIPS64-NEXT:    sra $2, $1, 24
4096;
4097; MIPS64R2-LABEL: AtomicSwap8:
4098; MIPS64R2:       # %bb.0: # %entry
4099; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4100; MIPS64R2-NEXT:    daddu $1, $1, $25
4101; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4102; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
4103; MIPS64R2-NEXT:    daddiu $2, $zero, -4
4104; MIPS64R2-NEXT:    and $2, $1, $2
4105; MIPS64R2-NEXT:    andi $1, $1, 3
4106; MIPS64R2-NEXT:    sll $3, $1, 3
4107; MIPS64R2-NEXT:    ori $1, $zero, 255
4108; MIPS64R2-NEXT:    sllv $5, $1, $3
4109; MIPS64R2-NEXT:    nor $6, $zero, $5
4110; MIPS64R2-NEXT:    sllv $4, $4, $3
4111; MIPS64R2-NEXT:  .LBB11_1: # %entry
4112; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
4113; MIPS64R2-NEXT:    ll $7, 0($2)
4114; MIPS64R2-NEXT:    and $8, $4, $5
4115; MIPS64R2-NEXT:    and $9, $7, $6
4116; MIPS64R2-NEXT:    or $9, $9, $8
4117; MIPS64R2-NEXT:    sc $9, 0($2)
4118; MIPS64R2-NEXT:    beqz $9, .LBB11_1
4119; MIPS64R2-NEXT:    nop
4120; MIPS64R2-NEXT:  # %bb.2: # %entry
4121; MIPS64R2-NEXT:    and $1, $7, $5
4122; MIPS64R2-NEXT:    srlv $1, $1, $3
4123; MIPS64R2-NEXT:    seb $1, $1
4124; MIPS64R2-NEXT:  # %bb.3: # %entry
4125; MIPS64R2-NEXT:    jr $ra
4126; MIPS64R2-NEXT:    seb $2, $1
4127;
4128; MIPS64R6-LABEL: AtomicSwap8:
4129; MIPS64R6:       # %bb.0: # %entry
4130; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4131; MIPS64R6-NEXT:    daddu $1, $1, $25
4132; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4133; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
4134; MIPS64R6-NEXT:    daddiu $2, $zero, -4
4135; MIPS64R6-NEXT:    and $2, $1, $2
4136; MIPS64R6-NEXT:    andi $1, $1, 3
4137; MIPS64R6-NEXT:    sll $3, $1, 3
4138; MIPS64R6-NEXT:    ori $1, $zero, 255
4139; MIPS64R6-NEXT:    sllv $5, $1, $3
4140; MIPS64R6-NEXT:    nor $6, $zero, $5
4141; MIPS64R6-NEXT:    sllv $4, $4, $3
4142; MIPS64R6-NEXT:  .LBB11_1: # %entry
4143; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
4144; MIPS64R6-NEXT:    ll $7, 0($2)
4145; MIPS64R6-NEXT:    and $8, $4, $5
4146; MIPS64R6-NEXT:    and $9, $7, $6
4147; MIPS64R6-NEXT:    or $9, $9, $8
4148; MIPS64R6-NEXT:    sc $9, 0($2)
4149; MIPS64R6-NEXT:    beqzc $9, .LBB11_1
4150; MIPS64R6-NEXT:  # %bb.2: # %entry
4151; MIPS64R6-NEXT:    and $1, $7, $5
4152; MIPS64R6-NEXT:    srlv $1, $1, $3
4153; MIPS64R6-NEXT:    seb $1, $1
4154; MIPS64R6-NEXT:  # %bb.3: # %entry
4155; MIPS64R6-NEXT:    jr $ra
4156; MIPS64R6-NEXT:    seb $2, $1
4157;
4158; MIPS64R6O0-LABEL: AtomicSwap8:
4159; MIPS64R6O0:       # %bb.0: # %entry
4160; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
4161; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4162; MIPS64R6O0-NEXT:    daddu $1, $1, $25
4163; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4164; MIPS64R6O0-NEXT:    move $2, $4
4165; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
4166; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
4167; MIPS64R6O0-NEXT:    and $4, $1, $4
4168; MIPS64R6O0-NEXT:    andi $3, $1, 3
4169; MIPS64R6O0-NEXT:    xori $3, $3, 3
4170; MIPS64R6O0-NEXT:    sll $3, $3, 3
4171; MIPS64R6O0-NEXT:    ori $5, $zero, 255
4172; MIPS64R6O0-NEXT:    sllv $5, $5, $3
4173; MIPS64R6O0-NEXT:    nor $6, $zero, $5
4174; MIPS64R6O0-NEXT:    sllv $2, $2, $3
4175; MIPS64R6O0-NEXT:  .LBB11_1: # %entry
4176; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4177; MIPS64R6O0-NEXT:    ll $8, 0($4)
4178; MIPS64R6O0-NEXT:    and $9, $2, $5
4179; MIPS64R6O0-NEXT:    and $10, $8, $6
4180; MIPS64R6O0-NEXT:    or $10, $10, $9
4181; MIPS64R6O0-NEXT:    sc $10, 0($4)
4182; MIPS64R6O0-NEXT:    beqzc $10, .LBB11_1
4183; MIPS64R6O0-NEXT:  # %bb.2: # %entry
4184; MIPS64R6O0-NEXT:    and $7, $8, $5
4185; MIPS64R6O0-NEXT:    srlv $7, $7, $3
4186; MIPS64R6O0-NEXT:    seb $7, $7
4187; MIPS64R6O0-NEXT:  # %bb.3: # %entry
4188; MIPS64R6O0-NEXT:    sw $7, 12($sp) # 4-byte Folded Spill
4189; MIPS64R6O0-NEXT:  # %bb.4: # %entry
4190; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
4191; MIPS64R6O0-NEXT:    seb $2, $1
4192; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
4193; MIPS64R6O0-NEXT:    jrc $ra
4194;
4195; MM32-LABEL: AtomicSwap8:
4196; MM32:       # %bb.0: # %entry
4197; MM32-NEXT:    lui $2, %hi(_gp_disp)
4198; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4199; MM32-NEXT:    addu $2, $2, $25
4200; MM32-NEXT:    lw $1, %got(y)($2)
4201; MM32-NEXT:    addiu $2, $zero, -4
4202; MM32-NEXT:    and $2, $1, $2
4203; MM32-NEXT:    andi $1, $1, 3
4204; MM32-NEXT:    sll $3, $1, 3
4205; MM32-NEXT:    ori $1, $zero, 255
4206; MM32-NEXT:    sllv $5, $1, $3
4207; MM32-NEXT:    nor $6, $zero, $5
4208; MM32-NEXT:    sllv $4, $4, $3
4209; MM32-NEXT:  $BB11_1: # %entry
4210; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
4211; MM32-NEXT:    ll $7, 0($2)
4212; MM32-NEXT:    and $8, $4, $5
4213; MM32-NEXT:    and $9, $7, $6
4214; MM32-NEXT:    or $9, $9, $8
4215; MM32-NEXT:    sc $9, 0($2)
4216; MM32-NEXT:    beqzc $9, $BB11_1
4217; MM32-NEXT:  # %bb.2: # %entry
4218; MM32-NEXT:    and $1, $7, $5
4219; MM32-NEXT:    srlv $1, $1, $3
4220; MM32-NEXT:    seb $1, $1
4221; MM32-NEXT:  # %bb.3: # %entry
4222; MM32-NEXT:    jr $ra
4223; MM32-NEXT:    seb $2, $1
4224;
4225; O1-LABEL: AtomicSwap8:
4226; O1:       # %bb.0: # %entry
4227; O1-NEXT:    lui $2, %hi(_gp_disp)
4228; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
4229; O1-NEXT:    addu $1, $2, $25
4230; O1-NEXT:    lw $1, %got(y)($1)
4231; O1-NEXT:    addiu $2, $zero, -4
4232; O1-NEXT:    and $2, $1, $2
4233; O1-NEXT:    andi $1, $1, 3
4234; O1-NEXT:    sll $3, $1, 3
4235; O1-NEXT:    ori $1, $zero, 255
4236; O1-NEXT:    sllv $5, $1, $3
4237; O1-NEXT:    nor $6, $zero, $5
4238; O1-NEXT:    sllv $4, $4, $3
4239; O1-NEXT:  $BB11_1: # %entry
4240; O1-NEXT:    # =>This Inner Loop Header: Depth=1
4241; O1-NEXT:    ll $7, 0($2)
4242; O1-NEXT:    and $8, $4, $5
4243; O1-NEXT:    and $9, $7, $6
4244; O1-NEXT:    or $9, $9, $8
4245; O1-NEXT:    sc $9, 0($2)
4246; O1-NEXT:    beqz $9, $BB11_1
4247; O1-NEXT:    nop
4248; O1-NEXT:  # %bb.2: # %entry
4249; O1-NEXT:    and $1, $7, $5
4250; O1-NEXT:    srlv $1, $1, $3
4251; O1-NEXT:    sll $1, $1, 24
4252; O1-NEXT:    sra $1, $1, 24
4253; O1-NEXT:  # %bb.3: # %entry
4254; O1-NEXT:    sll $1, $1, 24
4255; O1-NEXT:    jr $ra
4256; O1-NEXT:    sra $2, $1, 24
4257;
4258; O2-LABEL: AtomicSwap8:
4259; O2:       # %bb.0: # %entry
4260; O2-NEXT:    lui $2, %hi(_gp_disp)
4261; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4262; O2-NEXT:    addu $1, $2, $25
4263; O2-NEXT:    lw $1, %got(y)($1)
4264; O2-NEXT:    addiu $2, $zero, -4
4265; O2-NEXT:    and $2, $1, $2
4266; O2-NEXT:    andi $1, $1, 3
4267; O2-NEXT:    sll $3, $1, 3
4268; O2-NEXT:    ori $1, $zero, 255
4269; O2-NEXT:    sllv $5, $1, $3
4270; O2-NEXT:    nor $6, $zero, $5
4271; O2-NEXT:    sllv $4, $4, $3
4272; O2-NEXT:  $BB11_1: # %entry
4273; O2-NEXT:    # =>This Inner Loop Header: Depth=1
4274; O2-NEXT:    ll $7, 0($2)
4275; O2-NEXT:    and $8, $4, $5
4276; O2-NEXT:    and $9, $7, $6
4277; O2-NEXT:    or $9, $9, $8
4278; O2-NEXT:    sc $9, 0($2)
4279; O2-NEXT:    beqz $9, $BB11_1
4280; O2-NEXT:    nop
4281; O2-NEXT:  # %bb.2: # %entry
4282; O2-NEXT:    and $1, $7, $5
4283; O2-NEXT:    srlv $1, $1, $3
4284; O2-NEXT:    sll $1, $1, 24
4285; O2-NEXT:    sra $1, $1, 24
4286; O2-NEXT:  # %bb.3: # %entry
4287; O2-NEXT:    sll $1, $1, 24
4288; O2-NEXT:    jr $ra
4289; O2-NEXT:    sra $2, $1, 24
4290;
4291; O3-LABEL: AtomicSwap8:
4292; O3:       # %bb.0: # %entry
4293; O3-NEXT:    lui $2, %hi(_gp_disp)
4294; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
4295; O3-NEXT:    addu $1, $2, $25
4296; O3-NEXT:    addiu $2, $zero, -4
4297; O3-NEXT:    lw $1, %got(y)($1)
4298; O3-NEXT:    and $2, $1, $2
4299; O3-NEXT:    andi $1, $1, 3
4300; O3-NEXT:    sll $3, $1, 3
4301; O3-NEXT:    ori $1, $zero, 255
4302; O3-NEXT:    sllv $5, $1, $3
4303; O3-NEXT:    sllv $4, $4, $3
4304; O3-NEXT:    nor $6, $zero, $5
4305; O3-NEXT:  $BB11_1: # %entry
4306; O3-NEXT:    # =>This Inner Loop Header: Depth=1
4307; O3-NEXT:    ll $7, 0($2)
4308; O3-NEXT:    and $8, $4, $5
4309; O3-NEXT:    and $9, $7, $6
4310; O3-NEXT:    or $9, $9, $8
4311; O3-NEXT:    sc $9, 0($2)
4312; O3-NEXT:    beqz $9, $BB11_1
4313; O3-NEXT:    nop
4314; O3-NEXT:  # %bb.2: # %entry
4315; O3-NEXT:    and $1, $7, $5
4316; O3-NEXT:    srlv $1, $1, $3
4317; O3-NEXT:    sll $1, $1, 24
4318; O3-NEXT:    sra $1, $1, 24
4319; O3-NEXT:  # %bb.3: # %entry
4320; O3-NEXT:    sll $1, $1, 24
4321; O3-NEXT:    jr $ra
4322; O3-NEXT:    sra $2, $1, 24
4323;
4324; MIPS32EB-LABEL: AtomicSwap8:
4325; MIPS32EB:       # %bb.0: # %entry
4326; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
4327; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
4328; MIPS32EB-NEXT:    addu $1, $2, $25
4329; MIPS32EB-NEXT:    lw $1, %got(y)($1)
4330; MIPS32EB-NEXT:    addiu $2, $zero, -4
4331; MIPS32EB-NEXT:    and $2, $1, $2
4332; MIPS32EB-NEXT:    andi $1, $1, 3
4333; MIPS32EB-NEXT:    xori $1, $1, 3
4334; MIPS32EB-NEXT:    sll $3, $1, 3
4335; MIPS32EB-NEXT:    ori $1, $zero, 255
4336; MIPS32EB-NEXT:    sllv $5, $1, $3
4337; MIPS32EB-NEXT:    nor $6, $zero, $5
4338; MIPS32EB-NEXT:    sllv $4, $4, $3
4339; MIPS32EB-NEXT:  $BB11_1: # %entry
4340; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
4341; MIPS32EB-NEXT:    ll $7, 0($2)
4342; MIPS32EB-NEXT:    and $8, $4, $5
4343; MIPS32EB-NEXT:    and $9, $7, $6
4344; MIPS32EB-NEXT:    or $9, $9, $8
4345; MIPS32EB-NEXT:    sc $9, 0($2)
4346; MIPS32EB-NEXT:    beqz $9, $BB11_1
4347; MIPS32EB-NEXT:    nop
4348; MIPS32EB-NEXT:  # %bb.2: # %entry
4349; MIPS32EB-NEXT:    and $1, $7, $5
4350; MIPS32EB-NEXT:    srlv $1, $1, $3
4351; MIPS32EB-NEXT:    sll $1, $1, 24
4352; MIPS32EB-NEXT:    sra $1, $1, 24
4353; MIPS32EB-NEXT:  # %bb.3: # %entry
4354; MIPS32EB-NEXT:    sll $1, $1, 24
4355; MIPS32EB-NEXT:    jr $ra
4356; MIPS32EB-NEXT:    sra $2, $1, 24
4357entry:
4358  %0 = atomicrmw xchg i8* @y, i8 %newval monotonic
4359  ret i8 %0
4360}
4361
4362define signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind {
4363; MIPS32-LABEL: AtomicCmpSwap8:
4364; MIPS32:       # %bb.0: # %entry
4365; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
4366; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4367; MIPS32-NEXT:    addu $1, $2, $25
4368; MIPS32-NEXT:    lw $1, %got(y)($1)
4369; MIPS32-NEXT:    addiu $2, $zero, -4
4370; MIPS32-NEXT:    and $2, $1, $2
4371; MIPS32-NEXT:    andi $1, $1, 3
4372; MIPS32-NEXT:    sll $3, $1, 3
4373; MIPS32-NEXT:    ori $1, $zero, 255
4374; MIPS32-NEXT:    sllv $6, $1, $3
4375; MIPS32-NEXT:    nor $7, $zero, $6
4376; MIPS32-NEXT:    andi $1, $4, 255
4377; MIPS32-NEXT:    sllv $4, $1, $3
4378; MIPS32-NEXT:    andi $1, $5, 255
4379; MIPS32-NEXT:    sllv $5, $1, $3
4380; MIPS32-NEXT:  $BB12_1: # %entry
4381; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
4382; MIPS32-NEXT:    ll $8, 0($2)
4383; MIPS32-NEXT:    and $9, $8, $6
4384; MIPS32-NEXT:    bne $9, $4, $BB12_3
4385; MIPS32-NEXT:    nop
4386; MIPS32-NEXT:  # %bb.2: # %entry
4387; MIPS32-NEXT:    # in Loop: Header=BB12_1 Depth=1
4388; MIPS32-NEXT:    and $8, $8, $7
4389; MIPS32-NEXT:    or $8, $8, $5
4390; MIPS32-NEXT:    sc $8, 0($2)
4391; MIPS32-NEXT:    beqz $8, $BB12_1
4392; MIPS32-NEXT:    nop
4393; MIPS32-NEXT:  $BB12_3: # %entry
4394; MIPS32-NEXT:    srlv $1, $9, $3
4395; MIPS32-NEXT:    sll $1, $1, 24
4396; MIPS32-NEXT:    sra $1, $1, 24
4397; MIPS32-NEXT:  # %bb.4: # %entry
4398; MIPS32-NEXT:    sll $1, $1, 24
4399; MIPS32-NEXT:    jr $ra
4400; MIPS32-NEXT:    sra $2, $1, 24
4401;
4402; MIPS32O0-LABEL: AtomicCmpSwap8:
4403; MIPS32O0:       # %bb.0: # %entry
4404; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
4405; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
4406; MIPS32O0-NEXT:    addiu $sp, $sp, -8
4407; MIPS32O0-NEXT:    addu $2, $2, $25
4408; MIPS32O0-NEXT:    lw $2, %got(y)($2)
4409; MIPS32O0-NEXT:    addiu $25, $zero, -4
4410; MIPS32O0-NEXT:    and $25, $2, $25
4411; MIPS32O0-NEXT:    andi $2, $2, 3
4412; MIPS32O0-NEXT:    sll $2, $2, 3
4413; MIPS32O0-NEXT:    ori $1, $zero, 255
4414; MIPS32O0-NEXT:    sllv $1, $1, $2
4415; MIPS32O0-NEXT:    nor $3, $zero, $1
4416; MIPS32O0-NEXT:    andi $4, $4, 255
4417; MIPS32O0-NEXT:    sllv $4, $4, $2
4418; MIPS32O0-NEXT:    andi $5, $5, 255
4419; MIPS32O0-NEXT:    sllv $5, $5, $2
4420; MIPS32O0-NEXT:  $BB12_1: # %entry
4421; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
4422; MIPS32O0-NEXT:    ll $7, 0($25)
4423; MIPS32O0-NEXT:    and $8, $7, $1
4424; MIPS32O0-NEXT:    bne $8, $4, $BB12_3
4425; MIPS32O0-NEXT:    nop
4426; MIPS32O0-NEXT:  # %bb.2: # %entry
4427; MIPS32O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4428; MIPS32O0-NEXT:    and $7, $7, $3
4429; MIPS32O0-NEXT:    or $7, $7, $5
4430; MIPS32O0-NEXT:    sc $7, 0($25)
4431; MIPS32O0-NEXT:    beqz $7, $BB12_1
4432; MIPS32O0-NEXT:    nop
4433; MIPS32O0-NEXT:  $BB12_3: # %entry
4434; MIPS32O0-NEXT:    srlv $6, $8, $2
4435; MIPS32O0-NEXT:    sll $6, $6, 24
4436; MIPS32O0-NEXT:    sra $6, $6, 24
4437; MIPS32O0-NEXT:  # %bb.4: # %entry
4438; MIPS32O0-NEXT:    sw $6, 4($sp) # 4-byte Folded Spill
4439; MIPS32O0-NEXT:  # %bb.5: # %entry
4440; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
4441; MIPS32O0-NEXT:    sll $2, $1, 24
4442; MIPS32O0-NEXT:    sra $2, $2, 24
4443; MIPS32O0-NEXT:    addiu $sp, $sp, 8
4444; MIPS32O0-NEXT:    jr $ra
4445; MIPS32O0-NEXT:    nop
4446;
4447; MIPS32R2-LABEL: AtomicCmpSwap8:
4448; MIPS32R2:       # %bb.0: # %entry
4449; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
4450; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4451; MIPS32R2-NEXT:    addu $1, $2, $25
4452; MIPS32R2-NEXT:    lw $1, %got(y)($1)
4453; MIPS32R2-NEXT:    addiu $2, $zero, -4
4454; MIPS32R2-NEXT:    and $3, $1, $2
4455; MIPS32R2-NEXT:    andi $1, $1, 3
4456; MIPS32R2-NEXT:    sll $1, $1, 3
4457; MIPS32R2-NEXT:    ori $2, $zero, 255
4458; MIPS32R2-NEXT:    sllv $6, $2, $1
4459; MIPS32R2-NEXT:    nor $7, $zero, $6
4460; MIPS32R2-NEXT:    andi $2, $4, 255
4461; MIPS32R2-NEXT:    sllv $4, $2, $1
4462; MIPS32R2-NEXT:    andi $2, $5, 255
4463; MIPS32R2-NEXT:    sllv $5, $2, $1
4464; MIPS32R2-NEXT:  $BB12_1: # %entry
4465; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
4466; MIPS32R2-NEXT:    ll $8, 0($3)
4467; MIPS32R2-NEXT:    and $9, $8, $6
4468; MIPS32R2-NEXT:    bne $9, $4, $BB12_3
4469; MIPS32R2-NEXT:    nop
4470; MIPS32R2-NEXT:  # %bb.2: # %entry
4471; MIPS32R2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4472; MIPS32R2-NEXT:    and $8, $8, $7
4473; MIPS32R2-NEXT:    or $8, $8, $5
4474; MIPS32R2-NEXT:    sc $8, 0($3)
4475; MIPS32R2-NEXT:    beqz $8, $BB12_1
4476; MIPS32R2-NEXT:    nop
4477; MIPS32R2-NEXT:  $BB12_3: # %entry
4478; MIPS32R2-NEXT:    srlv $2, $9, $1
4479; MIPS32R2-NEXT:    seb $2, $2
4480; MIPS32R2-NEXT:  # %bb.4: # %entry
4481; MIPS32R2-NEXT:    jr $ra
4482; MIPS32R2-NEXT:    nop
4483;
4484; MIPS32R6-LABEL: AtomicCmpSwap8:
4485; MIPS32R6:       # %bb.0: # %entry
4486; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
4487; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
4488; MIPS32R6-NEXT:    addu $1, $2, $25
4489; MIPS32R6-NEXT:    lw $1, %got(y)($1)
4490; MIPS32R6-NEXT:    addiu $2, $zero, -4
4491; MIPS32R6-NEXT:    and $3, $1, $2
4492; MIPS32R6-NEXT:    andi $1, $1, 3
4493; MIPS32R6-NEXT:    sll $1, $1, 3
4494; MIPS32R6-NEXT:    ori $2, $zero, 255
4495; MIPS32R6-NEXT:    sllv $6, $2, $1
4496; MIPS32R6-NEXT:    nor $7, $zero, $6
4497; MIPS32R6-NEXT:    andi $2, $4, 255
4498; MIPS32R6-NEXT:    sllv $4, $2, $1
4499; MIPS32R6-NEXT:    andi $2, $5, 255
4500; MIPS32R6-NEXT:    sllv $5, $2, $1
4501; MIPS32R6-NEXT:  $BB12_1: # %entry
4502; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
4503; MIPS32R6-NEXT:    ll $8, 0($3)
4504; MIPS32R6-NEXT:    and $9, $8, $6
4505; MIPS32R6-NEXT:    bnec $9, $4, $BB12_3
4506; MIPS32R6-NEXT:  # %bb.2: # %entry
4507; MIPS32R6-NEXT:    # in Loop: Header=BB12_1 Depth=1
4508; MIPS32R6-NEXT:    and $8, $8, $7
4509; MIPS32R6-NEXT:    or $8, $8, $5
4510; MIPS32R6-NEXT:    sc $8, 0($3)
4511; MIPS32R6-NEXT:    beqzc $8, $BB12_1
4512; MIPS32R6-NEXT:  $BB12_3: # %entry
4513; MIPS32R6-NEXT:    srlv $2, $9, $1
4514; MIPS32R6-NEXT:    seb $2, $2
4515; MIPS32R6-NEXT:  # %bb.4: # %entry
4516; MIPS32R6-NEXT:    jrc $ra
4517;
4518; MIPS32R6O0-LABEL: AtomicCmpSwap8:
4519; MIPS32R6O0:       # %bb.0: # %entry
4520; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
4521; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
4522; MIPS32R6O0-NEXT:    addiu $sp, $sp, -16
4523; MIPS32R6O0-NEXT:    addu $2, $2, $25
4524; MIPS32R6O0-NEXT:    move $25, $5
4525; MIPS32R6O0-NEXT:    move $1, $4
4526; MIPS32R6O0-NEXT:    lw $2, %got(y)($2)
4527; MIPS32R6O0-NEXT:    addiu $3, $zero, -4
4528; MIPS32R6O0-NEXT:    and $3, $2, $3
4529; MIPS32R6O0-NEXT:    andi $2, $2, 3
4530; MIPS32R6O0-NEXT:    sll $2, $2, 3
4531; MIPS32R6O0-NEXT:    ori $6, $zero, 255
4532; MIPS32R6O0-NEXT:    sllv $6, $6, $2
4533; MIPS32R6O0-NEXT:    nor $7, $zero, $6
4534; MIPS32R6O0-NEXT:    andi $4, $4, 255
4535; MIPS32R6O0-NEXT:    sllv $4, $4, $2
4536; MIPS32R6O0-NEXT:    andi $5, $5, 255
4537; MIPS32R6O0-NEXT:    sllv $5, $5, $2
4538; MIPS32R6O0-NEXT:  $BB12_1: # %entry
4539; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4540; MIPS32R6O0-NEXT:    ll $9, 0($3)
4541; MIPS32R6O0-NEXT:    and $10, $9, $6
4542; MIPS32R6O0-NEXT:    bnec $10, $4, $BB12_3
4543; MIPS32R6O0-NEXT:  # %bb.2: # %entry
4544; MIPS32R6O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4545; MIPS32R6O0-NEXT:    and $9, $9, $7
4546; MIPS32R6O0-NEXT:    or $9, $9, $5
4547; MIPS32R6O0-NEXT:    sc $9, 0($3)
4548; MIPS32R6O0-NEXT:    beqzc $9, $BB12_1
4549; MIPS32R6O0-NEXT:  $BB12_3: # %entry
4550; MIPS32R6O0-NEXT:    srlv $8, $10, $2
4551; MIPS32R6O0-NEXT:    seb $8, $8
4552; MIPS32R6O0-NEXT:  # %bb.4: # %entry
4553; MIPS32R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
4554; MIPS32R6O0-NEXT:    sw $8, 8($sp) # 4-byte Folded Spill
4555; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
4556; MIPS32R6O0-NEXT:  # %bb.5: # %entry
4557; MIPS32R6O0-NEXT:    lw $2, 8($sp) # 4-byte Folded Reload
4558; MIPS32R6O0-NEXT:    addiu $sp, $sp, 16
4559; MIPS32R6O0-NEXT:    jrc $ra
4560;
4561; MIPS4-LABEL: AtomicCmpSwap8:
4562; MIPS4:       # %bb.0: # %entry
4563; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4564; MIPS4-NEXT:    daddu $1, $1, $25
4565; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4566; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
4567; MIPS4-NEXT:    daddiu $2, $zero, -4
4568; MIPS4-NEXT:    and $2, $1, $2
4569; MIPS4-NEXT:    andi $1, $1, 3
4570; MIPS4-NEXT:    sll $3, $1, 3
4571; MIPS4-NEXT:    ori $1, $zero, 255
4572; MIPS4-NEXT:    sllv $6, $1, $3
4573; MIPS4-NEXT:    nor $7, $zero, $6
4574; MIPS4-NEXT:    andi $1, $4, 255
4575; MIPS4-NEXT:    sllv $4, $1, $3
4576; MIPS4-NEXT:    andi $1, $5, 255
4577; MIPS4-NEXT:    sllv $5, $1, $3
4578; MIPS4-NEXT:  .LBB12_1: # %entry
4579; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
4580; MIPS4-NEXT:    ll $8, 0($2)
4581; MIPS4-NEXT:    and $9, $8, $6
4582; MIPS4-NEXT:    bne $9, $4, .LBB12_3
4583; MIPS4-NEXT:    nop
4584; MIPS4-NEXT:  # %bb.2: # %entry
4585; MIPS4-NEXT:    # in Loop: Header=BB12_1 Depth=1
4586; MIPS4-NEXT:    and $8, $8, $7
4587; MIPS4-NEXT:    or $8, $8, $5
4588; MIPS4-NEXT:    sc $8, 0($2)
4589; MIPS4-NEXT:    beqz $8, .LBB12_1
4590; MIPS4-NEXT:    nop
4591; MIPS4-NEXT:  .LBB12_3: # %entry
4592; MIPS4-NEXT:    srlv $1, $9, $3
4593; MIPS4-NEXT:    sll $1, $1, 24
4594; MIPS4-NEXT:    sra $1, $1, 24
4595; MIPS4-NEXT:  # %bb.4: # %entry
4596; MIPS4-NEXT:    sll $1, $1, 24
4597; MIPS4-NEXT:    jr $ra
4598; MIPS4-NEXT:    sra $2, $1, 24
4599;
4600; MIPS64-LABEL: AtomicCmpSwap8:
4601; MIPS64:       # %bb.0: # %entry
4602; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4603; MIPS64-NEXT:    daddu $1, $1, $25
4604; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4605; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
4606; MIPS64-NEXT:    daddiu $2, $zero, -4
4607; MIPS64-NEXT:    and $2, $1, $2
4608; MIPS64-NEXT:    andi $1, $1, 3
4609; MIPS64-NEXT:    sll $3, $1, 3
4610; MIPS64-NEXT:    ori $1, $zero, 255
4611; MIPS64-NEXT:    sllv $6, $1, $3
4612; MIPS64-NEXT:    nor $7, $zero, $6
4613; MIPS64-NEXT:    andi $1, $4, 255
4614; MIPS64-NEXT:    sllv $4, $1, $3
4615; MIPS64-NEXT:    andi $1, $5, 255
4616; MIPS64-NEXT:    sllv $5, $1, $3
4617; MIPS64-NEXT:  .LBB12_1: # %entry
4618; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
4619; MIPS64-NEXT:    ll $8, 0($2)
4620; MIPS64-NEXT:    and $9, $8, $6
4621; MIPS64-NEXT:    bne $9, $4, .LBB12_3
4622; MIPS64-NEXT:    nop
4623; MIPS64-NEXT:  # %bb.2: # %entry
4624; MIPS64-NEXT:    # in Loop: Header=BB12_1 Depth=1
4625; MIPS64-NEXT:    and $8, $8, $7
4626; MIPS64-NEXT:    or $8, $8, $5
4627; MIPS64-NEXT:    sc $8, 0($2)
4628; MIPS64-NEXT:    beqz $8, .LBB12_1
4629; MIPS64-NEXT:    nop
4630; MIPS64-NEXT:  .LBB12_3: # %entry
4631; MIPS64-NEXT:    srlv $1, $9, $3
4632; MIPS64-NEXT:    sll $1, $1, 24
4633; MIPS64-NEXT:    sra $1, $1, 24
4634; MIPS64-NEXT:  # %bb.4: # %entry
4635; MIPS64-NEXT:    sll $1, $1, 24
4636; MIPS64-NEXT:    jr $ra
4637; MIPS64-NEXT:    sra $2, $1, 24
4638;
4639; MIPS64R2-LABEL: AtomicCmpSwap8:
4640; MIPS64R2:       # %bb.0: # %entry
4641; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4642; MIPS64R2-NEXT:    daddu $1, $1, $25
4643; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4644; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
4645; MIPS64R2-NEXT:    daddiu $2, $zero, -4
4646; MIPS64R2-NEXT:    and $3, $1, $2
4647; MIPS64R2-NEXT:    andi $1, $1, 3
4648; MIPS64R2-NEXT:    sll $1, $1, 3
4649; MIPS64R2-NEXT:    ori $2, $zero, 255
4650; MIPS64R2-NEXT:    sllv $6, $2, $1
4651; MIPS64R2-NEXT:    nor $7, $zero, $6
4652; MIPS64R2-NEXT:    andi $2, $4, 255
4653; MIPS64R2-NEXT:    sllv $4, $2, $1
4654; MIPS64R2-NEXT:    andi $2, $5, 255
4655; MIPS64R2-NEXT:    sllv $5, $2, $1
4656; MIPS64R2-NEXT:  .LBB12_1: # %entry
4657; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
4658; MIPS64R2-NEXT:    ll $8, 0($3)
4659; MIPS64R2-NEXT:    and $9, $8, $6
4660; MIPS64R2-NEXT:    bne $9, $4, .LBB12_3
4661; MIPS64R2-NEXT:    nop
4662; MIPS64R2-NEXT:  # %bb.2: # %entry
4663; MIPS64R2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4664; MIPS64R2-NEXT:    and $8, $8, $7
4665; MIPS64R2-NEXT:    or $8, $8, $5
4666; MIPS64R2-NEXT:    sc $8, 0($3)
4667; MIPS64R2-NEXT:    beqz $8, .LBB12_1
4668; MIPS64R2-NEXT:    nop
4669; MIPS64R2-NEXT:  .LBB12_3: # %entry
4670; MIPS64R2-NEXT:    srlv $2, $9, $1
4671; MIPS64R2-NEXT:    seb $2, $2
4672; MIPS64R2-NEXT:  # %bb.4: # %entry
4673; MIPS64R2-NEXT:    jr $ra
4674; MIPS64R2-NEXT:    nop
4675;
4676; MIPS64R6-LABEL: AtomicCmpSwap8:
4677; MIPS64R6:       # %bb.0: # %entry
4678; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4679; MIPS64R6-NEXT:    daddu $1, $1, $25
4680; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4681; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
4682; MIPS64R6-NEXT:    daddiu $2, $zero, -4
4683; MIPS64R6-NEXT:    and $3, $1, $2
4684; MIPS64R6-NEXT:    andi $1, $1, 3
4685; MIPS64R6-NEXT:    sll $1, $1, 3
4686; MIPS64R6-NEXT:    ori $2, $zero, 255
4687; MIPS64R6-NEXT:    sllv $6, $2, $1
4688; MIPS64R6-NEXT:    nor $7, $zero, $6
4689; MIPS64R6-NEXT:    andi $2, $4, 255
4690; MIPS64R6-NEXT:    sllv $4, $2, $1
4691; MIPS64R6-NEXT:    andi $2, $5, 255
4692; MIPS64R6-NEXT:    sllv $5, $2, $1
4693; MIPS64R6-NEXT:  .LBB12_1: # %entry
4694; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
4695; MIPS64R6-NEXT:    ll $8, 0($3)
4696; MIPS64R6-NEXT:    and $9, $8, $6
4697; MIPS64R6-NEXT:    bnec $9, $4, .LBB12_3
4698; MIPS64R6-NEXT:  # %bb.2: # %entry
4699; MIPS64R6-NEXT:    # in Loop: Header=BB12_1 Depth=1
4700; MIPS64R6-NEXT:    and $8, $8, $7
4701; MIPS64R6-NEXT:    or $8, $8, $5
4702; MIPS64R6-NEXT:    sc $8, 0($3)
4703; MIPS64R6-NEXT:    beqzc $8, .LBB12_1
4704; MIPS64R6-NEXT:  .LBB12_3: # %entry
4705; MIPS64R6-NEXT:    srlv $2, $9, $1
4706; MIPS64R6-NEXT:    seb $2, $2
4707; MIPS64R6-NEXT:  # %bb.4: # %entry
4708; MIPS64R6-NEXT:    jrc $ra
4709;
4710; MIPS64R6O0-LABEL: AtomicCmpSwap8:
4711; MIPS64R6O0:       # %bb.0: # %entry
4712; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
4713; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4714; MIPS64R6O0-NEXT:    daddu $1, $1, $25
4715; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4716; MIPS64R6O0-NEXT:    move $2, $5
4717; MIPS64R6O0-NEXT:    move $3, $4
4718; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
4719; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
4720; MIPS64R6O0-NEXT:    and $4, $1, $4
4721; MIPS64R6O0-NEXT:    andi $6, $1, 3
4722; MIPS64R6O0-NEXT:    xori $6, $6, 3
4723; MIPS64R6O0-NEXT:    sll $6, $6, 3
4724; MIPS64R6O0-NEXT:    ori $7, $zero, 255
4725; MIPS64R6O0-NEXT:    sllv $7, $7, $6
4726; MIPS64R6O0-NEXT:    nor $8, $zero, $7
4727; MIPS64R6O0-NEXT:    andi $3, $3, 255
4728; MIPS64R6O0-NEXT:    sllv $3, $3, $6
4729; MIPS64R6O0-NEXT:    andi $2, $2, 255
4730; MIPS64R6O0-NEXT:    sllv $2, $2, $6
4731; MIPS64R6O0-NEXT:  .LBB12_1: # %entry
4732; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4733; MIPS64R6O0-NEXT:    ll $10, 0($4)
4734; MIPS64R6O0-NEXT:    and $11, $10, $7
4735; MIPS64R6O0-NEXT:    bnec $11, $3, .LBB12_3
4736; MIPS64R6O0-NEXT:  # %bb.2: # %entry
4737; MIPS64R6O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4738; MIPS64R6O0-NEXT:    and $10, $10, $8
4739; MIPS64R6O0-NEXT:    or $10, $10, $2
4740; MIPS64R6O0-NEXT:    sc $10, 0($4)
4741; MIPS64R6O0-NEXT:    beqzc $10, .LBB12_1
4742; MIPS64R6O0-NEXT:  .LBB12_3: # %entry
4743; MIPS64R6O0-NEXT:    srlv $9, $11, $6
4744; MIPS64R6O0-NEXT:    seb $9, $9
4745; MIPS64R6O0-NEXT:  # %bb.4: # %entry
4746; MIPS64R6O0-NEXT:    sw $9, 12($sp) # 4-byte Folded Spill
4747; MIPS64R6O0-NEXT:  # %bb.5: # %entry
4748; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
4749; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
4750; MIPS64R6O0-NEXT:    jrc $ra
4751;
4752; MM32-LABEL: AtomicCmpSwap8:
4753; MM32:       # %bb.0: # %entry
4754; MM32-NEXT:    lui $2, %hi(_gp_disp)
4755; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4756; MM32-NEXT:    addu $2, $2, $25
4757; MM32-NEXT:    lw $1, %got(y)($2)
4758; MM32-NEXT:    addiu $2, $zero, -4
4759; MM32-NEXT:    and $3, $1, $2
4760; MM32-NEXT:    andi $1, $1, 3
4761; MM32-NEXT:    sll $1, $1, 3
4762; MM32-NEXT:    ori $2, $zero, 255
4763; MM32-NEXT:    sllv $6, $2, $1
4764; MM32-NEXT:    nor $7, $zero, $6
4765; MM32-NEXT:    andi $2, $4, 255
4766; MM32-NEXT:    sllv $4, $2, $1
4767; MM32-NEXT:    andi $2, $5, 255
4768; MM32-NEXT:    sllv $5, $2, $1
4769; MM32-NEXT:  $BB12_1: # %entry
4770; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
4771; MM32-NEXT:    ll $8, 0($3)
4772; MM32-NEXT:    and $9, $8, $6
4773; MM32-NEXT:    bne $9, $4, $BB12_3
4774; MM32-NEXT:    nop
4775; MM32-NEXT:  # %bb.2: # %entry
4776; MM32-NEXT:    # in Loop: Header=BB12_1 Depth=1
4777; MM32-NEXT:    and $8, $8, $7
4778; MM32-NEXT:    or $8, $8, $5
4779; MM32-NEXT:    sc $8, 0($3)
4780; MM32-NEXT:    beqzc $8, $BB12_1
4781; MM32-NEXT:  $BB12_3: # %entry
4782; MM32-NEXT:    srlv $2, $9, $1
4783; MM32-NEXT:    seb $2, $2
4784; MM32-NEXT:  # %bb.4: # %entry
4785; MM32-NEXT:    jrc $ra
4786;
4787; O1-LABEL: AtomicCmpSwap8:
4788; O1:       # %bb.0: # %entry
4789; O1-NEXT:    lui $2, %hi(_gp_disp)
4790; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
4791; O1-NEXT:    addu $1, $2, $25
4792; O1-NEXT:    lw $1, %got(y)($1)
4793; O1-NEXT:    addiu $2, $zero, -4
4794; O1-NEXT:    and $2, $1, $2
4795; O1-NEXT:    andi $1, $1, 3
4796; O1-NEXT:    sll $3, $1, 3
4797; O1-NEXT:    ori $1, $zero, 255
4798; O1-NEXT:    sllv $6, $1, $3
4799; O1-NEXT:    nor $7, $zero, $6
4800; O1-NEXT:    andi $1, $4, 255
4801; O1-NEXT:    sllv $4, $1, $3
4802; O1-NEXT:    andi $1, $5, 255
4803; O1-NEXT:    sllv $5, $1, $3
4804; O1-NEXT:  $BB12_1: # %entry
4805; O1-NEXT:    # =>This Inner Loop Header: Depth=1
4806; O1-NEXT:    ll $8, 0($2)
4807; O1-NEXT:    and $9, $8, $6
4808; O1-NEXT:    bne $9, $4, $BB12_3
4809; O1-NEXT:    nop
4810; O1-NEXT:  # %bb.2: # %entry
4811; O1-NEXT:    # in Loop: Header=BB12_1 Depth=1
4812; O1-NEXT:    and $8, $8, $7
4813; O1-NEXT:    or $8, $8, $5
4814; O1-NEXT:    sc $8, 0($2)
4815; O1-NEXT:    beqz $8, $BB12_1
4816; O1-NEXT:    nop
4817; O1-NEXT:  $BB12_3: # %entry
4818; O1-NEXT:    srlv $1, $9, $3
4819; O1-NEXT:    sll $1, $1, 24
4820; O1-NEXT:    sra $1, $1, 24
4821; O1-NEXT:  # %bb.4: # %entry
4822; O1-NEXT:    sll $1, $1, 24
4823; O1-NEXT:    jr $ra
4824; O1-NEXT:    sra $2, $1, 24
4825;
4826; O2-LABEL: AtomicCmpSwap8:
4827; O2:       # %bb.0: # %entry
4828; O2-NEXT:    lui $2, %hi(_gp_disp)
4829; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4830; O2-NEXT:    addu $1, $2, $25
4831; O2-NEXT:    lw $1, %got(y)($1)
4832; O2-NEXT:    addiu $2, $zero, -4
4833; O2-NEXT:    and $2, $1, $2
4834; O2-NEXT:    andi $1, $1, 3
4835; O2-NEXT:    sll $3, $1, 3
4836; O2-NEXT:    ori $1, $zero, 255
4837; O2-NEXT:    sllv $6, $1, $3
4838; O2-NEXT:    nor $7, $zero, $6
4839; O2-NEXT:    andi $1, $4, 255
4840; O2-NEXT:    sllv $4, $1, $3
4841; O2-NEXT:    andi $1, $5, 255
4842; O2-NEXT:    sllv $5, $1, $3
4843; O2-NEXT:  $BB12_1: # %entry
4844; O2-NEXT:    # =>This Inner Loop Header: Depth=1
4845; O2-NEXT:    ll $8, 0($2)
4846; O2-NEXT:    and $9, $8, $6
4847; O2-NEXT:    bne $9, $4, $BB12_3
4848; O2-NEXT:    nop
4849; O2-NEXT:  # %bb.2: # %entry
4850; O2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4851; O2-NEXT:    and $8, $8, $7
4852; O2-NEXT:    or $8, $8, $5
4853; O2-NEXT:    sc $8, 0($2)
4854; O2-NEXT:    beqz $8, $BB12_1
4855; O2-NEXT:    nop
4856; O2-NEXT:  $BB12_3: # %entry
4857; O2-NEXT:    srlv $1, $9, $3
4858; O2-NEXT:    sll $1, $1, 24
4859; O2-NEXT:    sra $1, $1, 24
4860; O2-NEXT:  # %bb.4: # %entry
4861; O2-NEXT:    sll $1, $1, 24
4862; O2-NEXT:    jr $ra
4863; O2-NEXT:    sra $2, $1, 24
4864;
4865; O3-LABEL: AtomicCmpSwap8:
4866; O3:       # %bb.0: # %entry
4867; O3-NEXT:    lui $2, %hi(_gp_disp)
4868; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
4869; O3-NEXT:    addu $1, $2, $25
4870; O3-NEXT:    addiu $2, $zero, -4
4871; O3-NEXT:    lw $1, %got(y)($1)
4872; O3-NEXT:    and $2, $1, $2
4873; O3-NEXT:    andi $1, $1, 3
4874; O3-NEXT:    sll $3, $1, 3
4875; O3-NEXT:    ori $1, $zero, 255
4876; O3-NEXT:    sllv $6, $1, $3
4877; O3-NEXT:    andi $1, $4, 255
4878; O3-NEXT:    sllv $4, $1, $3
4879; O3-NEXT:    andi $1, $5, 255
4880; O3-NEXT:    nor $7, $zero, $6
4881; O3-NEXT:    sllv $5, $1, $3
4882; O3-NEXT:  $BB12_1: # %entry
4883; O3-NEXT:    # =>This Inner Loop Header: Depth=1
4884; O3-NEXT:    ll $8, 0($2)
4885; O3-NEXT:    and $9, $8, $6
4886; O3-NEXT:    bne $9, $4, $BB12_3
4887; O3-NEXT:    nop
4888; O3-NEXT:  # %bb.2: # %entry
4889; O3-NEXT:    # in Loop: Header=BB12_1 Depth=1
4890; O3-NEXT:    and $8, $8, $7
4891; O3-NEXT:    or $8, $8, $5
4892; O3-NEXT:    sc $8, 0($2)
4893; O3-NEXT:    beqz $8, $BB12_1
4894; O3-NEXT:    nop
4895; O3-NEXT:  $BB12_3: # %entry
4896; O3-NEXT:    srlv $1, $9, $3
4897; O3-NEXT:    sll $1, $1, 24
4898; O3-NEXT:    sra $1, $1, 24
4899; O3-NEXT:  # %bb.4: # %entry
4900; O3-NEXT:    sll $1, $1, 24
4901; O3-NEXT:    jr $ra
4902; O3-NEXT:    sra $2, $1, 24
4903;
4904; MIPS32EB-LABEL: AtomicCmpSwap8:
4905; MIPS32EB:       # %bb.0: # %entry
4906; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
4907; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
4908; MIPS32EB-NEXT:    addu $1, $2, $25
4909; MIPS32EB-NEXT:    lw $1, %got(y)($1)
4910; MIPS32EB-NEXT:    addiu $2, $zero, -4
4911; MIPS32EB-NEXT:    and $2, $1, $2
4912; MIPS32EB-NEXT:    andi $1, $1, 3
4913; MIPS32EB-NEXT:    xori $1, $1, 3
4914; MIPS32EB-NEXT:    sll $3, $1, 3
4915; MIPS32EB-NEXT:    ori $1, $zero, 255
4916; MIPS32EB-NEXT:    sllv $6, $1, $3
4917; MIPS32EB-NEXT:    nor $7, $zero, $6
4918; MIPS32EB-NEXT:    andi $1, $4, 255
4919; MIPS32EB-NEXT:    sllv $4, $1, $3
4920; MIPS32EB-NEXT:    andi $1, $5, 255
4921; MIPS32EB-NEXT:    sllv $5, $1, $3
4922; MIPS32EB-NEXT:  $BB12_1: # %entry
4923; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
4924; MIPS32EB-NEXT:    ll $8, 0($2)
4925; MIPS32EB-NEXT:    and $9, $8, $6
4926; MIPS32EB-NEXT:    bne $9, $4, $BB12_3
4927; MIPS32EB-NEXT:    nop
4928; MIPS32EB-NEXT:  # %bb.2: # %entry
4929; MIPS32EB-NEXT:    # in Loop: Header=BB12_1 Depth=1
4930; MIPS32EB-NEXT:    and $8, $8, $7
4931; MIPS32EB-NEXT:    or $8, $8, $5
4932; MIPS32EB-NEXT:    sc $8, 0($2)
4933; MIPS32EB-NEXT:    beqz $8, $BB12_1
4934; MIPS32EB-NEXT:    nop
4935; MIPS32EB-NEXT:  $BB12_3: # %entry
4936; MIPS32EB-NEXT:    srlv $1, $9, $3
4937; MIPS32EB-NEXT:    sll $1, $1, 24
4938; MIPS32EB-NEXT:    sra $1, $1, 24
4939; MIPS32EB-NEXT:  # %bb.4: # %entry
4940; MIPS32EB-NEXT:    sll $1, $1, 24
4941; MIPS32EB-NEXT:    jr $ra
4942; MIPS32EB-NEXT:    sra $2, $1, 24
4943entry:
4944  %pair0 = cmpxchg i8* @y, i8 %oldval, i8 %newval monotonic monotonic
4945  %0 = extractvalue { i8, i1 } %pair0, 0
4946  ret i8 %0
4947}
4948
4949define i1 @AtomicCmpSwapRes8(i8* %ptr, i8 signext %oldval, i8 signext %newval) nounwind {
4950; MIPS32-LABEL: AtomicCmpSwapRes8:
4951; MIPS32:       # %bb.0: # %entry
4952; MIPS32-NEXT:    addiu $1, $zero, -4
4953; MIPS32-NEXT:    and $2, $4, $1
4954; MIPS32-NEXT:    andi $1, $4, 3
4955; MIPS32-NEXT:    sll $3, $1, 3
4956; MIPS32-NEXT:    ori $1, $zero, 255
4957; MIPS32-NEXT:    sllv $4, $1, $3
4958; MIPS32-NEXT:    nor $7, $zero, $4
4959; MIPS32-NEXT:    andi $1, $5, 255
4960; MIPS32-NEXT:    sllv $8, $1, $3
4961; MIPS32-NEXT:    andi $1, $6, 255
4962; MIPS32-NEXT:    sllv $6, $1, $3
4963; MIPS32-NEXT:  $BB13_1: # %entry
4964; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
4965; MIPS32-NEXT:    ll $9, 0($2)
4966; MIPS32-NEXT:    and $10, $9, $4
4967; MIPS32-NEXT:    bne $10, $8, $BB13_3
4968; MIPS32-NEXT:    nop
4969; MIPS32-NEXT:  # %bb.2: # %entry
4970; MIPS32-NEXT:    # in Loop: Header=BB13_1 Depth=1
4971; MIPS32-NEXT:    and $9, $9, $7
4972; MIPS32-NEXT:    or $9, $9, $6
4973; MIPS32-NEXT:    sc $9, 0($2)
4974; MIPS32-NEXT:    beqz $9, $BB13_1
4975; MIPS32-NEXT:    nop
4976; MIPS32-NEXT:  $BB13_3: # %entry
4977; MIPS32-NEXT:    srlv $1, $10, $3
4978; MIPS32-NEXT:    sll $1, $1, 24
4979; MIPS32-NEXT:    sra $1, $1, 24
4980; MIPS32-NEXT:  # %bb.4: # %entry
4981; MIPS32-NEXT:    sll $2, $5, 24
4982; MIPS32-NEXT:    sra $2, $2, 24
4983; MIPS32-NEXT:    xor $1, $1, $2
4984; MIPS32-NEXT:    jr $ra
4985; MIPS32-NEXT:    sltiu $2, $1, 1
4986;
4987; MIPS32O0-LABEL: AtomicCmpSwapRes8:
4988; MIPS32O0:       # %bb.0: # %entry
4989; MIPS32O0-NEXT:    addiu $sp, $sp, -8
4990; MIPS32O0-NEXT:    addiu $1, $zero, -4
4991; MIPS32O0-NEXT:    and $1, $4, $1
4992; MIPS32O0-NEXT:    andi $4, $4, 3
4993; MIPS32O0-NEXT:    sll $4, $4, 3
4994; MIPS32O0-NEXT:    ori $2, $zero, 255
4995; MIPS32O0-NEXT:    sllv $2, $2, $4
4996; MIPS32O0-NEXT:    nor $3, $zero, $2
4997; MIPS32O0-NEXT:    andi $7, $5, 255
4998; MIPS32O0-NEXT:    sllv $7, $7, $4
4999; MIPS32O0-NEXT:    andi $6, $6, 255
5000; MIPS32O0-NEXT:    sllv $6, $6, $4
5001; MIPS32O0-NEXT:  $BB13_1: # %entry
5002; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
5003; MIPS32O0-NEXT:    ll $9, 0($1)
5004; MIPS32O0-NEXT:    and $10, $9, $2
5005; MIPS32O0-NEXT:    bne $10, $7, $BB13_3
5006; MIPS32O0-NEXT:    nop
5007; MIPS32O0-NEXT:  # %bb.2: # %entry
5008; MIPS32O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
5009; MIPS32O0-NEXT:    and $9, $9, $3
5010; MIPS32O0-NEXT:    or $9, $9, $6
5011; MIPS32O0-NEXT:    sc $9, 0($1)
5012; MIPS32O0-NEXT:    beqz $9, $BB13_1
5013; MIPS32O0-NEXT:    nop
5014; MIPS32O0-NEXT:  $BB13_3: # %entry
5015; MIPS32O0-NEXT:    srlv $8, $10, $4
5016; MIPS32O0-NEXT:    sll $8, $8, 24
5017; MIPS32O0-NEXT:    sra $8, $8, 24
5018; MIPS32O0-NEXT:  # %bb.4: # %entry
5019; MIPS32O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
5020; MIPS32O0-NEXT:    sw $8, 0($sp) # 4-byte Folded Spill
5021; MIPS32O0-NEXT:  # %bb.5: # %entry
5022; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5023; MIPS32O0-NEXT:    sll $2, $1, 24
5024; MIPS32O0-NEXT:    sra $2, $2, 24
5025; MIPS32O0-NEXT:    lw $3, 0($sp) # 4-byte Folded Reload
5026; MIPS32O0-NEXT:    xor $2, $3, $2
5027; MIPS32O0-NEXT:    sltiu $2, $2, 1
5028; MIPS32O0-NEXT:    addiu $sp, $sp, 8
5029; MIPS32O0-NEXT:    jr $ra
5030; MIPS32O0-NEXT:    nop
5031;
5032; MIPS32R2-LABEL: AtomicCmpSwapRes8:
5033; MIPS32R2:       # %bb.0: # %entry
5034; MIPS32R2-NEXT:    addiu $1, $zero, -4
5035; MIPS32R2-NEXT:    and $2, $4, $1
5036; MIPS32R2-NEXT:    andi $1, $4, 3
5037; MIPS32R2-NEXT:    sll $3, $1, 3
5038; MIPS32R2-NEXT:    ori $1, $zero, 255
5039; MIPS32R2-NEXT:    sllv $4, $1, $3
5040; MIPS32R2-NEXT:    nor $7, $zero, $4
5041; MIPS32R2-NEXT:    andi $1, $5, 255
5042; MIPS32R2-NEXT:    sllv $8, $1, $3
5043; MIPS32R2-NEXT:    andi $1, $6, 255
5044; MIPS32R2-NEXT:    sllv $6, $1, $3
5045; MIPS32R2-NEXT:  $BB13_1: # %entry
5046; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
5047; MIPS32R2-NEXT:    ll $9, 0($2)
5048; MIPS32R2-NEXT:    and $10, $9, $4
5049; MIPS32R2-NEXT:    bne $10, $8, $BB13_3
5050; MIPS32R2-NEXT:    nop
5051; MIPS32R2-NEXT:  # %bb.2: # %entry
5052; MIPS32R2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5053; MIPS32R2-NEXT:    and $9, $9, $7
5054; MIPS32R2-NEXT:    or $9, $9, $6
5055; MIPS32R2-NEXT:    sc $9, 0($2)
5056; MIPS32R2-NEXT:    beqz $9, $BB13_1
5057; MIPS32R2-NEXT:    nop
5058; MIPS32R2-NEXT:  $BB13_3: # %entry
5059; MIPS32R2-NEXT:    srlv $1, $10, $3
5060; MIPS32R2-NEXT:    seb $1, $1
5061; MIPS32R2-NEXT:  # %bb.4: # %entry
5062; MIPS32R2-NEXT:    xor $1, $1, $5
5063; MIPS32R2-NEXT:    jr $ra
5064; MIPS32R2-NEXT:    sltiu $2, $1, 1
5065;
5066; MIPS32R6-LABEL: AtomicCmpSwapRes8:
5067; MIPS32R6:       # %bb.0: # %entry
5068; MIPS32R6-NEXT:    addiu $1, $zero, -4
5069; MIPS32R6-NEXT:    and $2, $4, $1
5070; MIPS32R6-NEXT:    andi $1, $4, 3
5071; MIPS32R6-NEXT:    sll $3, $1, 3
5072; MIPS32R6-NEXT:    ori $1, $zero, 255
5073; MIPS32R6-NEXT:    sllv $4, $1, $3
5074; MIPS32R6-NEXT:    nor $7, $zero, $4
5075; MIPS32R6-NEXT:    andi $1, $5, 255
5076; MIPS32R6-NEXT:    sllv $8, $1, $3
5077; MIPS32R6-NEXT:    andi $1, $6, 255
5078; MIPS32R6-NEXT:    sllv $6, $1, $3
5079; MIPS32R6-NEXT:  $BB13_1: # %entry
5080; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
5081; MIPS32R6-NEXT:    ll $9, 0($2)
5082; MIPS32R6-NEXT:    and $10, $9, $4
5083; MIPS32R6-NEXT:    bnec $10, $8, $BB13_3
5084; MIPS32R6-NEXT:  # %bb.2: # %entry
5085; MIPS32R6-NEXT:    # in Loop: Header=BB13_1 Depth=1
5086; MIPS32R6-NEXT:    and $9, $9, $7
5087; MIPS32R6-NEXT:    or $9, $9, $6
5088; MIPS32R6-NEXT:    sc $9, 0($2)
5089; MIPS32R6-NEXT:    beqzc $9, $BB13_1
5090; MIPS32R6-NEXT:  $BB13_3: # %entry
5091; MIPS32R6-NEXT:    srlv $1, $10, $3
5092; MIPS32R6-NEXT:    seb $1, $1
5093; MIPS32R6-NEXT:  # %bb.4: # %entry
5094; MIPS32R6-NEXT:    xor $1, $1, $5
5095; MIPS32R6-NEXT:    jr $ra
5096; MIPS32R6-NEXT:    sltiu $2, $1, 1
5097;
5098; MIPS32R6O0-LABEL: AtomicCmpSwapRes8:
5099; MIPS32R6O0:       # %bb.0: # %entry
5100; MIPS32R6O0-NEXT:    addiu $sp, $sp, -24
5101; MIPS32R6O0-NEXT:    move $1, $6
5102; MIPS32R6O0-NEXT:    move $2, $5
5103; MIPS32R6O0-NEXT:    move $3, $4
5104; MIPS32R6O0-NEXT:    addiu $7, $zero, -4
5105; MIPS32R6O0-NEXT:    and $7, $4, $7
5106; MIPS32R6O0-NEXT:    andi $4, $4, 3
5107; MIPS32R6O0-NEXT:    sll $4, $4, 3
5108; MIPS32R6O0-NEXT:    ori $8, $zero, 255
5109; MIPS32R6O0-NEXT:    sllv $8, $8, $4
5110; MIPS32R6O0-NEXT:    nor $9, $zero, $8
5111; MIPS32R6O0-NEXT:    andi $10, $5, 255
5112; MIPS32R6O0-NEXT:    sllv $10, $10, $4
5113; MIPS32R6O0-NEXT:    andi $6, $6, 255
5114; MIPS32R6O0-NEXT:    sllv $6, $6, $4
5115; MIPS32R6O0-NEXT:  $BB13_1: # %entry
5116; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5117; MIPS32R6O0-NEXT:    ll $12, 0($7)
5118; MIPS32R6O0-NEXT:    and $13, $12, $8
5119; MIPS32R6O0-NEXT:    bnec $13, $10, $BB13_3
5120; MIPS32R6O0-NEXT:  # %bb.2: # %entry
5121; MIPS32R6O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
5122; MIPS32R6O0-NEXT:    and $12, $12, $9
5123; MIPS32R6O0-NEXT:    or $12, $12, $6
5124; MIPS32R6O0-NEXT:    sc $12, 0($7)
5125; MIPS32R6O0-NEXT:    beqzc $12, $BB13_1
5126; MIPS32R6O0-NEXT:  $BB13_3: # %entry
5127; MIPS32R6O0-NEXT:    srlv $11, $13, $4
5128; MIPS32R6O0-NEXT:    seb $11, $11
5129; MIPS32R6O0-NEXT:  # %bb.4: # %entry
5130; MIPS32R6O0-NEXT:    sw $11, 20($sp) # 4-byte Folded Spill
5131; MIPS32R6O0-NEXT:    sw $5, 16($sp) # 4-byte Folded Spill
5132; MIPS32R6O0-NEXT:    sw $3, 12($sp) # 4-byte Folded Spill
5133; MIPS32R6O0-NEXT:    sw $1, 8($sp) # 4-byte Folded Spill
5134; MIPS32R6O0-NEXT:    sw $2, 4($sp) # 4-byte Folded Spill
5135; MIPS32R6O0-NEXT:  # %bb.5: # %entry
5136; MIPS32R6O0-NEXT:    lw $1, 20($sp) # 4-byte Folded Reload
5137; MIPS32R6O0-NEXT:    lw $2, 16($sp) # 4-byte Folded Reload
5138; MIPS32R6O0-NEXT:    xor $1, $1, $2
5139; MIPS32R6O0-NEXT:    sltiu $2, $1, 1
5140; MIPS32R6O0-NEXT:    addiu $sp, $sp, 24
5141; MIPS32R6O0-NEXT:    jrc $ra
5142;
5143; MIPS4-LABEL: AtomicCmpSwapRes8:
5144; MIPS4:       # %bb.0: # %entry
5145; MIPS4-NEXT:    daddiu $1, $zero, -4
5146; MIPS4-NEXT:    and $2, $4, $1
5147; MIPS4-NEXT:    andi $1, $4, 3
5148; MIPS4-NEXT:    sll $3, $1, 3
5149; MIPS4-NEXT:    ori $1, $zero, 255
5150; MIPS4-NEXT:    sllv $4, $1, $3
5151; MIPS4-NEXT:    nor $7, $zero, $4
5152; MIPS4-NEXT:    andi $1, $5, 255
5153; MIPS4-NEXT:    sllv $8, $1, $3
5154; MIPS4-NEXT:    andi $1, $6, 255
5155; MIPS4-NEXT:    sllv $6, $1, $3
5156; MIPS4-NEXT:  .LBB13_1: # %entry
5157; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
5158; MIPS4-NEXT:    ll $9, 0($2)
5159; MIPS4-NEXT:    and $10, $9, $4
5160; MIPS4-NEXT:    bne $10, $8, .LBB13_3
5161; MIPS4-NEXT:    nop
5162; MIPS4-NEXT:  # %bb.2: # %entry
5163; MIPS4-NEXT:    # in Loop: Header=BB13_1 Depth=1
5164; MIPS4-NEXT:    and $9, $9, $7
5165; MIPS4-NEXT:    or $9, $9, $6
5166; MIPS4-NEXT:    sc $9, 0($2)
5167; MIPS4-NEXT:    beqz $9, .LBB13_1
5168; MIPS4-NEXT:    nop
5169; MIPS4-NEXT:  .LBB13_3: # %entry
5170; MIPS4-NEXT:    srlv $1, $10, $3
5171; MIPS4-NEXT:    sll $1, $1, 24
5172; MIPS4-NEXT:    sra $1, $1, 24
5173; MIPS4-NEXT:  # %bb.4: # %entry
5174; MIPS4-NEXT:    sll $2, $5, 24
5175; MIPS4-NEXT:    sra $2, $2, 24
5176; MIPS4-NEXT:    xor $1, $1, $2
5177; MIPS4-NEXT:    jr $ra
5178; MIPS4-NEXT:    sltiu $2, $1, 1
5179;
5180; MIPS64-LABEL: AtomicCmpSwapRes8:
5181; MIPS64:       # %bb.0: # %entry
5182; MIPS64-NEXT:    daddiu $1, $zero, -4
5183; MIPS64-NEXT:    and $2, $4, $1
5184; MIPS64-NEXT:    andi $1, $4, 3
5185; MIPS64-NEXT:    sll $3, $1, 3
5186; MIPS64-NEXT:    ori $1, $zero, 255
5187; MIPS64-NEXT:    sllv $4, $1, $3
5188; MIPS64-NEXT:    nor $7, $zero, $4
5189; MIPS64-NEXT:    andi $1, $5, 255
5190; MIPS64-NEXT:    sllv $8, $1, $3
5191; MIPS64-NEXT:    andi $1, $6, 255
5192; MIPS64-NEXT:    sllv $6, $1, $3
5193; MIPS64-NEXT:  .LBB13_1: # %entry
5194; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
5195; MIPS64-NEXT:    ll $9, 0($2)
5196; MIPS64-NEXT:    and $10, $9, $4
5197; MIPS64-NEXT:    bne $10, $8, .LBB13_3
5198; MIPS64-NEXT:    nop
5199; MIPS64-NEXT:  # %bb.2: # %entry
5200; MIPS64-NEXT:    # in Loop: Header=BB13_1 Depth=1
5201; MIPS64-NEXT:    and $9, $9, $7
5202; MIPS64-NEXT:    or $9, $9, $6
5203; MIPS64-NEXT:    sc $9, 0($2)
5204; MIPS64-NEXT:    beqz $9, .LBB13_1
5205; MIPS64-NEXT:    nop
5206; MIPS64-NEXT:  .LBB13_3: # %entry
5207; MIPS64-NEXT:    srlv $1, $10, $3
5208; MIPS64-NEXT:    sll $1, $1, 24
5209; MIPS64-NEXT:    sra $1, $1, 24
5210; MIPS64-NEXT:  # %bb.4: # %entry
5211; MIPS64-NEXT:    sll $2, $5, 24
5212; MIPS64-NEXT:    sra $2, $2, 24
5213; MIPS64-NEXT:    xor $1, $1, $2
5214; MIPS64-NEXT:    jr $ra
5215; MIPS64-NEXT:    sltiu $2, $1, 1
5216;
5217; MIPS64R2-LABEL: AtomicCmpSwapRes8:
5218; MIPS64R2:       # %bb.0: # %entry
5219; MIPS64R2-NEXT:    daddiu $1, $zero, -4
5220; MIPS64R2-NEXT:    and $2, $4, $1
5221; MIPS64R2-NEXT:    andi $1, $4, 3
5222; MIPS64R2-NEXT:    sll $3, $1, 3
5223; MIPS64R2-NEXT:    ori $1, $zero, 255
5224; MIPS64R2-NEXT:    sllv $4, $1, $3
5225; MIPS64R2-NEXT:    nor $7, $zero, $4
5226; MIPS64R2-NEXT:    andi $1, $5, 255
5227; MIPS64R2-NEXT:    sllv $8, $1, $3
5228; MIPS64R2-NEXT:    andi $1, $6, 255
5229; MIPS64R2-NEXT:    sllv $6, $1, $3
5230; MIPS64R2-NEXT:  .LBB13_1: # %entry
5231; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
5232; MIPS64R2-NEXT:    ll $9, 0($2)
5233; MIPS64R2-NEXT:    and $10, $9, $4
5234; MIPS64R2-NEXT:    bne $10, $8, .LBB13_3
5235; MIPS64R2-NEXT:    nop
5236; MIPS64R2-NEXT:  # %bb.2: # %entry
5237; MIPS64R2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5238; MIPS64R2-NEXT:    and $9, $9, $7
5239; MIPS64R2-NEXT:    or $9, $9, $6
5240; MIPS64R2-NEXT:    sc $9, 0($2)
5241; MIPS64R2-NEXT:    beqz $9, .LBB13_1
5242; MIPS64R2-NEXT:    nop
5243; MIPS64R2-NEXT:  .LBB13_3: # %entry
5244; MIPS64R2-NEXT:    srlv $1, $10, $3
5245; MIPS64R2-NEXT:    seb $1, $1
5246; MIPS64R2-NEXT:  # %bb.4: # %entry
5247; MIPS64R2-NEXT:    xor $1, $1, $5
5248; MIPS64R2-NEXT:    jr $ra
5249; MIPS64R2-NEXT:    sltiu $2, $1, 1
5250;
5251; MIPS64R6-LABEL: AtomicCmpSwapRes8:
5252; MIPS64R6:       # %bb.0: # %entry
5253; MIPS64R6-NEXT:    daddiu $1, $zero, -4
5254; MIPS64R6-NEXT:    and $2, $4, $1
5255; MIPS64R6-NEXT:    andi $1, $4, 3
5256; MIPS64R6-NEXT:    sll $3, $1, 3
5257; MIPS64R6-NEXT:    ori $1, $zero, 255
5258; MIPS64R6-NEXT:    sllv $4, $1, $3
5259; MIPS64R6-NEXT:    nor $7, $zero, $4
5260; MIPS64R6-NEXT:    andi $1, $5, 255
5261; MIPS64R6-NEXT:    sllv $8, $1, $3
5262; MIPS64R6-NEXT:    andi $1, $6, 255
5263; MIPS64R6-NEXT:    sllv $6, $1, $3
5264; MIPS64R6-NEXT:  .LBB13_1: # %entry
5265; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
5266; MIPS64R6-NEXT:    ll $9, 0($2)
5267; MIPS64R6-NEXT:    and $10, $9, $4
5268; MIPS64R6-NEXT:    bnec $10, $8, .LBB13_3
5269; MIPS64R6-NEXT:  # %bb.2: # %entry
5270; MIPS64R6-NEXT:    # in Loop: Header=BB13_1 Depth=1
5271; MIPS64R6-NEXT:    and $9, $9, $7
5272; MIPS64R6-NEXT:    or $9, $9, $6
5273; MIPS64R6-NEXT:    sc $9, 0($2)
5274; MIPS64R6-NEXT:    beqzc $9, .LBB13_1
5275; MIPS64R6-NEXT:  .LBB13_3: # %entry
5276; MIPS64R6-NEXT:    srlv $1, $10, $3
5277; MIPS64R6-NEXT:    seb $1, $1
5278; MIPS64R6-NEXT:  # %bb.4: # %entry
5279; MIPS64R6-NEXT:    xor $1, $1, $5
5280; MIPS64R6-NEXT:    jr $ra
5281; MIPS64R6-NEXT:    sltiu $2, $1, 1
5282;
5283; MIPS64R6O0-LABEL: AtomicCmpSwapRes8:
5284; MIPS64R6O0:       # %bb.0: # %entry
5285; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
5286; MIPS64R6O0-NEXT:    move $1, $6
5287; MIPS64R6O0-NEXT:    move $2, $5
5288; MIPS64R6O0-NEXT:    move $5, $4
5289; MIPS64R6O0-NEXT:    daddiu $6, $zero, -4
5290; MIPS64R6O0-NEXT:    and $6, $4, $6
5291; MIPS64R6O0-NEXT:    andi $3, $4, 3
5292; MIPS64R6O0-NEXT:    xori $3, $3, 3
5293; MIPS64R6O0-NEXT:    sll $3, $3, 3
5294; MIPS64R6O0-NEXT:    ori $7, $zero, 255
5295; MIPS64R6O0-NEXT:    sllv $7, $7, $3
5296; MIPS64R6O0-NEXT:    nor $8, $zero, $7
5297; MIPS64R6O0-NEXT:    andi $9, $2, 255
5298; MIPS64R6O0-NEXT:    sllv $9, $9, $3
5299; MIPS64R6O0-NEXT:    andi $1, $1, 255
5300; MIPS64R6O0-NEXT:    sllv $1, $1, $3
5301; MIPS64R6O0-NEXT:  .LBB13_1: # %entry
5302; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5303; MIPS64R6O0-NEXT:    ll $11, 0($6)
5304; MIPS64R6O0-NEXT:    and $12, $11, $7
5305; MIPS64R6O0-NEXT:    bnec $12, $9, .LBB13_3
5306; MIPS64R6O0-NEXT:  # %bb.2: # %entry
5307; MIPS64R6O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
5308; MIPS64R6O0-NEXT:    and $11, $11, $8
5309; MIPS64R6O0-NEXT:    or $11, $11, $1
5310; MIPS64R6O0-NEXT:    sc $11, 0($6)
5311; MIPS64R6O0-NEXT:    beqzc $11, .LBB13_1
5312; MIPS64R6O0-NEXT:  .LBB13_3: # %entry
5313; MIPS64R6O0-NEXT:    srlv $10, $12, $3
5314; MIPS64R6O0-NEXT:    seb $10, $10
5315; MIPS64R6O0-NEXT:  # %bb.4: # %entry
5316; MIPS64R6O0-NEXT:    sd $5, 8($sp) # 8-byte Folded Spill
5317; MIPS64R6O0-NEXT:    sw $10, 4($sp) # 4-byte Folded Spill
5318; MIPS64R6O0-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
5319; MIPS64R6O0-NEXT:  # %bb.5: # %entry
5320; MIPS64R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5321; MIPS64R6O0-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
5322; MIPS64R6O0-NEXT:    xor $1, $1, $2
5323; MIPS64R6O0-NEXT:    sltiu $2, $1, 1
5324; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
5325; MIPS64R6O0-NEXT:    jrc $ra
5326;
5327; MM32-LABEL: AtomicCmpSwapRes8:
5328; MM32:       # %bb.0: # %entry
5329; MM32-NEXT:    addiu $1, $zero, -4
5330; MM32-NEXT:    and $2, $4, $1
5331; MM32-NEXT:    andi $1, $4, 3
5332; MM32-NEXT:    sll $3, $1, 3
5333; MM32-NEXT:    ori $1, $zero, 255
5334; MM32-NEXT:    sllv $4, $1, $3
5335; MM32-NEXT:    nor $7, $zero, $4
5336; MM32-NEXT:    andi $1, $5, 255
5337; MM32-NEXT:    sllv $8, $1, $3
5338; MM32-NEXT:    andi $1, $6, 255
5339; MM32-NEXT:    sllv $6, $1, $3
5340; MM32-NEXT:  $BB13_1: # %entry
5341; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
5342; MM32-NEXT:    ll $9, 0($2)
5343; MM32-NEXT:    and $10, $9, $4
5344; MM32-NEXT:    bne $10, $8, $BB13_3
5345; MM32-NEXT:    nop
5346; MM32-NEXT:  # %bb.2: # %entry
5347; MM32-NEXT:    # in Loop: Header=BB13_1 Depth=1
5348; MM32-NEXT:    and $9, $9, $7
5349; MM32-NEXT:    or $9, $9, $6
5350; MM32-NEXT:    sc $9, 0($2)
5351; MM32-NEXT:    beqzc $9, $BB13_1
5352; MM32-NEXT:  $BB13_3: # %entry
5353; MM32-NEXT:    srlv $1, $10, $3
5354; MM32-NEXT:    seb $1, $1
5355; MM32-NEXT:  # %bb.4: # %entry
5356; MM32-NEXT:    xor $1, $1, $5
5357; MM32-NEXT:    jr $ra
5358; MM32-NEXT:    sltiu $2, $1, 1
5359;
5360; O1-LABEL: AtomicCmpSwapRes8:
5361; O1:       # %bb.0: # %entry
5362; O1-NEXT:    addiu $1, $zero, -4
5363; O1-NEXT:    and $2, $4, $1
5364; O1-NEXT:    andi $1, $4, 3
5365; O1-NEXT:    sll $3, $1, 3
5366; O1-NEXT:    ori $1, $zero, 255
5367; O1-NEXT:    sllv $4, $1, $3
5368; O1-NEXT:    nor $7, $zero, $4
5369; O1-NEXT:    andi $1, $5, 255
5370; O1-NEXT:    sllv $8, $1, $3
5371; O1-NEXT:    andi $1, $6, 255
5372; O1-NEXT:    sllv $6, $1, $3
5373; O1-NEXT:  $BB13_1: # %entry
5374; O1-NEXT:    # =>This Inner Loop Header: Depth=1
5375; O1-NEXT:    ll $9, 0($2)
5376; O1-NEXT:    and $10, $9, $4
5377; O1-NEXT:    bne $10, $8, $BB13_3
5378; O1-NEXT:    nop
5379; O1-NEXT:  # %bb.2: # %entry
5380; O1-NEXT:    # in Loop: Header=BB13_1 Depth=1
5381; O1-NEXT:    and $9, $9, $7
5382; O1-NEXT:    or $9, $9, $6
5383; O1-NEXT:    sc $9, 0($2)
5384; O1-NEXT:    beqz $9, $BB13_1
5385; O1-NEXT:    nop
5386; O1-NEXT:  $BB13_3: # %entry
5387; O1-NEXT:    srlv $1, $10, $3
5388; O1-NEXT:    sll $1, $1, 24
5389; O1-NEXT:    sra $1, $1, 24
5390; O1-NEXT:  # %bb.4: # %entry
5391; O1-NEXT:    sll $2, $5, 24
5392; O1-NEXT:    sra $2, $2, 24
5393; O1-NEXT:    xor $1, $1, $2
5394; O1-NEXT:    jr $ra
5395; O1-NEXT:    sltiu $2, $1, 1
5396;
5397; O2-LABEL: AtomicCmpSwapRes8:
5398; O2:       # %bb.0: # %entry
5399; O2-NEXT:    addiu $1, $zero, -4
5400; O2-NEXT:    and $2, $4, $1
5401; O2-NEXT:    andi $1, $4, 3
5402; O2-NEXT:    sll $3, $1, 3
5403; O2-NEXT:    ori $1, $zero, 255
5404; O2-NEXT:    sllv $4, $1, $3
5405; O2-NEXT:    nor $7, $zero, $4
5406; O2-NEXT:    andi $1, $5, 255
5407; O2-NEXT:    sllv $8, $1, $3
5408; O2-NEXT:    andi $1, $6, 255
5409; O2-NEXT:    sllv $6, $1, $3
5410; O2-NEXT:  $BB13_1: # %entry
5411; O2-NEXT:    # =>This Inner Loop Header: Depth=1
5412; O2-NEXT:    ll $9, 0($2)
5413; O2-NEXT:    and $10, $9, $4
5414; O2-NEXT:    bne $10, $8, $BB13_3
5415; O2-NEXT:    nop
5416; O2-NEXT:  # %bb.2: # %entry
5417; O2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5418; O2-NEXT:    and $9, $9, $7
5419; O2-NEXT:    or $9, $9, $6
5420; O2-NEXT:    sc $9, 0($2)
5421; O2-NEXT:    beqz $9, $BB13_1
5422; O2-NEXT:    nop
5423; O2-NEXT:  $BB13_3: # %entry
5424; O2-NEXT:    srlv $1, $10, $3
5425; O2-NEXT:    sll $1, $1, 24
5426; O2-NEXT:    sra $1, $1, 24
5427; O2-NEXT:  # %bb.4: # %entry
5428; O2-NEXT:    sll $2, $5, 24
5429; O2-NEXT:    sra $2, $2, 24
5430; O2-NEXT:    xor $1, $1, $2
5431; O2-NEXT:    jr $ra
5432; O2-NEXT:    sltiu $2, $1, 1
5433;
5434; O3-LABEL: AtomicCmpSwapRes8:
5435; O3:       # %bb.0: # %entry
5436; O3-NEXT:    addiu $1, $zero, -4
5437; O3-NEXT:    and $2, $4, $1
5438; O3-NEXT:    andi $1, $4, 3
5439; O3-NEXT:    sll $3, $1, 3
5440; O3-NEXT:    ori $1, $zero, 255
5441; O3-NEXT:    sllv $4, $1, $3
5442; O3-NEXT:    andi $1, $5, 255
5443; O3-NEXT:    sllv $8, $1, $3
5444; O3-NEXT:    andi $1, $6, 255
5445; O3-NEXT:    nor $7, $zero, $4
5446; O3-NEXT:    sllv $6, $1, $3
5447; O3-NEXT:  $BB13_1: # %entry
5448; O3-NEXT:    # =>This Inner Loop Header: Depth=1
5449; O3-NEXT:    ll $9, 0($2)
5450; O3-NEXT:    and $10, $9, $4
5451; O3-NEXT:    bne $10, $8, $BB13_3
5452; O3-NEXT:    nop
5453; O3-NEXT:  # %bb.2: # %entry
5454; O3-NEXT:    # in Loop: Header=BB13_1 Depth=1
5455; O3-NEXT:    and $9, $9, $7
5456; O3-NEXT:    or $9, $9, $6
5457; O3-NEXT:    sc $9, 0($2)
5458; O3-NEXT:    beqz $9, $BB13_1
5459; O3-NEXT:    nop
5460; O3-NEXT:  $BB13_3: # %entry
5461; O3-NEXT:    srlv $1, $10, $3
5462; O3-NEXT:    sll $1, $1, 24
5463; O3-NEXT:    sra $1, $1, 24
5464; O3-NEXT:  # %bb.4: # %entry
5465; O3-NEXT:    sll $2, $5, 24
5466; O3-NEXT:    sra $2, $2, 24
5467; O3-NEXT:    xor $1, $1, $2
5468; O3-NEXT:    jr $ra
5469; O3-NEXT:    sltiu $2, $1, 1
5470;
5471; MIPS32EB-LABEL: AtomicCmpSwapRes8:
5472; MIPS32EB:       # %bb.0: # %entry
5473; MIPS32EB-NEXT:    addiu $1, $zero, -4
5474; MIPS32EB-NEXT:    and $2, $4, $1
5475; MIPS32EB-NEXT:    andi $1, $4, 3
5476; MIPS32EB-NEXT:    xori $1, $1, 3
5477; MIPS32EB-NEXT:    sll $3, $1, 3
5478; MIPS32EB-NEXT:    ori $1, $zero, 255
5479; MIPS32EB-NEXT:    sllv $4, $1, $3
5480; MIPS32EB-NEXT:    nor $7, $zero, $4
5481; MIPS32EB-NEXT:    andi $1, $5, 255
5482; MIPS32EB-NEXT:    sllv $8, $1, $3
5483; MIPS32EB-NEXT:    andi $1, $6, 255
5484; MIPS32EB-NEXT:    sllv $6, $1, $3
5485; MIPS32EB-NEXT:  $BB13_1: # %entry
5486; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
5487; MIPS32EB-NEXT:    ll $9, 0($2)
5488; MIPS32EB-NEXT:    and $10, $9, $4
5489; MIPS32EB-NEXT:    bne $10, $8, $BB13_3
5490; MIPS32EB-NEXT:    nop
5491; MIPS32EB-NEXT:  # %bb.2: # %entry
5492; MIPS32EB-NEXT:    # in Loop: Header=BB13_1 Depth=1
5493; MIPS32EB-NEXT:    and $9, $9, $7
5494; MIPS32EB-NEXT:    or $9, $9, $6
5495; MIPS32EB-NEXT:    sc $9, 0($2)
5496; MIPS32EB-NEXT:    beqz $9, $BB13_1
5497; MIPS32EB-NEXT:    nop
5498; MIPS32EB-NEXT:  $BB13_3: # %entry
5499; MIPS32EB-NEXT:    srlv $1, $10, $3
5500; MIPS32EB-NEXT:    sll $1, $1, 24
5501; MIPS32EB-NEXT:    sra $1, $1, 24
5502; MIPS32EB-NEXT:  # %bb.4: # %entry
5503; MIPS32EB-NEXT:    sll $2, $5, 24
5504; MIPS32EB-NEXT:    sra $2, $2, 24
5505; MIPS32EB-NEXT:    xor $1, $1, $2
5506; MIPS32EB-NEXT:    jr $ra
5507; MIPS32EB-NEXT:    sltiu $2, $1, 1
5508entry:
5509  %0 = cmpxchg i8* %ptr, i8 %oldval, i8 %newval monotonic monotonic
5510  %1 = extractvalue { i8, i1 } %0, 1
5511  ret i1 %1
5512; FIXME: -march=mips produces a redundant sign extension here...
5513; FIXME: ...Leading to this split check.
5514
5515}
5516
5517; Check one i16 so that we cover the seh sign extend
5518@z = common global i16 0, align 1
5519
5520define signext i16 @AtomicLoadAdd16(i16 signext %incr) nounwind {
5521; MIPS32-LABEL: AtomicLoadAdd16:
5522; MIPS32:       # %bb.0: # %entry
5523; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
5524; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
5525; MIPS32-NEXT:    addu $1, $2, $25
5526; MIPS32-NEXT:    lw $1, %got(z)($1)
5527; MIPS32-NEXT:    addiu $2, $zero, -4
5528; MIPS32-NEXT:    and $2, $1, $2
5529; MIPS32-NEXT:    andi $1, $1, 3
5530; MIPS32-NEXT:    sll $3, $1, 3
5531; MIPS32-NEXT:    ori $1, $zero, 65535
5532; MIPS32-NEXT:    sllv $5, $1, $3
5533; MIPS32-NEXT:    nor $6, $zero, $5
5534; MIPS32-NEXT:    sllv $4, $4, $3
5535; MIPS32-NEXT:  $BB14_1: # %entry
5536; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
5537; MIPS32-NEXT:    ll $7, 0($2)
5538; MIPS32-NEXT:    addu $8, $7, $4
5539; MIPS32-NEXT:    and $8, $8, $5
5540; MIPS32-NEXT:    and $9, $7, $6
5541; MIPS32-NEXT:    or $9, $9, $8
5542; MIPS32-NEXT:    sc $9, 0($2)
5543; MIPS32-NEXT:    beqz $9, $BB14_1
5544; MIPS32-NEXT:    nop
5545; MIPS32-NEXT:  # %bb.2: # %entry
5546; MIPS32-NEXT:    and $1, $7, $5
5547; MIPS32-NEXT:    srlv $1, $1, $3
5548; MIPS32-NEXT:    sll $1, $1, 16
5549; MIPS32-NEXT:    sra $1, $1, 16
5550; MIPS32-NEXT:  # %bb.3: # %entry
5551; MIPS32-NEXT:    sll $1, $1, 16
5552; MIPS32-NEXT:    jr $ra
5553; MIPS32-NEXT:    sra $2, $1, 16
5554;
5555; MIPS32O0-LABEL: AtomicLoadAdd16:
5556; MIPS32O0:       # %bb.0: # %entry
5557; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
5558; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
5559; MIPS32O0-NEXT:    addiu $sp, $sp, -8
5560; MIPS32O0-NEXT:    addu $2, $2, $25
5561; MIPS32O0-NEXT:    lw $2, %got(z)($2)
5562; MIPS32O0-NEXT:    addiu $25, $zero, -4
5563; MIPS32O0-NEXT:    and $25, $2, $25
5564; MIPS32O0-NEXT:    andi $2, $2, 3
5565; MIPS32O0-NEXT:    sll $2, $2, 3
5566; MIPS32O0-NEXT:    ori $1, $zero, 65535
5567; MIPS32O0-NEXT:    sllv $1, $1, $2
5568; MIPS32O0-NEXT:    nor $3, $zero, $1
5569; MIPS32O0-NEXT:    sllv $4, $4, $2
5570; MIPS32O0-NEXT:  $BB14_1: # %entry
5571; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
5572; MIPS32O0-NEXT:    ll $6, 0($25)
5573; MIPS32O0-NEXT:    addu $7, $6, $4
5574; MIPS32O0-NEXT:    and $7, $7, $1
5575; MIPS32O0-NEXT:    and $8, $6, $3
5576; MIPS32O0-NEXT:    or $8, $8, $7
5577; MIPS32O0-NEXT:    sc $8, 0($25)
5578; MIPS32O0-NEXT:    beqz $8, $BB14_1
5579; MIPS32O0-NEXT:    nop
5580; MIPS32O0-NEXT:  # %bb.2: # %entry
5581; MIPS32O0-NEXT:    and $5, $6, $1
5582; MIPS32O0-NEXT:    srlv $5, $5, $2
5583; MIPS32O0-NEXT:    sll $5, $5, 16
5584; MIPS32O0-NEXT:    sra $5, $5, 16
5585; MIPS32O0-NEXT:  # %bb.3: # %entry
5586; MIPS32O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
5587; MIPS32O0-NEXT:  # %bb.4: # %entry
5588; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5589; MIPS32O0-NEXT:    sll $2, $1, 16
5590; MIPS32O0-NEXT:    sra $2, $2, 16
5591; MIPS32O0-NEXT:    addiu $sp, $sp, 8
5592; MIPS32O0-NEXT:    jr $ra
5593; MIPS32O0-NEXT:    nop
5594;
5595; MIPS32R2-LABEL: AtomicLoadAdd16:
5596; MIPS32R2:       # %bb.0: # %entry
5597; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
5598; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
5599; MIPS32R2-NEXT:    addu $1, $2, $25
5600; MIPS32R2-NEXT:    lw $1, %got(z)($1)
5601; MIPS32R2-NEXT:    addiu $2, $zero, -4
5602; MIPS32R2-NEXT:    and $2, $1, $2
5603; MIPS32R2-NEXT:    andi $1, $1, 3
5604; MIPS32R2-NEXT:    sll $3, $1, 3
5605; MIPS32R2-NEXT:    ori $1, $zero, 65535
5606; MIPS32R2-NEXT:    sllv $5, $1, $3
5607; MIPS32R2-NEXT:    nor $6, $zero, $5
5608; MIPS32R2-NEXT:    sllv $4, $4, $3
5609; MIPS32R2-NEXT:  $BB14_1: # %entry
5610; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
5611; MIPS32R2-NEXT:    ll $7, 0($2)
5612; MIPS32R2-NEXT:    addu $8, $7, $4
5613; MIPS32R2-NEXT:    and $8, $8, $5
5614; MIPS32R2-NEXT:    and $9, $7, $6
5615; MIPS32R2-NEXT:    or $9, $9, $8
5616; MIPS32R2-NEXT:    sc $9, 0($2)
5617; MIPS32R2-NEXT:    beqz $9, $BB14_1
5618; MIPS32R2-NEXT:    nop
5619; MIPS32R2-NEXT:  # %bb.2: # %entry
5620; MIPS32R2-NEXT:    and $1, $7, $5
5621; MIPS32R2-NEXT:    srlv $1, $1, $3
5622; MIPS32R2-NEXT:    seh $1, $1
5623; MIPS32R2-NEXT:  # %bb.3: # %entry
5624; MIPS32R2-NEXT:    jr $ra
5625; MIPS32R2-NEXT:    seh $2, $1
5626;
5627; MIPS32R6-LABEL: AtomicLoadAdd16:
5628; MIPS32R6:       # %bb.0: # %entry
5629; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
5630; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
5631; MIPS32R6-NEXT:    addu $1, $2, $25
5632; MIPS32R6-NEXT:    lw $1, %got(z)($1)
5633; MIPS32R6-NEXT:    addiu $2, $zero, -4
5634; MIPS32R6-NEXT:    and $2, $1, $2
5635; MIPS32R6-NEXT:    andi $1, $1, 3
5636; MIPS32R6-NEXT:    sll $3, $1, 3
5637; MIPS32R6-NEXT:    ori $1, $zero, 65535
5638; MIPS32R6-NEXT:    sllv $5, $1, $3
5639; MIPS32R6-NEXT:    nor $6, $zero, $5
5640; MIPS32R6-NEXT:    sllv $4, $4, $3
5641; MIPS32R6-NEXT:  $BB14_1: # %entry
5642; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
5643; MIPS32R6-NEXT:    ll $7, 0($2)
5644; MIPS32R6-NEXT:    addu $8, $7, $4
5645; MIPS32R6-NEXT:    and $8, $8, $5
5646; MIPS32R6-NEXT:    and $9, $7, $6
5647; MIPS32R6-NEXT:    or $9, $9, $8
5648; MIPS32R6-NEXT:    sc $9, 0($2)
5649; MIPS32R6-NEXT:    beqzc $9, $BB14_1
5650; MIPS32R6-NEXT:  # %bb.2: # %entry
5651; MIPS32R6-NEXT:    and $1, $7, $5
5652; MIPS32R6-NEXT:    srlv $1, $1, $3
5653; MIPS32R6-NEXT:    seh $1, $1
5654; MIPS32R6-NEXT:  # %bb.3: # %entry
5655; MIPS32R6-NEXT:    jr $ra
5656; MIPS32R6-NEXT:    seh $2, $1
5657;
5658; MIPS32R6O0-LABEL: AtomicLoadAdd16:
5659; MIPS32R6O0:       # %bb.0: # %entry
5660; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
5661; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
5662; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
5663; MIPS32R6O0-NEXT:    addu $2, $2, $25
5664; MIPS32R6O0-NEXT:    move $25, $4
5665; MIPS32R6O0-NEXT:    lw $2, %got(z)($2)
5666; MIPS32R6O0-NEXT:    addiu $1, $zero, -4
5667; MIPS32R6O0-NEXT:    and $1, $2, $1
5668; MIPS32R6O0-NEXT:    andi $2, $2, 3
5669; MIPS32R6O0-NEXT:    sll $2, $2, 3
5670; MIPS32R6O0-NEXT:    ori $3, $zero, 65535
5671; MIPS32R6O0-NEXT:    sllv $3, $3, $2
5672; MIPS32R6O0-NEXT:    nor $5, $zero, $3
5673; MIPS32R6O0-NEXT:    sllv $4, $4, $2
5674; MIPS32R6O0-NEXT:  $BB14_1: # %entry
5675; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5676; MIPS32R6O0-NEXT:    ll $7, 0($1)
5677; MIPS32R6O0-NEXT:    addu $8, $7, $4
5678; MIPS32R6O0-NEXT:    and $8, $8, $3
5679; MIPS32R6O0-NEXT:    and $9, $7, $5
5680; MIPS32R6O0-NEXT:    or $9, $9, $8
5681; MIPS32R6O0-NEXT:    sc $9, 0($1)
5682; MIPS32R6O0-NEXT:    beqzc $9, $BB14_1
5683; MIPS32R6O0-NEXT:  # %bb.2: # %entry
5684; MIPS32R6O0-NEXT:    and $6, $7, $3
5685; MIPS32R6O0-NEXT:    srlv $6, $6, $2
5686; MIPS32R6O0-NEXT:    seh $6, $6
5687; MIPS32R6O0-NEXT:  # %bb.3: # %entry
5688; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
5689; MIPS32R6O0-NEXT:    sw $6, 0($sp) # 4-byte Folded Spill
5690; MIPS32R6O0-NEXT:  # %bb.4: # %entry
5691; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
5692; MIPS32R6O0-NEXT:    seh $2, $1
5693; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
5694; MIPS32R6O0-NEXT:    jrc $ra
5695;
5696; MIPS4-LABEL: AtomicLoadAdd16:
5697; MIPS4:       # %bb.0: # %entry
5698; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5699; MIPS4-NEXT:    daddu $1, $1, $25
5700; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5701; MIPS4-NEXT:    ld $1, %got_disp(z)($1)
5702; MIPS4-NEXT:    daddiu $2, $zero, -4
5703; MIPS4-NEXT:    and $2, $1, $2
5704; MIPS4-NEXT:    andi $1, $1, 3
5705; MIPS4-NEXT:    sll $3, $1, 3
5706; MIPS4-NEXT:    ori $1, $zero, 65535
5707; MIPS4-NEXT:    sllv $5, $1, $3
5708; MIPS4-NEXT:    nor $6, $zero, $5
5709; MIPS4-NEXT:    sllv $4, $4, $3
5710; MIPS4-NEXT:  .LBB14_1: # %entry
5711; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
5712; MIPS4-NEXT:    ll $7, 0($2)
5713; MIPS4-NEXT:    addu $8, $7, $4
5714; MIPS4-NEXT:    and $8, $8, $5
5715; MIPS4-NEXT:    and $9, $7, $6
5716; MIPS4-NEXT:    or $9, $9, $8
5717; MIPS4-NEXT:    sc $9, 0($2)
5718; MIPS4-NEXT:    beqz $9, .LBB14_1
5719; MIPS4-NEXT:    nop
5720; MIPS4-NEXT:  # %bb.2: # %entry
5721; MIPS4-NEXT:    and $1, $7, $5
5722; MIPS4-NEXT:    srlv $1, $1, $3
5723; MIPS4-NEXT:    sll $1, $1, 16
5724; MIPS4-NEXT:    sra $1, $1, 16
5725; MIPS4-NEXT:  # %bb.3: # %entry
5726; MIPS4-NEXT:    sll $1, $1, 16
5727; MIPS4-NEXT:    jr $ra
5728; MIPS4-NEXT:    sra $2, $1, 16
5729;
5730; MIPS64-LABEL: AtomicLoadAdd16:
5731; MIPS64:       # %bb.0: # %entry
5732; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5733; MIPS64-NEXT:    daddu $1, $1, $25
5734; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5735; MIPS64-NEXT:    ld $1, %got_disp(z)($1)
5736; MIPS64-NEXT:    daddiu $2, $zero, -4
5737; MIPS64-NEXT:    and $2, $1, $2
5738; MIPS64-NEXT:    andi $1, $1, 3
5739; MIPS64-NEXT:    sll $3, $1, 3
5740; MIPS64-NEXT:    ori $1, $zero, 65535
5741; MIPS64-NEXT:    sllv $5, $1, $3
5742; MIPS64-NEXT:    nor $6, $zero, $5
5743; MIPS64-NEXT:    sllv $4, $4, $3
5744; MIPS64-NEXT:  .LBB14_1: # %entry
5745; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
5746; MIPS64-NEXT:    ll $7, 0($2)
5747; MIPS64-NEXT:    addu $8, $7, $4
5748; MIPS64-NEXT:    and $8, $8, $5
5749; MIPS64-NEXT:    and $9, $7, $6
5750; MIPS64-NEXT:    or $9, $9, $8
5751; MIPS64-NEXT:    sc $9, 0($2)
5752; MIPS64-NEXT:    beqz $9, .LBB14_1
5753; MIPS64-NEXT:    nop
5754; MIPS64-NEXT:  # %bb.2: # %entry
5755; MIPS64-NEXT:    and $1, $7, $5
5756; MIPS64-NEXT:    srlv $1, $1, $3
5757; MIPS64-NEXT:    sll $1, $1, 16
5758; MIPS64-NEXT:    sra $1, $1, 16
5759; MIPS64-NEXT:  # %bb.3: # %entry
5760; MIPS64-NEXT:    sll $1, $1, 16
5761; MIPS64-NEXT:    jr $ra
5762; MIPS64-NEXT:    sra $2, $1, 16
5763;
5764; MIPS64R2-LABEL: AtomicLoadAdd16:
5765; MIPS64R2:       # %bb.0: # %entry
5766; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5767; MIPS64R2-NEXT:    daddu $1, $1, $25
5768; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5769; MIPS64R2-NEXT:    ld $1, %got_disp(z)($1)
5770; MIPS64R2-NEXT:    daddiu $2, $zero, -4
5771; MIPS64R2-NEXT:    and $2, $1, $2
5772; MIPS64R2-NEXT:    andi $1, $1, 3
5773; MIPS64R2-NEXT:    sll $3, $1, 3
5774; MIPS64R2-NEXT:    ori $1, $zero, 65535
5775; MIPS64R2-NEXT:    sllv $5, $1, $3
5776; MIPS64R2-NEXT:    nor $6, $zero, $5
5777; MIPS64R2-NEXT:    sllv $4, $4, $3
5778; MIPS64R2-NEXT:  .LBB14_1: # %entry
5779; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
5780; MIPS64R2-NEXT:    ll $7, 0($2)
5781; MIPS64R2-NEXT:    addu $8, $7, $4
5782; MIPS64R2-NEXT:    and $8, $8, $5
5783; MIPS64R2-NEXT:    and $9, $7, $6
5784; MIPS64R2-NEXT:    or $9, $9, $8
5785; MIPS64R2-NEXT:    sc $9, 0($2)
5786; MIPS64R2-NEXT:    beqz $9, .LBB14_1
5787; MIPS64R2-NEXT:    nop
5788; MIPS64R2-NEXT:  # %bb.2: # %entry
5789; MIPS64R2-NEXT:    and $1, $7, $5
5790; MIPS64R2-NEXT:    srlv $1, $1, $3
5791; MIPS64R2-NEXT:    seh $1, $1
5792; MIPS64R2-NEXT:  # %bb.3: # %entry
5793; MIPS64R2-NEXT:    jr $ra
5794; MIPS64R2-NEXT:    seh $2, $1
5795;
5796; MIPS64R6-LABEL: AtomicLoadAdd16:
5797; MIPS64R6:       # %bb.0: # %entry
5798; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5799; MIPS64R6-NEXT:    daddu $1, $1, $25
5800; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5801; MIPS64R6-NEXT:    ld $1, %got_disp(z)($1)
5802; MIPS64R6-NEXT:    daddiu $2, $zero, -4
5803; MIPS64R6-NEXT:    and $2, $1, $2
5804; MIPS64R6-NEXT:    andi $1, $1, 3
5805; MIPS64R6-NEXT:    sll $3, $1, 3
5806; MIPS64R6-NEXT:    ori $1, $zero, 65535
5807; MIPS64R6-NEXT:    sllv $5, $1, $3
5808; MIPS64R6-NEXT:    nor $6, $zero, $5
5809; MIPS64R6-NEXT:    sllv $4, $4, $3
5810; MIPS64R6-NEXT:  .LBB14_1: # %entry
5811; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
5812; MIPS64R6-NEXT:    ll $7, 0($2)
5813; MIPS64R6-NEXT:    addu $8, $7, $4
5814; MIPS64R6-NEXT:    and $8, $8, $5
5815; MIPS64R6-NEXT:    and $9, $7, $6
5816; MIPS64R6-NEXT:    or $9, $9, $8
5817; MIPS64R6-NEXT:    sc $9, 0($2)
5818; MIPS64R6-NEXT:    beqzc $9, .LBB14_1
5819; MIPS64R6-NEXT:  # %bb.2: # %entry
5820; MIPS64R6-NEXT:    and $1, $7, $5
5821; MIPS64R6-NEXT:    srlv $1, $1, $3
5822; MIPS64R6-NEXT:    seh $1, $1
5823; MIPS64R6-NEXT:  # %bb.3: # %entry
5824; MIPS64R6-NEXT:    jr $ra
5825; MIPS64R6-NEXT:    seh $2, $1
5826;
5827; MIPS64R6O0-LABEL: AtomicLoadAdd16:
5828; MIPS64R6O0:       # %bb.0: # %entry
5829; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
5830; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5831; MIPS64R6O0-NEXT:    daddu $1, $1, $25
5832; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5833; MIPS64R6O0-NEXT:    move $2, $4
5834; MIPS64R6O0-NEXT:    ld $1, %got_disp(z)($1)
5835; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
5836; MIPS64R6O0-NEXT:    and $4, $1, $4
5837; MIPS64R6O0-NEXT:    andi $3, $1, 3
5838; MIPS64R6O0-NEXT:    xori $3, $3, 2
5839; MIPS64R6O0-NEXT:    sll $3, $3, 3
5840; MIPS64R6O0-NEXT:    ori $5, $zero, 65535
5841; MIPS64R6O0-NEXT:    sllv $5, $5, $3
5842; MIPS64R6O0-NEXT:    nor $6, $zero, $5
5843; MIPS64R6O0-NEXT:    sllv $2, $2, $3
5844; MIPS64R6O0-NEXT:  .LBB14_1: # %entry
5845; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5846; MIPS64R6O0-NEXT:    ll $8, 0($4)
5847; MIPS64R6O0-NEXT:    addu $9, $8, $2
5848; MIPS64R6O0-NEXT:    and $9, $9, $5
5849; MIPS64R6O0-NEXT:    and $10, $8, $6
5850; MIPS64R6O0-NEXT:    or $10, $10, $9
5851; MIPS64R6O0-NEXT:    sc $10, 0($4)
5852; MIPS64R6O0-NEXT:    beqzc $10, .LBB14_1
5853; MIPS64R6O0-NEXT:  # %bb.2: # %entry
5854; MIPS64R6O0-NEXT:    and $7, $8, $5
5855; MIPS64R6O0-NEXT:    srlv $7, $7, $3
5856; MIPS64R6O0-NEXT:    seh $7, $7
5857; MIPS64R6O0-NEXT:  # %bb.3: # %entry
5858; MIPS64R6O0-NEXT:    sw $7, 12($sp) # 4-byte Folded Spill
5859; MIPS64R6O0-NEXT:  # %bb.4: # %entry
5860; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
5861; MIPS64R6O0-NEXT:    seh $2, $1
5862; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
5863; MIPS64R6O0-NEXT:    jrc $ra
5864;
5865; MM32-LABEL: AtomicLoadAdd16:
5866; MM32:       # %bb.0: # %entry
5867; MM32-NEXT:    lui $2, %hi(_gp_disp)
5868; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
5869; MM32-NEXT:    addu $2, $2, $25
5870; MM32-NEXT:    lw $1, %got(z)($2)
5871; MM32-NEXT:    addiu $2, $zero, -4
5872; MM32-NEXT:    and $2, $1, $2
5873; MM32-NEXT:    andi $1, $1, 3
5874; MM32-NEXT:    sll $3, $1, 3
5875; MM32-NEXT:    ori $1, $zero, 65535
5876; MM32-NEXT:    sllv $5, $1, $3
5877; MM32-NEXT:    nor $6, $zero, $5
5878; MM32-NEXT:    sllv $4, $4, $3
5879; MM32-NEXT:  $BB14_1: # %entry
5880; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
5881; MM32-NEXT:    ll $7, 0($2)
5882; MM32-NEXT:    addu $8, $7, $4
5883; MM32-NEXT:    and $8, $8, $5
5884; MM32-NEXT:    and $9, $7, $6
5885; MM32-NEXT:    or $9, $9, $8
5886; MM32-NEXT:    sc $9, 0($2)
5887; MM32-NEXT:    beqzc $9, $BB14_1
5888; MM32-NEXT:  # %bb.2: # %entry
5889; MM32-NEXT:    and $1, $7, $5
5890; MM32-NEXT:    srlv $1, $1, $3
5891; MM32-NEXT:    seh $1, $1
5892; MM32-NEXT:  # %bb.3: # %entry
5893; MM32-NEXT:    jr $ra
5894; MM32-NEXT:    seh $2, $1
5895;
5896; O1-LABEL: AtomicLoadAdd16:
5897; O1:       # %bb.0: # %entry
5898; O1-NEXT:    lui $2, %hi(_gp_disp)
5899; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
5900; O1-NEXT:    addu $1, $2, $25
5901; O1-NEXT:    lw $1, %got(z)($1)
5902; O1-NEXT:    addiu $2, $zero, -4
5903; O1-NEXT:    and $2, $1, $2
5904; O1-NEXT:    andi $1, $1, 3
5905; O1-NEXT:    sll $3, $1, 3
5906; O1-NEXT:    ori $1, $zero, 65535
5907; O1-NEXT:    sllv $5, $1, $3
5908; O1-NEXT:    nor $6, $zero, $5
5909; O1-NEXT:    sllv $4, $4, $3
5910; O1-NEXT:  $BB14_1: # %entry
5911; O1-NEXT:    # =>This Inner Loop Header: Depth=1
5912; O1-NEXT:    ll $7, 0($2)
5913; O1-NEXT:    addu $8, $7, $4
5914; O1-NEXT:    and $8, $8, $5
5915; O1-NEXT:    and $9, $7, $6
5916; O1-NEXT:    or $9, $9, $8
5917; O1-NEXT:    sc $9, 0($2)
5918; O1-NEXT:    beqz $9, $BB14_1
5919; O1-NEXT:    nop
5920; O1-NEXT:  # %bb.2: # %entry
5921; O1-NEXT:    and $1, $7, $5
5922; O1-NEXT:    srlv $1, $1, $3
5923; O1-NEXT:    sll $1, $1, 16
5924; O1-NEXT:    sra $1, $1, 16
5925; O1-NEXT:  # %bb.3: # %entry
5926; O1-NEXT:    sll $1, $1, 16
5927; O1-NEXT:    jr $ra
5928; O1-NEXT:    sra $2, $1, 16
5929;
5930; O2-LABEL: AtomicLoadAdd16:
5931; O2:       # %bb.0: # %entry
5932; O2-NEXT:    lui $2, %hi(_gp_disp)
5933; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
5934; O2-NEXT:    addu $1, $2, $25
5935; O2-NEXT:    lw $1, %got(z)($1)
5936; O2-NEXT:    addiu $2, $zero, -4
5937; O2-NEXT:    and $2, $1, $2
5938; O2-NEXT:    andi $1, $1, 3
5939; O2-NEXT:    sll $3, $1, 3
5940; O2-NEXT:    ori $1, $zero, 65535
5941; O2-NEXT:    sllv $5, $1, $3
5942; O2-NEXT:    nor $6, $zero, $5
5943; O2-NEXT:    sllv $4, $4, $3
5944; O2-NEXT:  $BB14_1: # %entry
5945; O2-NEXT:    # =>This Inner Loop Header: Depth=1
5946; O2-NEXT:    ll $7, 0($2)
5947; O2-NEXT:    addu $8, $7, $4
5948; O2-NEXT:    and $8, $8, $5
5949; O2-NEXT:    and $9, $7, $6
5950; O2-NEXT:    or $9, $9, $8
5951; O2-NEXT:    sc $9, 0($2)
5952; O2-NEXT:    beqz $9, $BB14_1
5953; O2-NEXT:    nop
5954; O2-NEXT:  # %bb.2: # %entry
5955; O2-NEXT:    and $1, $7, $5
5956; O2-NEXT:    srlv $1, $1, $3
5957; O2-NEXT:    sll $1, $1, 16
5958; O2-NEXT:    sra $1, $1, 16
5959; O2-NEXT:  # %bb.3: # %entry
5960; O2-NEXT:    sll $1, $1, 16
5961; O2-NEXT:    jr $ra
5962; O2-NEXT:    sra $2, $1, 16
5963;
5964; O3-LABEL: AtomicLoadAdd16:
5965; O3:       # %bb.0: # %entry
5966; O3-NEXT:    lui $2, %hi(_gp_disp)
5967; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
5968; O3-NEXT:    addu $1, $2, $25
5969; O3-NEXT:    addiu $2, $zero, -4
5970; O3-NEXT:    lw $1, %got(z)($1)
5971; O3-NEXT:    and $2, $1, $2
5972; O3-NEXT:    andi $1, $1, 3
5973; O3-NEXT:    sll $3, $1, 3
5974; O3-NEXT:    ori $1, $zero, 65535
5975; O3-NEXT:    sllv $5, $1, $3
5976; O3-NEXT:    sllv $4, $4, $3
5977; O3-NEXT:    nor $6, $zero, $5
5978; O3-NEXT:  $BB14_1: # %entry
5979; O3-NEXT:    # =>This Inner Loop Header: Depth=1
5980; O3-NEXT:    ll $7, 0($2)
5981; O3-NEXT:    addu $8, $7, $4
5982; O3-NEXT:    and $8, $8, $5
5983; O3-NEXT:    and $9, $7, $6
5984; O3-NEXT:    or $9, $9, $8
5985; O3-NEXT:    sc $9, 0($2)
5986; O3-NEXT:    beqz $9, $BB14_1
5987; O3-NEXT:    nop
5988; O3-NEXT:  # %bb.2: # %entry
5989; O3-NEXT:    and $1, $7, $5
5990; O3-NEXT:    srlv $1, $1, $3
5991; O3-NEXT:    sll $1, $1, 16
5992; O3-NEXT:    sra $1, $1, 16
5993; O3-NEXT:  # %bb.3: # %entry
5994; O3-NEXT:    sll $1, $1, 16
5995; O3-NEXT:    jr $ra
5996; O3-NEXT:    sra $2, $1, 16
5997;
5998; MIPS32EB-LABEL: AtomicLoadAdd16:
5999; MIPS32EB:       # %bb.0: # %entry
6000; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
6001; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
6002; MIPS32EB-NEXT:    addu $1, $2, $25
6003; MIPS32EB-NEXT:    lw $1, %got(z)($1)
6004; MIPS32EB-NEXT:    addiu $2, $zero, -4
6005; MIPS32EB-NEXT:    and $2, $1, $2
6006; MIPS32EB-NEXT:    andi $1, $1, 3
6007; MIPS32EB-NEXT:    xori $1, $1, 2
6008; MIPS32EB-NEXT:    sll $3, $1, 3
6009; MIPS32EB-NEXT:    ori $1, $zero, 65535
6010; MIPS32EB-NEXT:    sllv $5, $1, $3
6011; MIPS32EB-NEXT:    nor $6, $zero, $5
6012; MIPS32EB-NEXT:    sllv $4, $4, $3
6013; MIPS32EB-NEXT:  $BB14_1: # %entry
6014; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
6015; MIPS32EB-NEXT:    ll $7, 0($2)
6016; MIPS32EB-NEXT:    addu $8, $7, $4
6017; MIPS32EB-NEXT:    and $8, $8, $5
6018; MIPS32EB-NEXT:    and $9, $7, $6
6019; MIPS32EB-NEXT:    or $9, $9, $8
6020; MIPS32EB-NEXT:    sc $9, 0($2)
6021; MIPS32EB-NEXT:    beqz $9, $BB14_1
6022; MIPS32EB-NEXT:    nop
6023; MIPS32EB-NEXT:  # %bb.2: # %entry
6024; MIPS32EB-NEXT:    and $1, $7, $5
6025; MIPS32EB-NEXT:    srlv $1, $1, $3
6026; MIPS32EB-NEXT:    sll $1, $1, 16
6027; MIPS32EB-NEXT:    sra $1, $1, 16
6028; MIPS32EB-NEXT:  # %bb.3: # %entry
6029; MIPS32EB-NEXT:    sll $1, $1, 16
6030; MIPS32EB-NEXT:    jr $ra
6031; MIPS32EB-NEXT:    sra $2, $1, 16
6032entry:
6033  %0 = atomicrmw add i16* @z, i16 %incr monotonic
6034  ret i16 %0
6035
6036}
6037
6038; Test that the i16 return value from cmpxchg is recognised as signed,
6039; so that setCC doesn't end up comparing an unsigned value to a signed
6040; value.
6041; The rest of the functions here are testing the atomic expansion, so
6042; we just match the end of the function.
6043define {i16, i1} @foo(i16* %addr, i16 %l, i16 %r, i16 %new) {
6044; MIPS32-LABEL: foo:
6045; MIPS32:       # %bb.0:
6046; MIPS32-NEXT:    addu $1, $5, $6
6047; MIPS32-NEXT:    sync
6048; MIPS32-NEXT:    addiu $2, $zero, -4
6049; MIPS32-NEXT:    and $3, $4, $2
6050; MIPS32-NEXT:    andi $2, $4, 3
6051; MIPS32-NEXT:    sll $4, $2, 3
6052; MIPS32-NEXT:    ori $2, $zero, 65535
6053; MIPS32-NEXT:    sllv $5, $2, $4
6054; MIPS32-NEXT:    nor $6, $zero, $5
6055; MIPS32-NEXT:    andi $2, $1, 65535
6056; MIPS32-NEXT:    sllv $8, $2, $4
6057; MIPS32-NEXT:    andi $2, $7, 65535
6058; MIPS32-NEXT:    sllv $7, $2, $4
6059; MIPS32-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6060; MIPS32-NEXT:    ll $9, 0($3)
6061; MIPS32-NEXT:    and $10, $9, $5
6062; MIPS32-NEXT:    bne $10, $8, $BB15_3
6063; MIPS32-NEXT:    nop
6064; MIPS32-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6065; MIPS32-NEXT:    and $9, $9, $6
6066; MIPS32-NEXT:    or $9, $9, $7
6067; MIPS32-NEXT:    sc $9, 0($3)
6068; MIPS32-NEXT:    beqz $9, $BB15_1
6069; MIPS32-NEXT:    nop
6070; MIPS32-NEXT:  $BB15_3:
6071; MIPS32-NEXT:    srlv $2, $10, $4
6072; MIPS32-NEXT:    sll $2, $2, 16
6073; MIPS32-NEXT:    sra $2, $2, 16
6074; MIPS32-NEXT:  # %bb.4:
6075; MIPS32-NEXT:    sll $1, $1, 16
6076; MIPS32-NEXT:    sra $1, $1, 16
6077; MIPS32-NEXT:    xor $1, $2, $1
6078; MIPS32-NEXT:    sltiu $3, $1, 1
6079; MIPS32-NEXT:    sync
6080; MIPS32-NEXT:    jr $ra
6081; MIPS32-NEXT:    nop
6082;
6083; MIPS32O0-LABEL: foo:
6084; MIPS32O0:       # %bb.0:
6085; MIPS32O0-NEXT:    addiu $sp, $sp, -8
6086; MIPS32O0-NEXT:    .cfi_def_cfa_offset 8
6087; MIPS32O0-NEXT:    addu $5, $5, $6
6088; MIPS32O0-NEXT:    sync
6089; MIPS32O0-NEXT:    addiu $6, $zero, -4
6090; MIPS32O0-NEXT:    and $6, $4, $6
6091; MIPS32O0-NEXT:    andi $4, $4, 3
6092; MIPS32O0-NEXT:    sll $4, $4, 3
6093; MIPS32O0-NEXT:    ori $1, $zero, 65535
6094; MIPS32O0-NEXT:    sllv $1, $1, $4
6095; MIPS32O0-NEXT:    nor $2, $zero, $1
6096; MIPS32O0-NEXT:    andi $3, $5, 65535
6097; MIPS32O0-NEXT:    sllv $3, $3, $4
6098; MIPS32O0-NEXT:    andi $7, $7, 65535
6099; MIPS32O0-NEXT:    sllv $7, $7, $4
6100; MIPS32O0-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6101; MIPS32O0-NEXT:    ll $9, 0($6)
6102; MIPS32O0-NEXT:    and $10, $9, $1
6103; MIPS32O0-NEXT:    bne $10, $3, $BB15_3
6104; MIPS32O0-NEXT:    nop
6105; MIPS32O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6106; MIPS32O0-NEXT:    and $9, $9, $2
6107; MIPS32O0-NEXT:    or $9, $9, $7
6108; MIPS32O0-NEXT:    sc $9, 0($6)
6109; MIPS32O0-NEXT:    beqz $9, $BB15_1
6110; MIPS32O0-NEXT:    nop
6111; MIPS32O0-NEXT:  $BB15_3:
6112; MIPS32O0-NEXT:    srlv $8, $10, $4
6113; MIPS32O0-NEXT:    sll $8, $8, 16
6114; MIPS32O0-NEXT:    sra $8, $8, 16
6115; MIPS32O0-NEXT:  # %bb.4:
6116; MIPS32O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
6117; MIPS32O0-NEXT:    sw $8, 0($sp) # 4-byte Folded Spill
6118; MIPS32O0-NEXT:  # %bb.5:
6119; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
6120; MIPS32O0-NEXT:    sll $2, $1, 16
6121; MIPS32O0-NEXT:    sra $2, $2, 16
6122; MIPS32O0-NEXT:    lw $3, 0($sp) # 4-byte Folded Reload
6123; MIPS32O0-NEXT:    xor $2, $3, $2
6124; MIPS32O0-NEXT:    sltiu $3, $2, 1
6125; MIPS32O0-NEXT:    sync
6126; MIPS32O0-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
6127; MIPS32O0-NEXT:    addiu $sp, $sp, 8
6128; MIPS32O0-NEXT:    jr $ra
6129; MIPS32O0-NEXT:    nop
6130;
6131; MIPS32R2-LABEL: foo:
6132; MIPS32R2:       # %bb.0:
6133; MIPS32R2-NEXT:    addu $1, $5, $6
6134; MIPS32R2-NEXT:    sync
6135; MIPS32R2-NEXT:    addiu $2, $zero, -4
6136; MIPS32R2-NEXT:    and $3, $4, $2
6137; MIPS32R2-NEXT:    andi $2, $4, 3
6138; MIPS32R2-NEXT:    sll $4, $2, 3
6139; MIPS32R2-NEXT:    ori $2, $zero, 65535
6140; MIPS32R2-NEXT:    sllv $5, $2, $4
6141; MIPS32R2-NEXT:    nor $6, $zero, $5
6142; MIPS32R2-NEXT:    andi $2, $1, 65535
6143; MIPS32R2-NEXT:    sllv $8, $2, $4
6144; MIPS32R2-NEXT:    andi $2, $7, 65535
6145; MIPS32R2-NEXT:    sllv $7, $2, $4
6146; MIPS32R2-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6147; MIPS32R2-NEXT:    ll $9, 0($3)
6148; MIPS32R2-NEXT:    and $10, $9, $5
6149; MIPS32R2-NEXT:    bne $10, $8, $BB15_3
6150; MIPS32R2-NEXT:    nop
6151; MIPS32R2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6152; MIPS32R2-NEXT:    and $9, $9, $6
6153; MIPS32R2-NEXT:    or $9, $9, $7
6154; MIPS32R2-NEXT:    sc $9, 0($3)
6155; MIPS32R2-NEXT:    beqz $9, $BB15_1
6156; MIPS32R2-NEXT:    nop
6157; MIPS32R2-NEXT:  $BB15_3:
6158; MIPS32R2-NEXT:    srlv $2, $10, $4
6159; MIPS32R2-NEXT:    seh $2, $2
6160; MIPS32R2-NEXT:  # %bb.4:
6161; MIPS32R2-NEXT:    seh $1, $1
6162; MIPS32R2-NEXT:    xor $1, $2, $1
6163; MIPS32R2-NEXT:    sltiu $3, $1, 1
6164; MIPS32R2-NEXT:    sync
6165; MIPS32R2-NEXT:    jr $ra
6166; MIPS32R2-NEXT:    nop
6167;
6168; MIPS32R6-LABEL: foo:
6169; MIPS32R6:       # %bb.0:
6170; MIPS32R6-NEXT:    addu $1, $5, $6
6171; MIPS32R6-NEXT:    sync
6172; MIPS32R6-NEXT:    addiu $2, $zero, -4
6173; MIPS32R6-NEXT:    and $3, $4, $2
6174; MIPS32R6-NEXT:    andi $2, $4, 3
6175; MIPS32R6-NEXT:    sll $4, $2, 3
6176; MIPS32R6-NEXT:    ori $2, $zero, 65535
6177; MIPS32R6-NEXT:    sllv $5, $2, $4
6178; MIPS32R6-NEXT:    nor $6, $zero, $5
6179; MIPS32R6-NEXT:    andi $2, $1, 65535
6180; MIPS32R6-NEXT:    sllv $8, $2, $4
6181; MIPS32R6-NEXT:    andi $2, $7, 65535
6182; MIPS32R6-NEXT:    sllv $7, $2, $4
6183; MIPS32R6-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6184; MIPS32R6-NEXT:    ll $9, 0($3)
6185; MIPS32R6-NEXT:    and $10, $9, $5
6186; MIPS32R6-NEXT:    bnec $10, $8, $BB15_3
6187; MIPS32R6-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6188; MIPS32R6-NEXT:    and $9, $9, $6
6189; MIPS32R6-NEXT:    or $9, $9, $7
6190; MIPS32R6-NEXT:    sc $9, 0($3)
6191; MIPS32R6-NEXT:    beqzc $9, $BB15_1
6192; MIPS32R6-NEXT:  $BB15_3:
6193; MIPS32R6-NEXT:    srlv $2, $10, $4
6194; MIPS32R6-NEXT:    seh $2, $2
6195; MIPS32R6-NEXT:  # %bb.4:
6196; MIPS32R6-NEXT:    seh $1, $1
6197; MIPS32R6-NEXT:    xor $1, $2, $1
6198; MIPS32R6-NEXT:    sltiu $3, $1, 1
6199; MIPS32R6-NEXT:    sync
6200; MIPS32R6-NEXT:    jrc $ra
6201;
6202; MIPS32R6O0-LABEL: foo:
6203; MIPS32R6O0:       # %bb.0:
6204; MIPS32R6O0-NEXT:    addiu $sp, $sp, -24
6205; MIPS32R6O0-NEXT:    .cfi_def_cfa_offset 24
6206; MIPS32R6O0-NEXT:    move $1, $7
6207; MIPS32R6O0-NEXT:    move $2, $6
6208; MIPS32R6O0-NEXT:    move $3, $5
6209; MIPS32R6O0-NEXT:    move $8, $4
6210; MIPS32R6O0-NEXT:    addu $5, $5, $6
6211; MIPS32R6O0-NEXT:    sync
6212; MIPS32R6O0-NEXT:    addiu $6, $zero, -4
6213; MIPS32R6O0-NEXT:    and $6, $4, $6
6214; MIPS32R6O0-NEXT:    andi $4, $4, 3
6215; MIPS32R6O0-NEXT:    sll $4, $4, 3
6216; MIPS32R6O0-NEXT:    ori $9, $zero, 65535
6217; MIPS32R6O0-NEXT:    sllv $9, $9, $4
6218; MIPS32R6O0-NEXT:    nor $10, $zero, $9
6219; MIPS32R6O0-NEXT:    andi $11, $5, 65535
6220; MIPS32R6O0-NEXT:    sllv $11, $11, $4
6221; MIPS32R6O0-NEXT:    andi $7, $7, 65535
6222; MIPS32R6O0-NEXT:    sllv $7, $7, $4
6223; MIPS32R6O0-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6224; MIPS32R6O0-NEXT:    ll $13, 0($6)
6225; MIPS32R6O0-NEXT:    and $14, $13, $9
6226; MIPS32R6O0-NEXT:    bnec $14, $11, $BB15_3
6227; MIPS32R6O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6228; MIPS32R6O0-NEXT:    and $13, $13, $10
6229; MIPS32R6O0-NEXT:    or $13, $13, $7
6230; MIPS32R6O0-NEXT:    sc $13, 0($6)
6231; MIPS32R6O0-NEXT:    beqzc $13, $BB15_1
6232; MIPS32R6O0-NEXT:  $BB15_3:
6233; MIPS32R6O0-NEXT:    srlv $12, $14, $4
6234; MIPS32R6O0-NEXT:    seh $12, $12
6235; MIPS32R6O0-NEXT:  # %bb.4:
6236; MIPS32R6O0-NEXT:    sw $12, 20($sp) # 4-byte Folded Spill
6237; MIPS32R6O0-NEXT:    sw $3, 16($sp) # 4-byte Folded Spill
6238; MIPS32R6O0-NEXT:    sw $8, 12($sp) # 4-byte Folded Spill
6239; MIPS32R6O0-NEXT:    sw $5, 8($sp) # 4-byte Folded Spill
6240; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
6241; MIPS32R6O0-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
6242; MIPS32R6O0-NEXT:  # %bb.5:
6243; MIPS32R6O0-NEXT:    lw $1, 8($sp) # 4-byte Folded Reload
6244; MIPS32R6O0-NEXT:    seh $2, $1
6245; MIPS32R6O0-NEXT:    lw $3, 20($sp) # 4-byte Folded Reload
6246; MIPS32R6O0-NEXT:    xor $2, $3, $2
6247; MIPS32R6O0-NEXT:    sltiu $3, $2, 1
6248; MIPS32R6O0-NEXT:    sync
6249; MIPS32R6O0-NEXT:    lw $2, 20($sp) # 4-byte Folded Reload
6250; MIPS32R6O0-NEXT:    addiu $sp, $sp, 24
6251; MIPS32R6O0-NEXT:    jrc $ra
6252;
6253; MIPS4-LABEL: foo:
6254; MIPS4:       # %bb.0:
6255; MIPS4-NEXT:    sll $1, $6, 0
6256; MIPS4-NEXT:    sll $2, $5, 0
6257; MIPS4-NEXT:    addu $1, $2, $1
6258; MIPS4-NEXT:    sync
6259; MIPS4-NEXT:    sll $2, $7, 0
6260; MIPS4-NEXT:    daddiu $3, $zero, -4
6261; MIPS4-NEXT:    and $3, $4, $3
6262; MIPS4-NEXT:    andi $4, $4, 3
6263; MIPS4-NEXT:    sll $4, $4, 3
6264; MIPS4-NEXT:    ori $5, $zero, 65535
6265; MIPS4-NEXT:    sllv $5, $5, $4
6266; MIPS4-NEXT:    nor $6, $zero, $5
6267; MIPS4-NEXT:    andi $7, $1, 65535
6268; MIPS4-NEXT:    sllv $7, $7, $4
6269; MIPS4-NEXT:    andi $2, $2, 65535
6270; MIPS4-NEXT:    sllv $8, $2, $4
6271; MIPS4-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6272; MIPS4-NEXT:    ll $9, 0($3)
6273; MIPS4-NEXT:    and $10, $9, $5
6274; MIPS4-NEXT:    bne $10, $7, .LBB15_3
6275; MIPS4-NEXT:    nop
6276; MIPS4-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6277; MIPS4-NEXT:    and $9, $9, $6
6278; MIPS4-NEXT:    or $9, $9, $8
6279; MIPS4-NEXT:    sc $9, 0($3)
6280; MIPS4-NEXT:    beqz $9, .LBB15_1
6281; MIPS4-NEXT:    nop
6282; MIPS4-NEXT:  .LBB15_3:
6283; MIPS4-NEXT:    srlv $2, $10, $4
6284; MIPS4-NEXT:    sll $2, $2, 16
6285; MIPS4-NEXT:    sra $2, $2, 16
6286; MIPS4-NEXT:  # %bb.4:
6287; MIPS4-NEXT:    sll $1, $1, 16
6288; MIPS4-NEXT:    sra $1, $1, 16
6289; MIPS4-NEXT:    xor $1, $2, $1
6290; MIPS4-NEXT:    sltiu $3, $1, 1
6291; MIPS4-NEXT:    sync
6292; MIPS4-NEXT:    jr $ra
6293; MIPS4-NEXT:    nop
6294;
6295; MIPS64-LABEL: foo:
6296; MIPS64:       # %bb.0:
6297; MIPS64-NEXT:    sll $1, $6, 0
6298; MIPS64-NEXT:    sll $2, $5, 0
6299; MIPS64-NEXT:    addu $1, $2, $1
6300; MIPS64-NEXT:    sync
6301; MIPS64-NEXT:    sll $2, $7, 0
6302; MIPS64-NEXT:    daddiu $3, $zero, -4
6303; MIPS64-NEXT:    and $3, $4, $3
6304; MIPS64-NEXT:    andi $4, $4, 3
6305; MIPS64-NEXT:    sll $4, $4, 3
6306; MIPS64-NEXT:    ori $5, $zero, 65535
6307; MIPS64-NEXT:    sllv $5, $5, $4
6308; MIPS64-NEXT:    nor $6, $zero, $5
6309; MIPS64-NEXT:    andi $7, $1, 65535
6310; MIPS64-NEXT:    sllv $7, $7, $4
6311; MIPS64-NEXT:    andi $2, $2, 65535
6312; MIPS64-NEXT:    sllv $8, $2, $4
6313; MIPS64-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6314; MIPS64-NEXT:    ll $9, 0($3)
6315; MIPS64-NEXT:    and $10, $9, $5
6316; MIPS64-NEXT:    bne $10, $7, .LBB15_3
6317; MIPS64-NEXT:    nop
6318; MIPS64-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6319; MIPS64-NEXT:    and $9, $9, $6
6320; MIPS64-NEXT:    or $9, $9, $8
6321; MIPS64-NEXT:    sc $9, 0($3)
6322; MIPS64-NEXT:    beqz $9, .LBB15_1
6323; MIPS64-NEXT:    nop
6324; MIPS64-NEXT:  .LBB15_3:
6325; MIPS64-NEXT:    srlv $2, $10, $4
6326; MIPS64-NEXT:    sll $2, $2, 16
6327; MIPS64-NEXT:    sra $2, $2, 16
6328; MIPS64-NEXT:  # %bb.4:
6329; MIPS64-NEXT:    sll $1, $1, 16
6330; MIPS64-NEXT:    sra $1, $1, 16
6331; MIPS64-NEXT:    xor $1, $2, $1
6332; MIPS64-NEXT:    sltiu $3, $1, 1
6333; MIPS64-NEXT:    sync
6334; MIPS64-NEXT:    jr $ra
6335; MIPS64-NEXT:    nop
6336;
6337; MIPS64R2-LABEL: foo:
6338; MIPS64R2:       # %bb.0:
6339; MIPS64R2-NEXT:    sll $1, $6, 0
6340; MIPS64R2-NEXT:    sll $2, $5, 0
6341; MIPS64R2-NEXT:    addu $1, $2, $1
6342; MIPS64R2-NEXT:    sync
6343; MIPS64R2-NEXT:    sll $2, $7, 0
6344; MIPS64R2-NEXT:    daddiu $3, $zero, -4
6345; MIPS64R2-NEXT:    and $3, $4, $3
6346; MIPS64R2-NEXT:    andi $4, $4, 3
6347; MIPS64R2-NEXT:    sll $4, $4, 3
6348; MIPS64R2-NEXT:    ori $5, $zero, 65535
6349; MIPS64R2-NEXT:    sllv $5, $5, $4
6350; MIPS64R2-NEXT:    nor $6, $zero, $5
6351; MIPS64R2-NEXT:    andi $7, $1, 65535
6352; MIPS64R2-NEXT:    sllv $7, $7, $4
6353; MIPS64R2-NEXT:    andi $2, $2, 65535
6354; MIPS64R2-NEXT:    sllv $8, $2, $4
6355; MIPS64R2-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6356; MIPS64R2-NEXT:    ll $9, 0($3)
6357; MIPS64R2-NEXT:    and $10, $9, $5
6358; MIPS64R2-NEXT:    bne $10, $7, .LBB15_3
6359; MIPS64R2-NEXT:    nop
6360; MIPS64R2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6361; MIPS64R2-NEXT:    and $9, $9, $6
6362; MIPS64R2-NEXT:    or $9, $9, $8
6363; MIPS64R2-NEXT:    sc $9, 0($3)
6364; MIPS64R2-NEXT:    beqz $9, .LBB15_1
6365; MIPS64R2-NEXT:    nop
6366; MIPS64R2-NEXT:  .LBB15_3:
6367; MIPS64R2-NEXT:    srlv $2, $10, $4
6368; MIPS64R2-NEXT:    seh $2, $2
6369; MIPS64R2-NEXT:  # %bb.4:
6370; MIPS64R2-NEXT:    seh $1, $1
6371; MIPS64R2-NEXT:    xor $1, $2, $1
6372; MIPS64R2-NEXT:    sltiu $3, $1, 1
6373; MIPS64R2-NEXT:    sync
6374; MIPS64R2-NEXT:    jr $ra
6375; MIPS64R2-NEXT:    nop
6376;
6377; MIPS64R6-LABEL: foo:
6378; MIPS64R6:       # %bb.0:
6379; MIPS64R6-NEXT:    sll $1, $6, 0
6380; MIPS64R6-NEXT:    sll $2, $5, 0
6381; MIPS64R6-NEXT:    addu $1, $2, $1
6382; MIPS64R6-NEXT:    sync
6383; MIPS64R6-NEXT:    sll $2, $7, 0
6384; MIPS64R6-NEXT:    daddiu $3, $zero, -4
6385; MIPS64R6-NEXT:    and $3, $4, $3
6386; MIPS64R6-NEXT:    andi $4, $4, 3
6387; MIPS64R6-NEXT:    sll $4, $4, 3
6388; MIPS64R6-NEXT:    ori $5, $zero, 65535
6389; MIPS64R6-NEXT:    sllv $5, $5, $4
6390; MIPS64R6-NEXT:    nor $6, $zero, $5
6391; MIPS64R6-NEXT:    andi $7, $1, 65535
6392; MIPS64R6-NEXT:    sllv $7, $7, $4
6393; MIPS64R6-NEXT:    andi $2, $2, 65535
6394; MIPS64R6-NEXT:    sllv $8, $2, $4
6395; MIPS64R6-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6396; MIPS64R6-NEXT:    ll $9, 0($3)
6397; MIPS64R6-NEXT:    and $10, $9, $5
6398; MIPS64R6-NEXT:    bnec $10, $7, .LBB15_3
6399; MIPS64R6-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6400; MIPS64R6-NEXT:    and $9, $9, $6
6401; MIPS64R6-NEXT:    or $9, $9, $8
6402; MIPS64R6-NEXT:    sc $9, 0($3)
6403; MIPS64R6-NEXT:    beqzc $9, .LBB15_1
6404; MIPS64R6-NEXT:  .LBB15_3:
6405; MIPS64R6-NEXT:    srlv $2, $10, $4
6406; MIPS64R6-NEXT:    seh $2, $2
6407; MIPS64R6-NEXT:  # %bb.4:
6408; MIPS64R6-NEXT:    seh $1, $1
6409; MIPS64R6-NEXT:    xor $1, $2, $1
6410; MIPS64R6-NEXT:    sltiu $3, $1, 1
6411; MIPS64R6-NEXT:    sync
6412; MIPS64R6-NEXT:    jrc $ra
6413;
6414; MIPS64R6O0-LABEL: foo:
6415; MIPS64R6O0:       # %bb.0:
6416; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
6417; MIPS64R6O0-NEXT:    .cfi_def_cfa_offset 16
6418; MIPS64R6O0-NEXT:    move $1, $7
6419; MIPS64R6O0-NEXT:    sll $1, $1, 0
6420; MIPS64R6O0-NEXT:    move $2, $6
6421; MIPS64R6O0-NEXT:    sll $2, $2, 0
6422; MIPS64R6O0-NEXT:    move $3, $5
6423; MIPS64R6O0-NEXT:    sll $3, $3, 0
6424; MIPS64R6O0-NEXT:    move $5, $4
6425; MIPS64R6O0-NEXT:    addu $2, $3, $2
6426; MIPS64R6O0-NEXT:    sync
6427; MIPS64R6O0-NEXT:    daddiu $6, $zero, -4
6428; MIPS64R6O0-NEXT:    and $6, $4, $6
6429; MIPS64R6O0-NEXT:    andi $3, $4, 3
6430; MIPS64R6O0-NEXT:    xori $3, $3, 2
6431; MIPS64R6O0-NEXT:    sll $3, $3, 3
6432; MIPS64R6O0-NEXT:    ori $8, $zero, 65535
6433; MIPS64R6O0-NEXT:    sllv $8, $8, $3
6434; MIPS64R6O0-NEXT:    nor $9, $zero, $8
6435; MIPS64R6O0-NEXT:    andi $10, $2, 65535
6436; MIPS64R6O0-NEXT:    sllv $10, $10, $3
6437; MIPS64R6O0-NEXT:    andi $1, $1, 65535
6438; MIPS64R6O0-NEXT:    sllv $1, $1, $3
6439; MIPS64R6O0-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6440; MIPS64R6O0-NEXT:    ll $12, 0($6)
6441; MIPS64R6O0-NEXT:    and $13, $12, $8
6442; MIPS64R6O0-NEXT:    bnec $13, $10, .LBB15_3
6443; MIPS64R6O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6444; MIPS64R6O0-NEXT:    and $12, $12, $9
6445; MIPS64R6O0-NEXT:    or $12, $12, $1
6446; MIPS64R6O0-NEXT:    sc $12, 0($6)
6447; MIPS64R6O0-NEXT:    beqzc $12, .LBB15_1
6448; MIPS64R6O0-NEXT:  .LBB15_3:
6449; MIPS64R6O0-NEXT:    srlv $11, $13, $3
6450; MIPS64R6O0-NEXT:    seh $11, $11
6451; MIPS64R6O0-NEXT:  # %bb.4:
6452; MIPS64R6O0-NEXT:    sw $2, 12($sp) # 4-byte Folded Spill
6453; MIPS64R6O0-NEXT:    sw $11, 8($sp) # 4-byte Folded Spill
6454; MIPS64R6O0-NEXT:    sd $5, 0($sp) # 8-byte Folded Spill
6455; MIPS64R6O0-NEXT:  # %bb.5:
6456; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
6457; MIPS64R6O0-NEXT:    seh $2, $1
6458; MIPS64R6O0-NEXT:    lw $3, 8($sp) # 4-byte Folded Reload
6459; MIPS64R6O0-NEXT:    xor $2, $3, $2
6460; MIPS64R6O0-NEXT:    sltiu $3, $2, 1
6461; MIPS64R6O0-NEXT:    sync
6462; MIPS64R6O0-NEXT:    lw $2, 8($sp) # 4-byte Folded Reload
6463; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
6464; MIPS64R6O0-NEXT:    jrc $ra
6465;
6466; MM32-LABEL: foo:
6467; MM32:       # %bb.0:
6468; MM32-NEXT:    addu16 $3, $5, $6
6469; MM32-NEXT:    sync
6470; MM32-NEXT:    addiu $1, $zero, -4
6471; MM32-NEXT:    and $1, $4, $1
6472; MM32-NEXT:    andi $2, $4, 3
6473; MM32-NEXT:    sll $4, $2, 3
6474; MM32-NEXT:    ori $2, $zero, 65535
6475; MM32-NEXT:    sllv $5, $2, $4
6476; MM32-NEXT:    nor $6, $zero, $5
6477; MM32-NEXT:    andi $2, $3, 65535
6478; MM32-NEXT:    sllv $8, $2, $4
6479; MM32-NEXT:    andi $2, $7, 65535
6480; MM32-NEXT:    sllv $7, $2, $4
6481; MM32-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6482; MM32-NEXT:    ll $9, 0($1)
6483; MM32-NEXT:    and $10, $9, $5
6484; MM32-NEXT:    bne $10, $8, $BB15_3
6485; MM32-NEXT:    nop
6486; MM32-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6487; MM32-NEXT:    and $9, $9, $6
6488; MM32-NEXT:    or $9, $9, $7
6489; MM32-NEXT:    sc $9, 0($1)
6490; MM32-NEXT:    beqzc $9, $BB15_1
6491; MM32-NEXT:  $BB15_3:
6492; MM32-NEXT:    srlv $2, $10, $4
6493; MM32-NEXT:    seh $2, $2
6494; MM32-NEXT:  # %bb.4:
6495; MM32-NEXT:    seh $1, $3
6496; MM32-NEXT:    xor $1, $2, $1
6497; MM32-NEXT:    sltiu $3, $1, 1
6498; MM32-NEXT:    sync
6499; MM32-NEXT:    jrc $ra
6500;
6501; O1-LABEL: foo:
6502; O1:       # %bb.0:
6503; O1-NEXT:    addu $1, $5, $6
6504; O1-NEXT:    sync
6505; O1-NEXT:    addiu $2, $zero, -4
6506; O1-NEXT:    and $3, $4, $2
6507; O1-NEXT:    andi $2, $4, 3
6508; O1-NEXT:    sll $4, $2, 3
6509; O1-NEXT:    ori $2, $zero, 65535
6510; O1-NEXT:    sllv $5, $2, $4
6511; O1-NEXT:    nor $6, $zero, $5
6512; O1-NEXT:    andi $2, $1, 65535
6513; O1-NEXT:    sllv $8, $2, $4
6514; O1-NEXT:    andi $2, $7, 65535
6515; O1-NEXT:    sllv $7, $2, $4
6516; O1-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6517; O1-NEXT:    ll $9, 0($3)
6518; O1-NEXT:    and $10, $9, $5
6519; O1-NEXT:    bne $10, $8, $BB15_3
6520; O1-NEXT:    nop
6521; O1-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6522; O1-NEXT:    and $9, $9, $6
6523; O1-NEXT:    or $9, $9, $7
6524; O1-NEXT:    sc $9, 0($3)
6525; O1-NEXT:    beqz $9, $BB15_1
6526; O1-NEXT:    nop
6527; O1-NEXT:  $BB15_3:
6528; O1-NEXT:    srlv $2, $10, $4
6529; O1-NEXT:    sll $2, $2, 16
6530; O1-NEXT:    sra $2, $2, 16
6531; O1-NEXT:  # %bb.4:
6532; O1-NEXT:    sll $1, $1, 16
6533; O1-NEXT:    sra $1, $1, 16
6534; O1-NEXT:    xor $1, $2, $1
6535; O1-NEXT:    sltiu $3, $1, 1
6536; O1-NEXT:    sync
6537; O1-NEXT:    jr $ra
6538; O1-NEXT:    nop
6539;
6540; O2-LABEL: foo:
6541; O2:       # %bb.0:
6542; O2-NEXT:    addu $1, $5, $6
6543; O2-NEXT:    sync
6544; O2-NEXT:    addiu $2, $zero, -4
6545; O2-NEXT:    and $3, $4, $2
6546; O2-NEXT:    andi $2, $4, 3
6547; O2-NEXT:    sll $4, $2, 3
6548; O2-NEXT:    ori $2, $zero, 65535
6549; O2-NEXT:    sllv $5, $2, $4
6550; O2-NEXT:    nor $6, $zero, $5
6551; O2-NEXT:    andi $2, $1, 65535
6552; O2-NEXT:    sllv $8, $2, $4
6553; O2-NEXT:    andi $2, $7, 65535
6554; O2-NEXT:    sllv $7, $2, $4
6555; O2-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6556; O2-NEXT:    ll $9, 0($3)
6557; O2-NEXT:    and $10, $9, $5
6558; O2-NEXT:    bne $10, $8, $BB15_3
6559; O2-NEXT:    nop
6560; O2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6561; O2-NEXT:    and $9, $9, $6
6562; O2-NEXT:    or $9, $9, $7
6563; O2-NEXT:    sc $9, 0($3)
6564; O2-NEXT:    beqz $9, $BB15_1
6565; O2-NEXT:    nop
6566; O2-NEXT:  $BB15_3:
6567; O2-NEXT:    srlv $2, $10, $4
6568; O2-NEXT:    sll $2, $2, 16
6569; O2-NEXT:    sra $2, $2, 16
6570; O2-NEXT:  # %bb.4:
6571; O2-NEXT:    sll $1, $1, 16
6572; O2-NEXT:    sra $1, $1, 16
6573; O2-NEXT:    xor $1, $2, $1
6574; O2-NEXT:    sltiu $3, $1, 1
6575; O2-NEXT:    sync
6576; O2-NEXT:    jr $ra
6577; O2-NEXT:    nop
6578;
6579; O3-LABEL: foo:
6580; O3:       # %bb.0:
6581; O3-NEXT:    addiu $2, $zero, -4
6582; O3-NEXT:    addu $1, $5, $6
6583; O3-NEXT:    sync
6584; O3-NEXT:    and $3, $4, $2
6585; O3-NEXT:    andi $2, $4, 3
6586; O3-NEXT:    sll $4, $2, 3
6587; O3-NEXT:    ori $2, $zero, 65535
6588; O3-NEXT:    sllv $5, $2, $4
6589; O3-NEXT:    andi $2, $1, 65535
6590; O3-NEXT:    sll $1, $1, 16
6591; O3-NEXT:    sllv $8, $2, $4
6592; O3-NEXT:    andi $2, $7, 65535
6593; O3-NEXT:    nor $6, $zero, $5
6594; O3-NEXT:    sra $1, $1, 16
6595; O3-NEXT:    sllv $7, $2, $4
6596; O3-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6597; O3-NEXT:    ll $9, 0($3)
6598; O3-NEXT:    and $10, $9, $5
6599; O3-NEXT:    bne $10, $8, $BB15_3
6600; O3-NEXT:    nop
6601; O3-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6602; O3-NEXT:    and $9, $9, $6
6603; O3-NEXT:    or $9, $9, $7
6604; O3-NEXT:    sc $9, 0($3)
6605; O3-NEXT:    beqz $9, $BB15_1
6606; O3-NEXT:    nop
6607; O3-NEXT:  $BB15_3:
6608; O3-NEXT:    srlv $2, $10, $4
6609; O3-NEXT:    sll $2, $2, 16
6610; O3-NEXT:    sra $2, $2, 16
6611; O3-NEXT:  # %bb.4:
6612; O3-NEXT:    sync
6613; O3-NEXT:    xor $1, $2, $1
6614; O3-NEXT:    jr $ra
6615; O3-NEXT:    sltiu $3, $1, 1
6616;
6617; MIPS32EB-LABEL: foo:
6618; MIPS32EB:       # %bb.0:
6619; MIPS32EB-NEXT:    addu $1, $5, $6
6620; MIPS32EB-NEXT:    sync
6621; MIPS32EB-NEXT:    addiu $2, $zero, -4
6622; MIPS32EB-NEXT:    and $3, $4, $2
6623; MIPS32EB-NEXT:    andi $2, $4, 3
6624; MIPS32EB-NEXT:    xori $2, $2, 2
6625; MIPS32EB-NEXT:    sll $4, $2, 3
6626; MIPS32EB-NEXT:    ori $2, $zero, 65535
6627; MIPS32EB-NEXT:    sllv $5, $2, $4
6628; MIPS32EB-NEXT:    nor $6, $zero, $5
6629; MIPS32EB-NEXT:    andi $2, $1, 65535
6630; MIPS32EB-NEXT:    sllv $8, $2, $4
6631; MIPS32EB-NEXT:    andi $2, $7, 65535
6632; MIPS32EB-NEXT:    sllv $7, $2, $4
6633; MIPS32EB-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6634; MIPS32EB-NEXT:    ll $9, 0($3)
6635; MIPS32EB-NEXT:    and $10, $9, $5
6636; MIPS32EB-NEXT:    bne $10, $8, $BB15_3
6637; MIPS32EB-NEXT:    nop
6638; MIPS32EB-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6639; MIPS32EB-NEXT:    and $9, $9, $6
6640; MIPS32EB-NEXT:    or $9, $9, $7
6641; MIPS32EB-NEXT:    sc $9, 0($3)
6642; MIPS32EB-NEXT:    beqz $9, $BB15_1
6643; MIPS32EB-NEXT:    nop
6644; MIPS32EB-NEXT:  $BB15_3:
6645; MIPS32EB-NEXT:    srlv $2, $10, $4
6646; MIPS32EB-NEXT:    sll $2, $2, 16
6647; MIPS32EB-NEXT:    sra $2, $2, 16
6648; MIPS32EB-NEXT:  # %bb.4:
6649; MIPS32EB-NEXT:    sll $1, $1, 16
6650; MIPS32EB-NEXT:    sra $1, $1, 16
6651; MIPS32EB-NEXT:    xor $1, $2, $1
6652; MIPS32EB-NEXT:    sltiu $3, $1, 1
6653; MIPS32EB-NEXT:    sync
6654; MIPS32EB-NEXT:    jr $ra
6655; MIPS32EB-NEXT:    nop
6656  %desired = add i16 %l, %r
6657  %res = cmpxchg i16* %addr, i16 %desired, i16 %new seq_cst seq_cst
6658  ret {i16, i1} %res
6659}
6660
6661@countsint = common global i32 0, align 4
6662
6663define i32 @CheckSync(i32 signext %v) nounwind noinline {
6664; MIPS32-LABEL: CheckSync:
6665; MIPS32:       # %bb.0: # %entry
6666; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
6667; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6668; MIPS32-NEXT:    addu $1, $2, $25
6669; MIPS32-NEXT:    sync
6670; MIPS32-NEXT:    lw $1, %got(countsint)($1)
6671; MIPS32-NEXT:  $BB16_1: # %entry
6672; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
6673; MIPS32-NEXT:    ll $2, 0($1)
6674; MIPS32-NEXT:    addu $3, $2, $4
6675; MIPS32-NEXT:    sc $3, 0($1)
6676; MIPS32-NEXT:    beqz $3, $BB16_1
6677; MIPS32-NEXT:    nop
6678; MIPS32-NEXT:  # %bb.2: # %entry
6679; MIPS32-NEXT:    sync
6680; MIPS32-NEXT:    jr $ra
6681; MIPS32-NEXT:    nop
6682;
6683; MIPS32O0-LABEL: CheckSync:
6684; MIPS32O0:       # %bb.0: # %entry
6685; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
6686; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6687; MIPS32O0-NEXT:    addu $2, $2, $25
6688; MIPS32O0-NEXT:    sync
6689; MIPS32O0-NEXT:    lw $2, %got(countsint)($2)
6690; MIPS32O0-NEXT:  $BB16_1: # %entry
6691; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
6692; MIPS32O0-NEXT:    ll $25, 0($2)
6693; MIPS32O0-NEXT:    addu $1, $25, $4
6694; MIPS32O0-NEXT:    sc $1, 0($2)
6695; MIPS32O0-NEXT:    beqz $1, $BB16_1
6696; MIPS32O0-NEXT:    nop
6697; MIPS32O0-NEXT:  # %bb.2: # %entry
6698; MIPS32O0-NEXT:    sync
6699; MIPS32O0-NEXT:    move $2, $25
6700; MIPS32O0-NEXT:    jr $ra
6701; MIPS32O0-NEXT:    nop
6702;
6703; MIPS32R2-LABEL: CheckSync:
6704; MIPS32R2:       # %bb.0: # %entry
6705; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
6706; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6707; MIPS32R2-NEXT:    addu $1, $2, $25
6708; MIPS32R2-NEXT:    sync
6709; MIPS32R2-NEXT:    lw $1, %got(countsint)($1)
6710; MIPS32R2-NEXT:  $BB16_1: # %entry
6711; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
6712; MIPS32R2-NEXT:    ll $2, 0($1)
6713; MIPS32R2-NEXT:    addu $3, $2, $4
6714; MIPS32R2-NEXT:    sc $3, 0($1)
6715; MIPS32R2-NEXT:    beqz $3, $BB16_1
6716; MIPS32R2-NEXT:    nop
6717; MIPS32R2-NEXT:  # %bb.2: # %entry
6718; MIPS32R2-NEXT:    sync
6719; MIPS32R2-NEXT:    jr $ra
6720; MIPS32R2-NEXT:    nop
6721;
6722; MIPS32R6-LABEL: CheckSync:
6723; MIPS32R6:       # %bb.0: # %entry
6724; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
6725; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
6726; MIPS32R6-NEXT:    addu $1, $2, $25
6727; MIPS32R6-NEXT:    sync
6728; MIPS32R6-NEXT:    lw $1, %got(countsint)($1)
6729; MIPS32R6-NEXT:  $BB16_1: # %entry
6730; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
6731; MIPS32R6-NEXT:    ll $2, 0($1)
6732; MIPS32R6-NEXT:    addu $3, $2, $4
6733; MIPS32R6-NEXT:    sc $3, 0($1)
6734; MIPS32R6-NEXT:    beqzc $3, $BB16_1
6735; MIPS32R6-NEXT:  # %bb.2: # %entry
6736; MIPS32R6-NEXT:    sync
6737; MIPS32R6-NEXT:    jrc $ra
6738;
6739; MIPS32R6O0-LABEL: CheckSync:
6740; MIPS32R6O0:       # %bb.0: # %entry
6741; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
6742; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6743; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
6744; MIPS32R6O0-NEXT:    addu $2, $2, $25
6745; MIPS32R6O0-NEXT:    move $25, $4
6746; MIPS32R6O0-NEXT:    sync
6747; MIPS32R6O0-NEXT:    lw $2, %got(countsint)($2)
6748; MIPS32R6O0-NEXT:  $BB16_1: # %entry
6749; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
6750; MIPS32R6O0-NEXT:    ll $1, 0($2)
6751; MIPS32R6O0-NEXT:    addu $3, $1, $4
6752; MIPS32R6O0-NEXT:    sc $3, 0($2)
6753; MIPS32R6O0-NEXT:    beqzc $3, $BB16_1
6754; MIPS32R6O0-NEXT:  # %bb.2: # %entry
6755; MIPS32R6O0-NEXT:    sync
6756; MIPS32R6O0-NEXT:    move $2, $1
6757; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
6758; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
6759; MIPS32R6O0-NEXT:    jrc $ra
6760;
6761; MIPS4-LABEL: CheckSync:
6762; MIPS4:       # %bb.0: # %entry
6763; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6764; MIPS4-NEXT:    daddu $1, $1, $25
6765; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6766; MIPS4-NEXT:    sync
6767; MIPS4-NEXT:    ld $1, %got_disp(countsint)($1)
6768; MIPS4-NEXT:  .LBB16_1: # %entry
6769; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
6770; MIPS4-NEXT:    ll $2, 0($1)
6771; MIPS4-NEXT:    addu $3, $2, $4
6772; MIPS4-NEXT:    sc $3, 0($1)
6773; MIPS4-NEXT:    beqz $3, .LBB16_1
6774; MIPS4-NEXT:    nop
6775; MIPS4-NEXT:  # %bb.2: # %entry
6776; MIPS4-NEXT:    sync
6777; MIPS4-NEXT:    jr $ra
6778; MIPS4-NEXT:    nop
6779;
6780; MIPS64-LABEL: CheckSync:
6781; MIPS64:       # %bb.0: # %entry
6782; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6783; MIPS64-NEXT:    daddu $1, $1, $25
6784; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6785; MIPS64-NEXT:    sync
6786; MIPS64-NEXT:    ld $1, %got_disp(countsint)($1)
6787; MIPS64-NEXT:  .LBB16_1: # %entry
6788; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
6789; MIPS64-NEXT:    ll $2, 0($1)
6790; MIPS64-NEXT:    addu $3, $2, $4
6791; MIPS64-NEXT:    sc $3, 0($1)
6792; MIPS64-NEXT:    beqz $3, .LBB16_1
6793; MIPS64-NEXT:    nop
6794; MIPS64-NEXT:  # %bb.2: # %entry
6795; MIPS64-NEXT:    sync
6796; MIPS64-NEXT:    jr $ra
6797; MIPS64-NEXT:    nop
6798;
6799; MIPS64R2-LABEL: CheckSync:
6800; MIPS64R2:       # %bb.0: # %entry
6801; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6802; MIPS64R2-NEXT:    daddu $1, $1, $25
6803; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6804; MIPS64R2-NEXT:    sync
6805; MIPS64R2-NEXT:    ld $1, %got_disp(countsint)($1)
6806; MIPS64R2-NEXT:  .LBB16_1: # %entry
6807; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
6808; MIPS64R2-NEXT:    ll $2, 0($1)
6809; MIPS64R2-NEXT:    addu $3, $2, $4
6810; MIPS64R2-NEXT:    sc $3, 0($1)
6811; MIPS64R2-NEXT:    beqz $3, .LBB16_1
6812; MIPS64R2-NEXT:    nop
6813; MIPS64R2-NEXT:  # %bb.2: # %entry
6814; MIPS64R2-NEXT:    sync
6815; MIPS64R2-NEXT:    jr $ra
6816; MIPS64R2-NEXT:    nop
6817;
6818; MIPS64R6-LABEL: CheckSync:
6819; MIPS64R6:       # %bb.0: # %entry
6820; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6821; MIPS64R6-NEXT:    daddu $1, $1, $25
6822; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6823; MIPS64R6-NEXT:    sync
6824; MIPS64R6-NEXT:    ld $1, %got_disp(countsint)($1)
6825; MIPS64R6-NEXT:  .LBB16_1: # %entry
6826; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
6827; MIPS64R6-NEXT:    ll $2, 0($1)
6828; MIPS64R6-NEXT:    addu $3, $2, $4
6829; MIPS64R6-NEXT:    sc $3, 0($1)
6830; MIPS64R6-NEXT:    beqzc $3, .LBB16_1
6831; MIPS64R6-NEXT:  # %bb.2: # %entry
6832; MIPS64R6-NEXT:    sync
6833; MIPS64R6-NEXT:    jrc $ra
6834;
6835; MIPS64R6O0-LABEL: CheckSync:
6836; MIPS64R6O0:       # %bb.0: # %entry
6837; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6838; MIPS64R6O0-NEXT:    daddu $1, $1, $25
6839; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6840; MIPS64R6O0-NEXT:    move $2, $4
6841; MIPS64R6O0-NEXT:    sync
6842; MIPS64R6O0-NEXT:    ld $1, %got_disp(countsint)($1)
6843; MIPS64R6O0-NEXT:  .LBB16_1: # %entry
6844; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
6845; MIPS64R6O0-NEXT:    ll $3, 0($1)
6846; MIPS64R6O0-NEXT:    addu $5, $3, $2
6847; MIPS64R6O0-NEXT:    sc $5, 0($1)
6848; MIPS64R6O0-NEXT:    beqzc $5, .LBB16_1
6849; MIPS64R6O0-NEXT:  # %bb.2: # %entry
6850; MIPS64R6O0-NEXT:    sync
6851; MIPS64R6O0-NEXT:    move $2, $3
6852; MIPS64R6O0-NEXT:    jrc $ra
6853;
6854; MM32-LABEL: CheckSync:
6855; MM32:       # %bb.0: # %entry
6856; MM32-NEXT:    lui $2, %hi(_gp_disp)
6857; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6858; MM32-NEXT:    addu $2, $2, $25
6859; MM32-NEXT:    sync
6860; MM32-NEXT:    lw $1, %got(countsint)($2)
6861; MM32-NEXT:  $BB16_1: # %entry
6862; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
6863; MM32-NEXT:    ll $2, 0($1)
6864; MM32-NEXT:    addu16 $3, $2, $4
6865; MM32-NEXT:    sc $3, 0($1)
6866; MM32-NEXT:    beqzc $3, $BB16_1
6867; MM32-NEXT:  # %bb.2: # %entry
6868; MM32-NEXT:    sync
6869; MM32-NEXT:    jrc $ra
6870;
6871; O1-LABEL: CheckSync:
6872; O1:       # %bb.0: # %entry
6873; O1-NEXT:    lui $2, %hi(_gp_disp)
6874; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
6875; O1-NEXT:    addu $1, $2, $25
6876; O1-NEXT:    sync
6877; O1-NEXT:    lw $1, %got(countsint)($1)
6878; O1-NEXT:  $BB16_1: # %entry
6879; O1-NEXT:    # =>This Inner Loop Header: Depth=1
6880; O1-NEXT:    ll $2, 0($1)
6881; O1-NEXT:    addu $3, $2, $4
6882; O1-NEXT:    sc $3, 0($1)
6883; O1-NEXT:    beqz $3, $BB16_1
6884; O1-NEXT:    nop
6885; O1-NEXT:  # %bb.2: # %entry
6886; O1-NEXT:    sync
6887; O1-NEXT:    jr $ra
6888; O1-NEXT:    nop
6889;
6890; O2-LABEL: CheckSync:
6891; O2:       # %bb.0: # %entry
6892; O2-NEXT:    lui $2, %hi(_gp_disp)
6893; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6894; O2-NEXT:    addu $1, $2, $25
6895; O2-NEXT:    sync
6896; O2-NEXT:    lw $1, %got(countsint)($1)
6897; O2-NEXT:  $BB16_1: # %entry
6898; O2-NEXT:    # =>This Inner Loop Header: Depth=1
6899; O2-NEXT:    ll $2, 0($1)
6900; O2-NEXT:    addu $3, $2, $4
6901; O2-NEXT:    sc $3, 0($1)
6902; O2-NEXT:    beqz $3, $BB16_1
6903; O2-NEXT:    nop
6904; O2-NEXT:  # %bb.2: # %entry
6905; O2-NEXT:    sync
6906; O2-NEXT:    jr $ra
6907; O2-NEXT:    nop
6908;
6909; O3-LABEL: CheckSync:
6910; O3:       # %bb.0: # %entry
6911; O3-NEXT:    lui $2, %hi(_gp_disp)
6912; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
6913; O3-NEXT:    addu $1, $2, $25
6914; O3-NEXT:    sync
6915; O3-NEXT:    lw $1, %got(countsint)($1)
6916; O3-NEXT:  $BB16_1: # %entry
6917; O3-NEXT:    # =>This Inner Loop Header: Depth=1
6918; O3-NEXT:    ll $2, 0($1)
6919; O3-NEXT:    addu $3, $2, $4
6920; O3-NEXT:    sc $3, 0($1)
6921; O3-NEXT:    beqz $3, $BB16_1
6922; O3-NEXT:    nop
6923; O3-NEXT:  # %bb.2: # %entry
6924; O3-NEXT:    sync
6925; O3-NEXT:    jr $ra
6926; O3-NEXT:    nop
6927;
6928; MIPS32EB-LABEL: CheckSync:
6929; MIPS32EB:       # %bb.0: # %entry
6930; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
6931; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
6932; MIPS32EB-NEXT:    addu $1, $2, $25
6933; MIPS32EB-NEXT:    sync
6934; MIPS32EB-NEXT:    lw $1, %got(countsint)($1)
6935; MIPS32EB-NEXT:  $BB16_1: # %entry
6936; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
6937; MIPS32EB-NEXT:    ll $2, 0($1)
6938; MIPS32EB-NEXT:    addu $3, $2, $4
6939; MIPS32EB-NEXT:    sc $3, 0($1)
6940; MIPS32EB-NEXT:    beqz $3, $BB16_1
6941; MIPS32EB-NEXT:    nop
6942; MIPS32EB-NEXT:  # %bb.2: # %entry
6943; MIPS32EB-NEXT:    sync
6944; MIPS32EB-NEXT:    jr $ra
6945; MIPS32EB-NEXT:    nop
6946entry:
6947  %0 = atomicrmw add i32* @countsint, i32 %v seq_cst
6948  ret i32 %0
6949}
6950
6951; make sure that this assertion in
6952; TwoAddressInstructionPass::TryInstructionTransform does not fail:
6953;
6954; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) &&
6955;
6956; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an
6957; operand of an atomic instruction with register $zero.
6958@a = external global i32
6959
6960define i32 @zeroreg() nounwind {
6961; MIPS32-LABEL: zeroreg:
6962; MIPS32:       # %bb.0: # %entry
6963; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
6964; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6965; MIPS32-NEXT:    addu $1, $2, $25
6966; MIPS32-NEXT:    sync
6967; MIPS32-NEXT:    addiu $2, $zero, 0
6968; MIPS32-NEXT:    addiu $3, $zero, 1
6969; MIPS32-NEXT:    lw $1, %got(a)($1)
6970; MIPS32-NEXT:  $BB17_1: # %entry
6971; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
6972; MIPS32-NEXT:    ll $4, 0($1)
6973; MIPS32-NEXT:    bne $4, $3, $BB17_3
6974; MIPS32-NEXT:    nop
6975; MIPS32-NEXT:  # %bb.2: # %entry
6976; MIPS32-NEXT:    # in Loop: Header=BB17_1 Depth=1
6977; MIPS32-NEXT:    move $5, $2
6978; MIPS32-NEXT:    sc $5, 0($1)
6979; MIPS32-NEXT:    beqz $5, $BB17_1
6980; MIPS32-NEXT:    nop
6981; MIPS32-NEXT:  $BB17_3: # %entry
6982; MIPS32-NEXT:    xor $1, $4, $3
6983; MIPS32-NEXT:    sltiu $2, $1, 1
6984; MIPS32-NEXT:    sync
6985; MIPS32-NEXT:    jr $ra
6986; MIPS32-NEXT:    nop
6987;
6988; MIPS32O0-LABEL: zeroreg:
6989; MIPS32O0:       # %bb.0: # %entry
6990; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
6991; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6992; MIPS32O0-NEXT:    addiu $sp, $sp, -16
6993; MIPS32O0-NEXT:    addu $2, $2, $25
6994; MIPS32O0-NEXT:    sync
6995; MIPS32O0-NEXT:    lw $2, %got(a)($2)
6996; MIPS32O0-NEXT:    addiu $25, $zero, 0
6997; MIPS32O0-NEXT:    addiu $1, $zero, 1
6998; MIPS32O0-NEXT:    lw $3, 12($sp) # 4-byte Folded Reload
6999; MIPS32O0-NEXT:    move $4, $1
7000; MIPS32O0-NEXT:  $BB17_1: # %entry
7001; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
7002; MIPS32O0-NEXT:    ll $5, 0($2)
7003; MIPS32O0-NEXT:    bne $5, $4, $BB17_3
7004; MIPS32O0-NEXT:    nop
7005; MIPS32O0-NEXT:  # %bb.2: # %entry
7006; MIPS32O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
7007; MIPS32O0-NEXT:    move $6, $25
7008; MIPS32O0-NEXT:    sc $6, 0($2)
7009; MIPS32O0-NEXT:    beqz $6, $BB17_1
7010; MIPS32O0-NEXT:    nop
7011; MIPS32O0-NEXT:  $BB17_3: # %entry
7012; MIPS32O0-NEXT:    xor $1, $5, $1
7013; MIPS32O0-NEXT:    sltiu $1, $1, 1
7014; MIPS32O0-NEXT:    sync
7015; MIPS32O0-NEXT:    addiu $2, $zero, 1
7016; MIPS32O0-NEXT:    xor $2, $5, $2
7017; MIPS32O0-NEXT:    sltiu $2, $2, 1
7018; MIPS32O0-NEXT:    andi $2, $2, 1
7019; MIPS32O0-NEXT:    sw $3, 8($sp) # 4-byte Folded Spill
7020; MIPS32O0-NEXT:    sw $5, 12($sp) # 4-byte Folded Spill
7021; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
7022; MIPS32O0-NEXT:    addiu $sp, $sp, 16
7023; MIPS32O0-NEXT:    jr $ra
7024; MIPS32O0-NEXT:    nop
7025;
7026; MIPS32R2-LABEL: zeroreg:
7027; MIPS32R2:       # %bb.0: # %entry
7028; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
7029; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7030; MIPS32R2-NEXT:    addu $1, $2, $25
7031; MIPS32R2-NEXT:    sync
7032; MIPS32R2-NEXT:    addiu $2, $zero, 0
7033; MIPS32R2-NEXT:    addiu $3, $zero, 1
7034; MIPS32R2-NEXT:    lw $1, %got(a)($1)
7035; MIPS32R2-NEXT:  $BB17_1: # %entry
7036; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
7037; MIPS32R2-NEXT:    ll $4, 0($1)
7038; MIPS32R2-NEXT:    bne $4, $3, $BB17_3
7039; MIPS32R2-NEXT:    nop
7040; MIPS32R2-NEXT:  # %bb.2: # %entry
7041; MIPS32R2-NEXT:    # in Loop: Header=BB17_1 Depth=1
7042; MIPS32R2-NEXT:    move $5, $2
7043; MIPS32R2-NEXT:    sc $5, 0($1)
7044; MIPS32R2-NEXT:    beqz $5, $BB17_1
7045; MIPS32R2-NEXT:    nop
7046; MIPS32R2-NEXT:  $BB17_3: # %entry
7047; MIPS32R2-NEXT:    xor $1, $4, $3
7048; MIPS32R2-NEXT:    sltiu $2, $1, 1
7049; MIPS32R2-NEXT:    sync
7050; MIPS32R2-NEXT:    jr $ra
7051; MIPS32R2-NEXT:    nop
7052;
7053; MIPS32R6-LABEL: zeroreg:
7054; MIPS32R6:       # %bb.0: # %entry
7055; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
7056; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
7057; MIPS32R6-NEXT:    addu $1, $2, $25
7058; MIPS32R6-NEXT:    sync
7059; MIPS32R6-NEXT:    addiu $2, $zero, 0
7060; MIPS32R6-NEXT:    addiu $3, $zero, 1
7061; MIPS32R6-NEXT:    lw $1, %got(a)($1)
7062; MIPS32R6-NEXT:  $BB17_1: # %entry
7063; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
7064; MIPS32R6-NEXT:    ll $4, 0($1)
7065; MIPS32R6-NEXT:    bnec $4, $3, $BB17_3
7066; MIPS32R6-NEXT:  # %bb.2: # %entry
7067; MIPS32R6-NEXT:    # in Loop: Header=BB17_1 Depth=1
7068; MIPS32R6-NEXT:    move $5, $2
7069; MIPS32R6-NEXT:    sc $5, 0($1)
7070; MIPS32R6-NEXT:    beqzc $5, $BB17_1
7071; MIPS32R6-NEXT:  $BB17_3: # %entry
7072; MIPS32R6-NEXT:    xor $1, $4, $3
7073; MIPS32R6-NEXT:    sltiu $2, $1, 1
7074; MIPS32R6-NEXT:    sync
7075; MIPS32R6-NEXT:    jrc $ra
7076;
7077; MIPS32R6O0-LABEL: zeroreg:
7078; MIPS32R6O0:       # %bb.0: # %entry
7079; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
7080; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7081; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
7082; MIPS32R6O0-NEXT:    addu $2, $2, $25
7083; MIPS32R6O0-NEXT:    sync
7084; MIPS32R6O0-NEXT:    lw $2, %got(a)($2)
7085; MIPS32R6O0-NEXT:    addiu $25, $zero, 0
7086; MIPS32R6O0-NEXT:    addiu $1, $zero, 1
7087; MIPS32R6O0-NEXT:    lw $3, 4($sp) # 4-byte Folded Reload
7088; MIPS32R6O0-NEXT:    move $4, $1
7089; MIPS32R6O0-NEXT:  $BB17_1: # %entry
7090; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7091; MIPS32R6O0-NEXT:    ll $5, 0($2)
7092; MIPS32R6O0-NEXT:    bnec $5, $4, $BB17_3
7093; MIPS32R6O0-NEXT:  # %bb.2: # %entry
7094; MIPS32R6O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
7095; MIPS32R6O0-NEXT:    move $6, $25
7096; MIPS32R6O0-NEXT:    sc $6, 0($2)
7097; MIPS32R6O0-NEXT:    beqzc $6, $BB17_1
7098; MIPS32R6O0-NEXT:  $BB17_3: # %entry
7099; MIPS32R6O0-NEXT:    xor $1, $5, $1
7100; MIPS32R6O0-NEXT:    sltiu $2, $1, 1
7101; MIPS32R6O0-NEXT:    sync
7102; MIPS32R6O0-NEXT:    sw $3, 0($sp) # 4-byte Folded Spill
7103; MIPS32R6O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
7104; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
7105; MIPS32R6O0-NEXT:    jrc $ra
7106;
7107; MIPS4-LABEL: zeroreg:
7108; MIPS4:       # %bb.0: # %entry
7109; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7110; MIPS4-NEXT:    daddu $1, $1, $25
7111; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7112; MIPS4-NEXT:    sync
7113; MIPS4-NEXT:    addiu $2, $zero, 0
7114; MIPS4-NEXT:    addiu $3, $zero, 1
7115; MIPS4-NEXT:    ld $1, %got_disp(a)($1)
7116; MIPS4-NEXT:  .LBB17_1: # %entry
7117; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
7118; MIPS4-NEXT:    ll $4, 0($1)
7119; MIPS4-NEXT:    bne $4, $3, .LBB17_3
7120; MIPS4-NEXT:    nop
7121; MIPS4-NEXT:  # %bb.2: # %entry
7122; MIPS4-NEXT:    # in Loop: Header=BB17_1 Depth=1
7123; MIPS4-NEXT:    move $5, $2
7124; MIPS4-NEXT:    sc $5, 0($1)
7125; MIPS4-NEXT:    beqz $5, .LBB17_1
7126; MIPS4-NEXT:    nop
7127; MIPS4-NEXT:  .LBB17_3: # %entry
7128; MIPS4-NEXT:    xor $1, $4, $3
7129; MIPS4-NEXT:    sltiu $2, $1, 1
7130; MIPS4-NEXT:    sync
7131; MIPS4-NEXT:    jr $ra
7132; MIPS4-NEXT:    nop
7133;
7134; MIPS64-LABEL: zeroreg:
7135; MIPS64:       # %bb.0: # %entry
7136; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7137; MIPS64-NEXT:    daddu $1, $1, $25
7138; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7139; MIPS64-NEXT:    sync
7140; MIPS64-NEXT:    addiu $2, $zero, 0
7141; MIPS64-NEXT:    addiu $3, $zero, 1
7142; MIPS64-NEXT:    ld $1, %got_disp(a)($1)
7143; MIPS64-NEXT:  .LBB17_1: # %entry
7144; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
7145; MIPS64-NEXT:    ll $4, 0($1)
7146; MIPS64-NEXT:    bne $4, $3, .LBB17_3
7147; MIPS64-NEXT:    nop
7148; MIPS64-NEXT:  # %bb.2: # %entry
7149; MIPS64-NEXT:    # in Loop: Header=BB17_1 Depth=1
7150; MIPS64-NEXT:    move $5, $2
7151; MIPS64-NEXT:    sc $5, 0($1)
7152; MIPS64-NEXT:    beqz $5, .LBB17_1
7153; MIPS64-NEXT:    nop
7154; MIPS64-NEXT:  .LBB17_3: # %entry
7155; MIPS64-NEXT:    xor $1, $4, $3
7156; MIPS64-NEXT:    sltiu $2, $1, 1
7157; MIPS64-NEXT:    sync
7158; MIPS64-NEXT:    jr $ra
7159; MIPS64-NEXT:    nop
7160;
7161; MIPS64R2-LABEL: zeroreg:
7162; MIPS64R2:       # %bb.0: # %entry
7163; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7164; MIPS64R2-NEXT:    daddu $1, $1, $25
7165; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7166; MIPS64R2-NEXT:    sync
7167; MIPS64R2-NEXT:    addiu $2, $zero, 0
7168; MIPS64R2-NEXT:    addiu $3, $zero, 1
7169; MIPS64R2-NEXT:    ld $1, %got_disp(a)($1)
7170; MIPS64R2-NEXT:  .LBB17_1: # %entry
7171; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
7172; MIPS64R2-NEXT:    ll $4, 0($1)
7173; MIPS64R2-NEXT:    bne $4, $3, .LBB17_3
7174; MIPS64R2-NEXT:    nop
7175; MIPS64R2-NEXT:  # %bb.2: # %entry
7176; MIPS64R2-NEXT:    # in Loop: Header=BB17_1 Depth=1
7177; MIPS64R2-NEXT:    move $5, $2
7178; MIPS64R2-NEXT:    sc $5, 0($1)
7179; MIPS64R2-NEXT:    beqz $5, .LBB17_1
7180; MIPS64R2-NEXT:    nop
7181; MIPS64R2-NEXT:  .LBB17_3: # %entry
7182; MIPS64R2-NEXT:    xor $1, $4, $3
7183; MIPS64R2-NEXT:    sltiu $2, $1, 1
7184; MIPS64R2-NEXT:    sync
7185; MIPS64R2-NEXT:    jr $ra
7186; MIPS64R2-NEXT:    nop
7187;
7188; MIPS64R6-LABEL: zeroreg:
7189; MIPS64R6:       # %bb.0: # %entry
7190; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7191; MIPS64R6-NEXT:    daddu $1, $1, $25
7192; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7193; MIPS64R6-NEXT:    sync
7194; MIPS64R6-NEXT:    addiu $2, $zero, 0
7195; MIPS64R6-NEXT:    addiu $3, $zero, 1
7196; MIPS64R6-NEXT:    ld $1, %got_disp(a)($1)
7197; MIPS64R6-NEXT:  .LBB17_1: # %entry
7198; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
7199; MIPS64R6-NEXT:    ll $4, 0($1)
7200; MIPS64R6-NEXT:    bnec $4, $3, .LBB17_3
7201; MIPS64R6-NEXT:  # %bb.2: # %entry
7202; MIPS64R6-NEXT:    # in Loop: Header=BB17_1 Depth=1
7203; MIPS64R6-NEXT:    move $5, $2
7204; MIPS64R6-NEXT:    sc $5, 0($1)
7205; MIPS64R6-NEXT:    beqzc $5, .LBB17_1
7206; MIPS64R6-NEXT:  .LBB17_3: # %entry
7207; MIPS64R6-NEXT:    xor $1, $4, $3
7208; MIPS64R6-NEXT:    sltiu $2, $1, 1
7209; MIPS64R6-NEXT:    sync
7210; MIPS64R6-NEXT:    jrc $ra
7211;
7212; MIPS64R6O0-LABEL: zeroreg:
7213; MIPS64R6O0:       # %bb.0: # %entry
7214; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
7215; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7216; MIPS64R6O0-NEXT:    daddu $1, $1, $25
7217; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7218; MIPS64R6O0-NEXT:    sync
7219; MIPS64R6O0-NEXT:    ld $1, %got_disp(a)($1)
7220; MIPS64R6O0-NEXT:    addiu $2, $zero, 0
7221; MIPS64R6O0-NEXT:    addiu $3, $zero, 1
7222; MIPS64R6O0-NEXT:    lw $4, 12($sp) # 4-byte Folded Reload
7223; MIPS64R6O0-NEXT:    move $5, $3
7224; MIPS64R6O0-NEXT:  .LBB17_1: # %entry
7225; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7226; MIPS64R6O0-NEXT:    ll $6, 0($1)
7227; MIPS64R6O0-NEXT:    bnec $6, $5, .LBB17_3
7228; MIPS64R6O0-NEXT:  # %bb.2: # %entry
7229; MIPS64R6O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
7230; MIPS64R6O0-NEXT:    move $7, $2
7231; MIPS64R6O0-NEXT:    sc $7, 0($1)
7232; MIPS64R6O0-NEXT:    beqzc $7, .LBB17_1
7233; MIPS64R6O0-NEXT:  .LBB17_3: # %entry
7234; MIPS64R6O0-NEXT:    xor $2, $6, $3
7235; MIPS64R6O0-NEXT:    sltiu $2, $2, 1
7236; MIPS64R6O0-NEXT:    sync
7237; MIPS64R6O0-NEXT:    sw $4, 8($sp) # 4-byte Folded Spill
7238; MIPS64R6O0-NEXT:    sw $6, 12($sp) # 4-byte Folded Spill
7239; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
7240; MIPS64R6O0-NEXT:    jrc $ra
7241;
7242; MM32-LABEL: zeroreg:
7243; MM32:       # %bb.0: # %entry
7244; MM32-NEXT:    lui $2, %hi(_gp_disp)
7245; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7246; MM32-NEXT:    addu $2, $2, $25
7247; MM32-NEXT:    sync
7248; MM32-NEXT:    li16 $3, 0
7249; MM32-NEXT:    li16 $4, 1
7250; MM32-NEXT:    lw $1, %got(a)($2)
7251; MM32-NEXT:  $BB17_1: # %entry
7252; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
7253; MM32-NEXT:    ll $2, 0($1)
7254; MM32-NEXT:    bne $2, $4, $BB17_3
7255; MM32-NEXT:    nop
7256; MM32-NEXT:  # %bb.2: # %entry
7257; MM32-NEXT:    # in Loop: Header=BB17_1 Depth=1
7258; MM32-NEXT:    move $5, $3
7259; MM32-NEXT:    sc $5, 0($1)
7260; MM32-NEXT:    beqzc $5, $BB17_1
7261; MM32-NEXT:  $BB17_3: # %entry
7262; MM32-NEXT:    xor $1, $2, $4
7263; MM32-NEXT:    sltiu $2, $1, 1
7264; MM32-NEXT:    sync
7265; MM32-NEXT:    jrc $ra
7266;
7267; O1-LABEL: zeroreg:
7268; O1:       # %bb.0: # %entry
7269; O1-NEXT:    lui $2, %hi(_gp_disp)
7270; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
7271; O1-NEXT:    addu $1, $2, $25
7272; O1-NEXT:    sync
7273; O1-NEXT:    addiu $2, $zero, 0
7274; O1-NEXT:    addiu $3, $zero, 1
7275; O1-NEXT:    lw $1, %got(a)($1)
7276; O1-NEXT:  $BB17_1: # %entry
7277; O1-NEXT:    # =>This Inner Loop Header: Depth=1
7278; O1-NEXT:    ll $4, 0($1)
7279; O1-NEXT:    bne $4, $3, $BB17_3
7280; O1-NEXT:    nop
7281; O1-NEXT:  # %bb.2: # %entry
7282; O1-NEXT:    # in Loop: Header=BB17_1 Depth=1
7283; O1-NEXT:    move $5, $2
7284; O1-NEXT:    sc $5, 0($1)
7285; O1-NEXT:    beqz $5, $BB17_1
7286; O1-NEXT:    nop
7287; O1-NEXT:  $BB17_3: # %entry
7288; O1-NEXT:    xor $1, $4, $3
7289; O1-NEXT:    sltiu $2, $1, 1
7290; O1-NEXT:    sync
7291; O1-NEXT:    jr $ra
7292; O1-NEXT:    nop
7293;
7294; O2-LABEL: zeroreg:
7295; O2:       # %bb.0: # %entry
7296; O2-NEXT:    lui $2, %hi(_gp_disp)
7297; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7298; O2-NEXT:    addu $1, $2, $25
7299; O2-NEXT:    sync
7300; O2-NEXT:    addiu $2, $zero, 0
7301; O2-NEXT:    addiu $3, $zero, 1
7302; O2-NEXT:    lw $1, %got(a)($1)
7303; O2-NEXT:  $BB17_1: # %entry
7304; O2-NEXT:    # =>This Inner Loop Header: Depth=1
7305; O2-NEXT:    ll $4, 0($1)
7306; O2-NEXT:    bne $4, $3, $BB17_3
7307; O2-NEXT:    nop
7308; O2-NEXT:  # %bb.2: # %entry
7309; O2-NEXT:    # in Loop: Header=BB17_1 Depth=1
7310; O2-NEXT:    move $5, $2
7311; O2-NEXT:    sc $5, 0($1)
7312; O2-NEXT:    beqz $5, $BB17_1
7313; O2-NEXT:    nop
7314; O2-NEXT:  $BB17_3: # %entry
7315; O2-NEXT:    xor $1, $4, $3
7316; O2-NEXT:    sltiu $2, $1, 1
7317; O2-NEXT:    sync
7318; O2-NEXT:    jr $ra
7319; O2-NEXT:    nop
7320;
7321; O3-LABEL: zeroreg:
7322; O3:       # %bb.0: # %entry
7323; O3-NEXT:    lui $2, %hi(_gp_disp)
7324; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
7325; O3-NEXT:    addu $1, $2, $25
7326; O3-NEXT:    addiu $2, $zero, 0
7327; O3-NEXT:    addiu $3, $zero, 1
7328; O3-NEXT:    sync
7329; O3-NEXT:    lw $1, %got(a)($1)
7330; O3-NEXT:  $BB17_1: # %entry
7331; O3-NEXT:    # =>This Inner Loop Header: Depth=1
7332; O3-NEXT:    ll $4, 0($1)
7333; O3-NEXT:    bne $4, $3, $BB17_3
7334; O3-NEXT:    nop
7335; O3-NEXT:  # %bb.2: # %entry
7336; O3-NEXT:    # in Loop: Header=BB17_1 Depth=1
7337; O3-NEXT:    move $5, $2
7338; O3-NEXT:    sc $5, 0($1)
7339; O3-NEXT:    beqz $5, $BB17_1
7340; O3-NEXT:    nop
7341; O3-NEXT:  $BB17_3: # %entry
7342; O3-NEXT:    sync
7343; O3-NEXT:    xor $1, $4, $3
7344; O3-NEXT:    jr $ra
7345; O3-NEXT:    sltiu $2, $1, 1
7346;
7347; MIPS32EB-LABEL: zeroreg:
7348; MIPS32EB:       # %bb.0: # %entry
7349; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
7350; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
7351; MIPS32EB-NEXT:    addu $1, $2, $25
7352; MIPS32EB-NEXT:    sync
7353; MIPS32EB-NEXT:    addiu $2, $zero, 0
7354; MIPS32EB-NEXT:    addiu $3, $zero, 1
7355; MIPS32EB-NEXT:    lw $1, %got(a)($1)
7356; MIPS32EB-NEXT:  $BB17_1: # %entry
7357; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
7358; MIPS32EB-NEXT:    ll $4, 0($1)
7359; MIPS32EB-NEXT:    bne $4, $3, $BB17_3
7360; MIPS32EB-NEXT:    nop
7361; MIPS32EB-NEXT:  # %bb.2: # %entry
7362; MIPS32EB-NEXT:    # in Loop: Header=BB17_1 Depth=1
7363; MIPS32EB-NEXT:    move $5, $2
7364; MIPS32EB-NEXT:    sc $5, 0($1)
7365; MIPS32EB-NEXT:    beqz $5, $BB17_1
7366; MIPS32EB-NEXT:    nop
7367; MIPS32EB-NEXT:  $BB17_3: # %entry
7368; MIPS32EB-NEXT:    xor $1, $4, $3
7369; MIPS32EB-NEXT:    sltiu $2, $1, 1
7370; MIPS32EB-NEXT:    sync
7371; MIPS32EB-NEXT:    jr $ra
7372; MIPS32EB-NEXT:    nop
7373entry:
7374  %pair0 = cmpxchg i32* @a, i32 1, i32 0 seq_cst seq_cst
7375  %0 = extractvalue { i32, i1 } %pair0, 0
7376  %1 = icmp eq i32 %0, 1
7377  %conv = zext i1 %1 to i32
7378  ret i32 %conv
7379}
7380
7381; Check that MIPS32R6 has the correct offset range.
7382; FIXME: At the moment, we don't seem to do addr+offset for any atomic load/store.
7383define i32 @AtomicLoadAdd32_OffGt9Bit(i32 signext %incr) nounwind {
7384; MIPS32-LABEL: AtomicLoadAdd32_OffGt9Bit:
7385; MIPS32:       # %bb.0: # %entry
7386; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
7387; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7388; MIPS32-NEXT:    addu $1, $2, $25
7389; MIPS32-NEXT:    lw $1, %got(x)($1)
7390; MIPS32-NEXT:    addiu $1, $1, 1024
7391; MIPS32-NEXT:  $BB18_1: # %entry
7392; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
7393; MIPS32-NEXT:    ll $2, 0($1)
7394; MIPS32-NEXT:    addu $3, $2, $4
7395; MIPS32-NEXT:    sc $3, 0($1)
7396; MIPS32-NEXT:    beqz $3, $BB18_1
7397; MIPS32-NEXT:    nop
7398; MIPS32-NEXT:  # %bb.2: # %entry
7399; MIPS32-NEXT:    jr $ra
7400; MIPS32-NEXT:    nop
7401;
7402; MIPS32O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7403; MIPS32O0:       # %bb.0: # %entry
7404; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
7405; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7406; MIPS32O0-NEXT:    addu $2, $2, $25
7407; MIPS32O0-NEXT:    lw $2, %got(x)($2)
7408; MIPS32O0-NEXT:    addiu $2, $2, 1024
7409; MIPS32O0-NEXT:  $BB18_1: # %entry
7410; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
7411; MIPS32O0-NEXT:    ll $25, 0($2)
7412; MIPS32O0-NEXT:    addu $1, $25, $4
7413; MIPS32O0-NEXT:    sc $1, 0($2)
7414; MIPS32O0-NEXT:    beqz $1, $BB18_1
7415; MIPS32O0-NEXT:    nop
7416; MIPS32O0-NEXT:  # %bb.2: # %entry
7417; MIPS32O0-NEXT:    move $2, $25
7418; MIPS32O0-NEXT:    jr $ra
7419; MIPS32O0-NEXT:    nop
7420;
7421; MIPS32R2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7422; MIPS32R2:       # %bb.0: # %entry
7423; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
7424; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7425; MIPS32R2-NEXT:    addu $1, $2, $25
7426; MIPS32R2-NEXT:    lw $1, %got(x)($1)
7427; MIPS32R2-NEXT:    addiu $1, $1, 1024
7428; MIPS32R2-NEXT:  $BB18_1: # %entry
7429; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
7430; MIPS32R2-NEXT:    ll $2, 0($1)
7431; MIPS32R2-NEXT:    addu $3, $2, $4
7432; MIPS32R2-NEXT:    sc $3, 0($1)
7433; MIPS32R2-NEXT:    beqz $3, $BB18_1
7434; MIPS32R2-NEXT:    nop
7435; MIPS32R2-NEXT:  # %bb.2: # %entry
7436; MIPS32R2-NEXT:    jr $ra
7437; MIPS32R2-NEXT:    nop
7438;
7439; MIPS32R6-LABEL: AtomicLoadAdd32_OffGt9Bit:
7440; MIPS32R6:       # %bb.0: # %entry
7441; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
7442; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
7443; MIPS32R6-NEXT:    addu $1, $2, $25
7444; MIPS32R6-NEXT:    lw $1, %got(x)($1)
7445; MIPS32R6-NEXT:    addiu $1, $1, 1024
7446; MIPS32R6-NEXT:  $BB18_1: # %entry
7447; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
7448; MIPS32R6-NEXT:    ll $2, 0($1)
7449; MIPS32R6-NEXT:    addu $3, $2, $4
7450; MIPS32R6-NEXT:    sc $3, 0($1)
7451; MIPS32R6-NEXT:    beqzc $3, $BB18_1
7452; MIPS32R6-NEXT:    nop
7453; MIPS32R6-NEXT:  # %bb.2: # %entry
7454; MIPS32R6-NEXT:    jrc $ra
7455;
7456; MIPS32R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7457; MIPS32R6O0:       # %bb.0: # %entry
7458; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
7459; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7460; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
7461; MIPS32R6O0-NEXT:    addu $2, $2, $25
7462; MIPS32R6O0-NEXT:    move $25, $4
7463; MIPS32R6O0-NEXT:    lw $2, %got(x)($2)
7464; MIPS32R6O0-NEXT:    addiu $2, $2, 1024
7465; MIPS32R6O0-NEXT:  $BB18_1: # %entry
7466; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7467; MIPS32R6O0-NEXT:    ll $1, 0($2)
7468; MIPS32R6O0-NEXT:    addu $3, $1, $4
7469; MIPS32R6O0-NEXT:    sc $3, 0($2)
7470; MIPS32R6O0-NEXT:    beqzc $3, $BB18_1
7471; MIPS32R6O0-NEXT:  # %bb.2: # %entry
7472; MIPS32R6O0-NEXT:    move $2, $1
7473; MIPS32R6O0-NEXT:    sw $25, 4($sp) # 4-byte Folded Spill
7474; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
7475; MIPS32R6O0-NEXT:    jrc $ra
7476;
7477; MIPS4-LABEL: AtomicLoadAdd32_OffGt9Bit:
7478; MIPS4:       # %bb.0: # %entry
7479; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7480; MIPS4-NEXT:    daddu $1, $1, $25
7481; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7482; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
7483; MIPS4-NEXT:    daddiu $1, $1, 1024
7484; MIPS4-NEXT:  .LBB18_1: # %entry
7485; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
7486; MIPS4-NEXT:    ll $2, 0($1)
7487; MIPS4-NEXT:    addu $3, $2, $4
7488; MIPS4-NEXT:    sc $3, 0($1)
7489; MIPS4-NEXT:    beqz $3, .LBB18_1
7490; MIPS4-NEXT:    nop
7491; MIPS4-NEXT:  # %bb.2: # %entry
7492; MIPS4-NEXT:    jr $ra
7493; MIPS4-NEXT:    nop
7494;
7495; MIPS64-LABEL: AtomicLoadAdd32_OffGt9Bit:
7496; MIPS64:       # %bb.0: # %entry
7497; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7498; MIPS64-NEXT:    daddu $1, $1, $25
7499; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7500; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
7501; MIPS64-NEXT:    daddiu $1, $1, 1024
7502; MIPS64-NEXT:  .LBB18_1: # %entry
7503; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
7504; MIPS64-NEXT:    ll $2, 0($1)
7505; MIPS64-NEXT:    addu $3, $2, $4
7506; MIPS64-NEXT:    sc $3, 0($1)
7507; MIPS64-NEXT:    beqz $3, .LBB18_1
7508; MIPS64-NEXT:    nop
7509; MIPS64-NEXT:  # %bb.2: # %entry
7510; MIPS64-NEXT:    jr $ra
7511; MIPS64-NEXT:    nop
7512;
7513; MIPS64R2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7514; MIPS64R2:       # %bb.0: # %entry
7515; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7516; MIPS64R2-NEXT:    daddu $1, $1, $25
7517; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7518; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
7519; MIPS64R2-NEXT:    daddiu $1, $1, 1024
7520; MIPS64R2-NEXT:  .LBB18_1: # %entry
7521; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
7522; MIPS64R2-NEXT:    ll $2, 0($1)
7523; MIPS64R2-NEXT:    addu $3, $2, $4
7524; MIPS64R2-NEXT:    sc $3, 0($1)
7525; MIPS64R2-NEXT:    beqz $3, .LBB18_1
7526; MIPS64R2-NEXT:    nop
7527; MIPS64R2-NEXT:  # %bb.2: # %entry
7528; MIPS64R2-NEXT:    jr $ra
7529; MIPS64R2-NEXT:    nop
7530;
7531; MIPS64R6-LABEL: AtomicLoadAdd32_OffGt9Bit:
7532; MIPS64R6:       # %bb.0: # %entry
7533; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7534; MIPS64R6-NEXT:    daddu $1, $1, $25
7535; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7536; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
7537; MIPS64R6-NEXT:    daddiu $1, $1, 1024
7538; MIPS64R6-NEXT:  .LBB18_1: # %entry
7539; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
7540; MIPS64R6-NEXT:    ll $2, 0($1)
7541; MIPS64R6-NEXT:    addu $3, $2, $4
7542; MIPS64R6-NEXT:    sc $3, 0($1)
7543; MIPS64R6-NEXT:    beqzc $3, .LBB18_1
7544; MIPS64R6-NEXT:    nop
7545; MIPS64R6-NEXT:  # %bb.2: # %entry
7546; MIPS64R6-NEXT:    jrc $ra
7547;
7548; MIPS64R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7549; MIPS64R6O0:       # %bb.0: # %entry
7550; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7551; MIPS64R6O0-NEXT:    daddu $1, $1, $25
7552; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7553; MIPS64R6O0-NEXT:    move $2, $4
7554; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
7555; MIPS64R6O0-NEXT:    daddiu $1, $1, 1024
7556; MIPS64R6O0-NEXT:  .LBB18_1: # %entry
7557; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7558; MIPS64R6O0-NEXT:    ll $3, 0($1)
7559; MIPS64R6O0-NEXT:    addu $5, $3, $2
7560; MIPS64R6O0-NEXT:    sc $5, 0($1)
7561; MIPS64R6O0-NEXT:    beqzc $5, .LBB18_1
7562; MIPS64R6O0-NEXT:  # %bb.2: # %entry
7563; MIPS64R6O0-NEXT:    move $2, $3
7564; MIPS64R6O0-NEXT:    jrc $ra
7565;
7566; MM32-LABEL: AtomicLoadAdd32_OffGt9Bit:
7567; MM32:       # %bb.0: # %entry
7568; MM32-NEXT:    lui $2, %hi(_gp_disp)
7569; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7570; MM32-NEXT:    addu $2, $2, $25
7571; MM32-NEXT:    lw $1, %got(x)($2)
7572; MM32-NEXT:    addiu $1, $1, 1024
7573; MM32-NEXT:  $BB18_1: # %entry
7574; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
7575; MM32-NEXT:    ll $2, 0($1)
7576; MM32-NEXT:    addu16 $3, $2, $4
7577; MM32-NEXT:    sc $3, 0($1)
7578; MM32-NEXT:    beqzc $3, $BB18_1
7579; MM32-NEXT:  # %bb.2: # %entry
7580; MM32-NEXT:    jrc $ra
7581;
7582; O1-LABEL: AtomicLoadAdd32_OffGt9Bit:
7583; O1:       # %bb.0: # %entry
7584; O1-NEXT:    lui $2, %hi(_gp_disp)
7585; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
7586; O1-NEXT:    addu $1, $2, $25
7587; O1-NEXT:    lw $1, %got(x)($1)
7588; O1-NEXT:    addiu $1, $1, 1024
7589; O1-NEXT:  $BB18_1: # %entry
7590; O1-NEXT:    # =>This Inner Loop Header: Depth=1
7591; O1-NEXT:    ll $2, 0($1)
7592; O1-NEXT:    addu $3, $2, $4
7593; O1-NEXT:    sc $3, 0($1)
7594; O1-NEXT:    beqz $3, $BB18_1
7595; O1-NEXT:    nop
7596; O1-NEXT:  # %bb.2: # %entry
7597; O1-NEXT:    jr $ra
7598; O1-NEXT:    nop
7599;
7600; O2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7601; O2:       # %bb.0: # %entry
7602; O2-NEXT:    lui $2, %hi(_gp_disp)
7603; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7604; O2-NEXT:    addu $1, $2, $25
7605; O2-NEXT:    lw $1, %got(x)($1)
7606; O2-NEXT:    addiu $1, $1, 1024
7607; O2-NEXT:  $BB18_1: # %entry
7608; O2-NEXT:    # =>This Inner Loop Header: Depth=1
7609; O2-NEXT:    ll $2, 0($1)
7610; O2-NEXT:    addu $3, $2, $4
7611; O2-NEXT:    sc $3, 0($1)
7612; O2-NEXT:    beqz $3, $BB18_1
7613; O2-NEXT:    nop
7614; O2-NEXT:  # %bb.2: # %entry
7615; O2-NEXT:    jr $ra
7616; O2-NEXT:    nop
7617;
7618; O3-LABEL: AtomicLoadAdd32_OffGt9Bit:
7619; O3:       # %bb.0: # %entry
7620; O3-NEXT:    lui $2, %hi(_gp_disp)
7621; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
7622; O3-NEXT:    addu $1, $2, $25
7623; O3-NEXT:    lw $1, %got(x)($1)
7624; O3-NEXT:    addiu $1, $1, 1024
7625; O3-NEXT:  $BB18_1: # %entry
7626; O3-NEXT:    # =>This Inner Loop Header: Depth=1
7627; O3-NEXT:    ll $2, 0($1)
7628; O3-NEXT:    addu $3, $2, $4
7629; O3-NEXT:    sc $3, 0($1)
7630; O3-NEXT:    beqz $3, $BB18_1
7631; O3-NEXT:    nop
7632; O3-NEXT:  # %bb.2: # %entry
7633; O3-NEXT:    jr $ra
7634; O3-NEXT:    nop
7635;
7636; MIPS32EB-LABEL: AtomicLoadAdd32_OffGt9Bit:
7637; MIPS32EB:       # %bb.0: # %entry
7638; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
7639; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
7640; MIPS32EB-NEXT:    addu $1, $2, $25
7641; MIPS32EB-NEXT:    lw $1, %got(x)($1)
7642; MIPS32EB-NEXT:    addiu $1, $1, 1024
7643; MIPS32EB-NEXT:  $BB18_1: # %entry
7644; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
7645; MIPS32EB-NEXT:    ll $2, 0($1)
7646; MIPS32EB-NEXT:    addu $3, $2, $4
7647; MIPS32EB-NEXT:    sc $3, 0($1)
7648; MIPS32EB-NEXT:    beqz $3, $BB18_1
7649; MIPS32EB-NEXT:    nop
7650; MIPS32EB-NEXT:  # %bb.2: # %entry
7651; MIPS32EB-NEXT:    jr $ra
7652; MIPS32EB-NEXT:    nop
7653entry:
7654  %0 = atomicrmw add i32* getelementptr(i32, i32* @x, i32 256), i32 %incr monotonic
7655  ret i32 %0
7656
7657}
7658