1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | \
3; RUN:   FileCheck %s -check-prefix=MIPS32
4; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O0 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | \
5; RUN:   FileCheck %s -check-prefix=MIPS32O0
6; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32r2 -relocation-model=pic -verify-machineinstrs < %s | \
7; RUN:   FileCheck %s -check-prefix=MIPS32R2
8; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32r6 -relocation-model=pic -verify-machineinstrs < %s | \
9; RUN:   FileCheck %s -check-prefix=MIPS32R6
10; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O0 --disable-machine-licm -mcpu=mips32r6 -relocation-model=pic -verify-machineinstrs < %s | \
11; RUN:   FileCheck %s -check-prefix=MIPS32R6O0
12; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips4 -relocation-model=pic -verify-machineinstrs < %s | \
13; RUN:   FileCheck %s -check-prefix=MIPS4
14; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | \
15; RUN:   FileCheck %s -check-prefix=MIPS64
16; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r2 -relocation-model=pic -verify-machineinstrs < %s | \
17; RUN:   FileCheck %s -check-prefix=MIPS64R2
18; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs < %s | \
19; RUN:   FileCheck %s -check-prefix=MIPS64R6
20; RUN: llc -mtriple=mips64-unknown-linux-gnu -O0 -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs -verify-machineinstrs < %s | \
21; RUN:   FileCheck %s -check-prefix=MIPS64R6O0
22; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32r2 -mattr=micromips -relocation-model=pic -verify-machineinstrs < %s | \
23; RUN:   FileCheck %s -check-prefix=MM32
24
25; We want to verify the produced code is well formed all optimization levels, the rest of the tests which ensure correctness.
26; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O1 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O1
27; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O2 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O2
28; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O3 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O3
29
30; Keep one big-endian check so that we don't reduce testing, but don't add more
31; since endianness doesn't affect the body of the atomic operations.
32; RUN: llc -mtriple=mips-unknown-linux-gnu   --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | \
33; RUN:   FileCheck %s -check-prefix=MIPS32EB
34
35@x = common global i32 0, align 4
36
37define i32 @AtomicLoadAdd32(i32 signext %incr) nounwind {
38; MIPS32-LABEL: AtomicLoadAdd32:
39; MIPS32:       # %bb.0: # %entry
40; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
41; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
42; MIPS32-NEXT:    addu $1, $2, $25
43; MIPS32-NEXT:    lw $1, %got(x)($1)
44; MIPS32-NEXT:  $BB0_1: # %entry
45; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
46; MIPS32-NEXT:    ll $2, 0($1)
47; MIPS32-NEXT:    addu $3, $2, $4
48; MIPS32-NEXT:    sc $3, 0($1)
49; MIPS32-NEXT:    beqz $3, $BB0_1
50; MIPS32-NEXT:    nop
51; MIPS32-NEXT:  # %bb.2: # %entry
52; MIPS32-NEXT:    jr $ra
53; MIPS32-NEXT:    nop
54;
55; MIPS32O0-LABEL: AtomicLoadAdd32:
56; MIPS32O0:       # %bb.0: # %entry
57; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
58; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
59; MIPS32O0-NEXT:    addu $1, $2, $25
60; MIPS32O0-NEXT:    lw $3, %got(x)($1)
61; MIPS32O0-NEXT:  $BB0_1: # %entry
62; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
63; MIPS32O0-NEXT:    ll $2, 0($3)
64; MIPS32O0-NEXT:    addu $1, $2, $4
65; MIPS32O0-NEXT:    sc $1, 0($3)
66; MIPS32O0-NEXT:    beqz $1, $BB0_1
67; MIPS32O0-NEXT:    nop
68; MIPS32O0-NEXT:  # %bb.2: # %entry
69; MIPS32O0-NEXT:    jr $ra
70; MIPS32O0-NEXT:    nop
71;
72; MIPS32R2-LABEL: AtomicLoadAdd32:
73; MIPS32R2:       # %bb.0: # %entry
74; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
75; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
76; MIPS32R2-NEXT:    addu $1, $2, $25
77; MIPS32R2-NEXT:    lw $1, %got(x)($1)
78; MIPS32R2-NEXT:  $BB0_1: # %entry
79; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
80; MIPS32R2-NEXT:    ll $2, 0($1)
81; MIPS32R2-NEXT:    addu $3, $2, $4
82; MIPS32R2-NEXT:    sc $3, 0($1)
83; MIPS32R2-NEXT:    beqz $3, $BB0_1
84; MIPS32R2-NEXT:    nop
85; MIPS32R2-NEXT:  # %bb.2: # %entry
86; MIPS32R2-NEXT:    jr $ra
87; MIPS32R2-NEXT:    nop
88;
89; MIPS32R6-LABEL: AtomicLoadAdd32:
90; MIPS32R6:       # %bb.0: # %entry
91; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
92; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
93; MIPS32R6-NEXT:    addu $1, $2, $25
94; MIPS32R6-NEXT:    lw $1, %got(x)($1)
95; MIPS32R6-NEXT:  $BB0_1: # %entry
96; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
97; MIPS32R6-NEXT:    ll $2, 0($1)
98; MIPS32R6-NEXT:    addu $3, $2, $4
99; MIPS32R6-NEXT:    sc $3, 0($1)
100; MIPS32R6-NEXT:    beqzc $3, $BB0_1
101; MIPS32R6-NEXT:    nop
102; MIPS32R6-NEXT:  # %bb.2: # %entry
103; MIPS32R6-NEXT:    jrc $ra
104;
105; MIPS32R6O0-LABEL: AtomicLoadAdd32:
106; MIPS32R6O0:       # %bb.0: # %entry
107; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
108; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
109; MIPS32R6O0-NEXT:    addu $1, $2, $25
110; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
111; MIPS32R6O0-NEXT:  $BB0_1: # %entry
112; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
113; MIPS32R6O0-NEXT:    ll $2, 0($3)
114; MIPS32R6O0-NEXT:    addu $1, $2, $4
115; MIPS32R6O0-NEXT:    sc $1, 0($3)
116; MIPS32R6O0-NEXT:    beqzc $1, $BB0_1
117; MIPS32R6O0-NEXT:    nop
118; MIPS32R6O0-NEXT:  # %bb.2: # %entry
119; MIPS32R6O0-NEXT:    jrc $ra
120;
121; MIPS4-LABEL: AtomicLoadAdd32:
122; MIPS4:       # %bb.0: # %entry
123; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
124; MIPS4-NEXT:    daddu $1, $1, $25
125; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
126; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
127; MIPS4-NEXT:  .LBB0_1: # %entry
128; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
129; MIPS4-NEXT:    ll $2, 0($1)
130; MIPS4-NEXT:    addu $3, $2, $4
131; MIPS4-NEXT:    sc $3, 0($1)
132; MIPS4-NEXT:    beqz $3, .LBB0_1
133; MIPS4-NEXT:    nop
134; MIPS4-NEXT:  # %bb.2: # %entry
135; MIPS4-NEXT:    jr $ra
136; MIPS4-NEXT:    nop
137;
138; MIPS64-LABEL: AtomicLoadAdd32:
139; MIPS64:       # %bb.0: # %entry
140; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
141; MIPS64-NEXT:    daddu $1, $1, $25
142; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
143; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
144; MIPS64-NEXT:  .LBB0_1: # %entry
145; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
146; MIPS64-NEXT:    ll $2, 0($1)
147; MIPS64-NEXT:    addu $3, $2, $4
148; MIPS64-NEXT:    sc $3, 0($1)
149; MIPS64-NEXT:    beqz $3, .LBB0_1
150; MIPS64-NEXT:    nop
151; MIPS64-NEXT:  # %bb.2: # %entry
152; MIPS64-NEXT:    jr $ra
153; MIPS64-NEXT:    nop
154;
155; MIPS64R2-LABEL: AtomicLoadAdd32:
156; MIPS64R2:       # %bb.0: # %entry
157; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
158; MIPS64R2-NEXT:    daddu $1, $1, $25
159; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
160; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
161; MIPS64R2-NEXT:  .LBB0_1: # %entry
162; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
163; MIPS64R2-NEXT:    ll $2, 0($1)
164; MIPS64R2-NEXT:    addu $3, $2, $4
165; MIPS64R2-NEXT:    sc $3, 0($1)
166; MIPS64R2-NEXT:    beqz $3, .LBB0_1
167; MIPS64R2-NEXT:    nop
168; MIPS64R2-NEXT:  # %bb.2: # %entry
169; MIPS64R2-NEXT:    jr $ra
170; MIPS64R2-NEXT:    nop
171;
172; MIPS64R6-LABEL: AtomicLoadAdd32:
173; MIPS64R6:       # %bb.0: # %entry
174; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
175; MIPS64R6-NEXT:    daddu $1, $1, $25
176; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
177; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
178; MIPS64R6-NEXT:  .LBB0_1: # %entry
179; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
180; MIPS64R6-NEXT:    ll $2, 0($1)
181; MIPS64R6-NEXT:    addu $3, $2, $4
182; MIPS64R6-NEXT:    sc $3, 0($1)
183; MIPS64R6-NEXT:    beqzc $3, .LBB0_1
184; MIPS64R6-NEXT:    nop
185; MIPS64R6-NEXT:  # %bb.2: # %entry
186; MIPS64R6-NEXT:    jrc $ra
187;
188; MIPS64R6O0-LABEL: AtomicLoadAdd32:
189; MIPS64R6O0:       # %bb.0: # %entry
190; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32)))
191; MIPS64R6O0-NEXT:    daddu $1, $1, $25
192; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32)))
193; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
194; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
195; MIPS64R6O0-NEXT:  .LBB0_1: # %entry
196; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
197; MIPS64R6O0-NEXT:    ll $2, 0($3)
198; MIPS64R6O0-NEXT:    addu $1, $2, $4
199; MIPS64R6O0-NEXT:    sc $1, 0($3)
200; MIPS64R6O0-NEXT:    beqzc $1, .LBB0_1
201; MIPS64R6O0-NEXT:    nop
202; MIPS64R6O0-NEXT:  # %bb.2: # %entry
203; MIPS64R6O0-NEXT:    jrc $ra
204;
205; MM32-LABEL: AtomicLoadAdd32:
206; MM32:       # %bb.0: # %entry
207; MM32-NEXT:    lui $2, %hi(_gp_disp)
208; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
209; MM32-NEXT:    addu $2, $2, $25
210; MM32-NEXT:    lw $1, %got(x)($2)
211; MM32-NEXT:  $BB0_1: # %entry
212; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
213; MM32-NEXT:    ll $2, 0($1)
214; MM32-NEXT:    addu16 $3, $2, $4
215; MM32-NEXT:    sc $3, 0($1)
216; MM32-NEXT:    beqzc $3, $BB0_1
217; MM32-NEXT:  # %bb.2: # %entry
218; MM32-NEXT:    jrc $ra
219;
220; O1-LABEL: AtomicLoadAdd32:
221; O1:       # %bb.0: # %entry
222; O1-NEXT:    lui $2, %hi(_gp_disp)
223; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
224; O1-NEXT:    addu $1, $2, $25
225; O1-NEXT:    lw $1, %got(x)($1)
226; O1-NEXT:  $BB0_1: # %entry
227; O1-NEXT:    # =>This Inner Loop Header: Depth=1
228; O1-NEXT:    ll $2, 0($1)
229; O1-NEXT:    addu $3, $2, $4
230; O1-NEXT:    sc $3, 0($1)
231; O1-NEXT:    beqz $3, $BB0_1
232; O1-NEXT:    nop
233; O1-NEXT:  # %bb.2: # %entry
234; O1-NEXT:    jr $ra
235; O1-NEXT:    nop
236;
237; O2-LABEL: AtomicLoadAdd32:
238; O2:       # %bb.0: # %entry
239; O2-NEXT:    lui $2, %hi(_gp_disp)
240; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
241; O2-NEXT:    addu $1, $2, $25
242; O2-NEXT:    lw $1, %got(x)($1)
243; O2-NEXT:  $BB0_1: # %entry
244; O2-NEXT:    # =>This Inner Loop Header: Depth=1
245; O2-NEXT:    ll $2, 0($1)
246; O2-NEXT:    addu $3, $2, $4
247; O2-NEXT:    sc $3, 0($1)
248; O2-NEXT:    beqz $3, $BB0_1
249; O2-NEXT:    nop
250; O2-NEXT:  # %bb.2: # %entry
251; O2-NEXT:    jr $ra
252; O2-NEXT:    nop
253;
254; O3-LABEL: AtomicLoadAdd32:
255; O3:       # %bb.0: # %entry
256; O3-NEXT:    lui $2, %hi(_gp_disp)
257; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
258; O3-NEXT:    addu $1, $2, $25
259; O3-NEXT:    lw $1, %got(x)($1)
260; O3-NEXT:  $BB0_1: # %entry
261; O3-NEXT:    # =>This Inner Loop Header: Depth=1
262; O3-NEXT:    ll $2, 0($1)
263; O3-NEXT:    addu $3, $2, $4
264; O3-NEXT:    sc $3, 0($1)
265; O3-NEXT:    beqz $3, $BB0_1
266; O3-NEXT:    nop
267; O3-NEXT:  # %bb.2: # %entry
268; O3-NEXT:    jr $ra
269; O3-NEXT:    nop
270;
271; MIPS32EB-LABEL: AtomicLoadAdd32:
272; MIPS32EB:       # %bb.0: # %entry
273; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
274; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
275; MIPS32EB-NEXT:    addu $1, $2, $25
276; MIPS32EB-NEXT:    lw $1, %got(x)($1)
277; MIPS32EB-NEXT:  $BB0_1: # %entry
278; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
279; MIPS32EB-NEXT:    ll $2, 0($1)
280; MIPS32EB-NEXT:    addu $3, $2, $4
281; MIPS32EB-NEXT:    sc $3, 0($1)
282; MIPS32EB-NEXT:    beqz $3, $BB0_1
283; MIPS32EB-NEXT:    nop
284; MIPS32EB-NEXT:  # %bb.2: # %entry
285; MIPS32EB-NEXT:    jr $ra
286; MIPS32EB-NEXT:    nop
287entry:
288  %0 = atomicrmw add i32* @x, i32 %incr monotonic
289  ret i32 %0
290
291}
292
293define i32 @AtomicLoadSub32(i32 signext %incr) nounwind {
294; MIPS32-LABEL: AtomicLoadSub32:
295; MIPS32:       # %bb.0: # %entry
296; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
297; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
298; MIPS32-NEXT:    addu $1, $2, $25
299; MIPS32-NEXT:    lw $1, %got(x)($1)
300; MIPS32-NEXT:  $BB1_1: # %entry
301; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
302; MIPS32-NEXT:    ll $2, 0($1)
303; MIPS32-NEXT:    subu $3, $2, $4
304; MIPS32-NEXT:    sc $3, 0($1)
305; MIPS32-NEXT:    beqz $3, $BB1_1
306; MIPS32-NEXT:    nop
307; MIPS32-NEXT:  # %bb.2: # %entry
308; MIPS32-NEXT:    jr $ra
309; MIPS32-NEXT:    nop
310;
311; MIPS32O0-LABEL: AtomicLoadSub32:
312; MIPS32O0:       # %bb.0: # %entry
313; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
314; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
315; MIPS32O0-NEXT:    addu $1, $2, $25
316; MIPS32O0-NEXT:    lw $3, %got(x)($1)
317; MIPS32O0-NEXT:  $BB1_1: # %entry
318; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
319; MIPS32O0-NEXT:    ll $2, 0($3)
320; MIPS32O0-NEXT:    subu $1, $2, $4
321; MIPS32O0-NEXT:    sc $1, 0($3)
322; MIPS32O0-NEXT:    beqz $1, $BB1_1
323; MIPS32O0-NEXT:    nop
324; MIPS32O0-NEXT:  # %bb.2: # %entry
325; MIPS32O0-NEXT:    jr $ra
326; MIPS32O0-NEXT:    nop
327;
328; MIPS32R2-LABEL: AtomicLoadSub32:
329; MIPS32R2:       # %bb.0: # %entry
330; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
331; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
332; MIPS32R2-NEXT:    addu $1, $2, $25
333; MIPS32R2-NEXT:    lw $1, %got(x)($1)
334; MIPS32R2-NEXT:  $BB1_1: # %entry
335; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
336; MIPS32R2-NEXT:    ll $2, 0($1)
337; MIPS32R2-NEXT:    subu $3, $2, $4
338; MIPS32R2-NEXT:    sc $3, 0($1)
339; MIPS32R2-NEXT:    beqz $3, $BB1_1
340; MIPS32R2-NEXT:    nop
341; MIPS32R2-NEXT:  # %bb.2: # %entry
342; MIPS32R2-NEXT:    jr $ra
343; MIPS32R2-NEXT:    nop
344;
345; MIPS32R6-LABEL: AtomicLoadSub32:
346; MIPS32R6:       # %bb.0: # %entry
347; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
348; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
349; MIPS32R6-NEXT:    addu $1, $2, $25
350; MIPS32R6-NEXT:    lw $1, %got(x)($1)
351; MIPS32R6-NEXT:  $BB1_1: # %entry
352; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
353; MIPS32R6-NEXT:    ll $2, 0($1)
354; MIPS32R6-NEXT:    subu $3, $2, $4
355; MIPS32R6-NEXT:    sc $3, 0($1)
356; MIPS32R6-NEXT:    beqzc $3, $BB1_1
357; MIPS32R6-NEXT:    nop
358; MIPS32R6-NEXT:  # %bb.2: # %entry
359; MIPS32R6-NEXT:    jrc $ra
360;
361; MIPS32R6O0-LABEL: AtomicLoadSub32:
362; MIPS32R6O0:       # %bb.0: # %entry
363; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
364; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
365; MIPS32R6O0-NEXT:    addu $1, $2, $25
366; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
367; MIPS32R6O0-NEXT:  $BB1_1: # %entry
368; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
369; MIPS32R6O0-NEXT:    ll $2, 0($3)
370; MIPS32R6O0-NEXT:    subu $1, $2, $4
371; MIPS32R6O0-NEXT:    sc $1, 0($3)
372; MIPS32R6O0-NEXT:    beqzc $1, $BB1_1
373; MIPS32R6O0-NEXT:    nop
374; MIPS32R6O0-NEXT:  # %bb.2: # %entry
375; MIPS32R6O0-NEXT:    jrc $ra
376;
377; MIPS4-LABEL: AtomicLoadSub32:
378; MIPS4:       # %bb.0: # %entry
379; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
380; MIPS4-NEXT:    daddu $1, $1, $25
381; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
382; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
383; MIPS4-NEXT:  .LBB1_1: # %entry
384; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
385; MIPS4-NEXT:    ll $2, 0($1)
386; MIPS4-NEXT:    subu $3, $2, $4
387; MIPS4-NEXT:    sc $3, 0($1)
388; MIPS4-NEXT:    beqz $3, .LBB1_1
389; MIPS4-NEXT:    nop
390; MIPS4-NEXT:  # %bb.2: # %entry
391; MIPS4-NEXT:    jr $ra
392; MIPS4-NEXT:    nop
393;
394; MIPS64-LABEL: AtomicLoadSub32:
395; MIPS64:       # %bb.0: # %entry
396; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
397; MIPS64-NEXT:    daddu $1, $1, $25
398; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
399; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
400; MIPS64-NEXT:  .LBB1_1: # %entry
401; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
402; MIPS64-NEXT:    ll $2, 0($1)
403; MIPS64-NEXT:    subu $3, $2, $4
404; MIPS64-NEXT:    sc $3, 0($1)
405; MIPS64-NEXT:    beqz $3, .LBB1_1
406; MIPS64-NEXT:    nop
407; MIPS64-NEXT:  # %bb.2: # %entry
408; MIPS64-NEXT:    jr $ra
409; MIPS64-NEXT:    nop
410;
411; MIPS64R2-LABEL: AtomicLoadSub32:
412; MIPS64R2:       # %bb.0: # %entry
413; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
414; MIPS64R2-NEXT:    daddu $1, $1, $25
415; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
416; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
417; MIPS64R2-NEXT:  .LBB1_1: # %entry
418; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
419; MIPS64R2-NEXT:    ll $2, 0($1)
420; MIPS64R2-NEXT:    subu $3, $2, $4
421; MIPS64R2-NEXT:    sc $3, 0($1)
422; MIPS64R2-NEXT:    beqz $3, .LBB1_1
423; MIPS64R2-NEXT:    nop
424; MIPS64R2-NEXT:  # %bb.2: # %entry
425; MIPS64R2-NEXT:    jr $ra
426; MIPS64R2-NEXT:    nop
427;
428; MIPS64R6-LABEL: AtomicLoadSub32:
429; MIPS64R6:       # %bb.0: # %entry
430; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
431; MIPS64R6-NEXT:    daddu $1, $1, $25
432; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
433; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
434; MIPS64R6-NEXT:  .LBB1_1: # %entry
435; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
436; MIPS64R6-NEXT:    ll $2, 0($1)
437; MIPS64R6-NEXT:    subu $3, $2, $4
438; MIPS64R6-NEXT:    sc $3, 0($1)
439; MIPS64R6-NEXT:    beqzc $3, .LBB1_1
440; MIPS64R6-NEXT:    nop
441; MIPS64R6-NEXT:  # %bb.2: # %entry
442; MIPS64R6-NEXT:    jrc $ra
443;
444; MIPS64R6O0-LABEL: AtomicLoadSub32:
445; MIPS64R6O0:       # %bb.0: # %entry
446; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub32)))
447; MIPS64R6O0-NEXT:    daddu $1, $1, $25
448; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub32)))
449; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
450; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
451; MIPS64R6O0-NEXT:  .LBB1_1: # %entry
452; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
453; MIPS64R6O0-NEXT:    ll $2, 0($3)
454; MIPS64R6O0-NEXT:    subu $1, $2, $4
455; MIPS64R6O0-NEXT:    sc $1, 0($3)
456; MIPS64R6O0-NEXT:    beqzc $1, .LBB1_1
457; MIPS64R6O0-NEXT:    nop
458; MIPS64R6O0-NEXT:  # %bb.2: # %entry
459; MIPS64R6O0-NEXT:    jrc $ra
460;
461; MM32-LABEL: AtomicLoadSub32:
462; MM32:       # %bb.0: # %entry
463; MM32-NEXT:    lui $2, %hi(_gp_disp)
464; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
465; MM32-NEXT:    addu $2, $2, $25
466; MM32-NEXT:    lw $1, %got(x)($2)
467; MM32-NEXT:  $BB1_1: # %entry
468; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
469; MM32-NEXT:    ll $2, 0($1)
470; MM32-NEXT:    subu16 $3, $2, $4
471; MM32-NEXT:    sc $3, 0($1)
472; MM32-NEXT:    beqzc $3, $BB1_1
473; MM32-NEXT:  # %bb.2: # %entry
474; MM32-NEXT:    jrc $ra
475;
476; O1-LABEL: AtomicLoadSub32:
477; O1:       # %bb.0: # %entry
478; O1-NEXT:    lui $2, %hi(_gp_disp)
479; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
480; O1-NEXT:    addu $1, $2, $25
481; O1-NEXT:    lw $1, %got(x)($1)
482; O1-NEXT:  $BB1_1: # %entry
483; O1-NEXT:    # =>This Inner Loop Header: Depth=1
484; O1-NEXT:    ll $2, 0($1)
485; O1-NEXT:    subu $3, $2, $4
486; O1-NEXT:    sc $3, 0($1)
487; O1-NEXT:    beqz $3, $BB1_1
488; O1-NEXT:    nop
489; O1-NEXT:  # %bb.2: # %entry
490; O1-NEXT:    jr $ra
491; O1-NEXT:    nop
492;
493; O2-LABEL: AtomicLoadSub32:
494; O2:       # %bb.0: # %entry
495; O2-NEXT:    lui $2, %hi(_gp_disp)
496; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
497; O2-NEXT:    addu $1, $2, $25
498; O2-NEXT:    lw $1, %got(x)($1)
499; O2-NEXT:  $BB1_1: # %entry
500; O2-NEXT:    # =>This Inner Loop Header: Depth=1
501; O2-NEXT:    ll $2, 0($1)
502; O2-NEXT:    subu $3, $2, $4
503; O2-NEXT:    sc $3, 0($1)
504; O2-NEXT:    beqz $3, $BB1_1
505; O2-NEXT:    nop
506; O2-NEXT:  # %bb.2: # %entry
507; O2-NEXT:    jr $ra
508; O2-NEXT:    nop
509;
510; O3-LABEL: AtomicLoadSub32:
511; O3:       # %bb.0: # %entry
512; O3-NEXT:    lui $2, %hi(_gp_disp)
513; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
514; O3-NEXT:    addu $1, $2, $25
515; O3-NEXT:    lw $1, %got(x)($1)
516; O3-NEXT:  $BB1_1: # %entry
517; O3-NEXT:    # =>This Inner Loop Header: Depth=1
518; O3-NEXT:    ll $2, 0($1)
519; O3-NEXT:    subu $3, $2, $4
520; O3-NEXT:    sc $3, 0($1)
521; O3-NEXT:    beqz $3, $BB1_1
522; O3-NEXT:    nop
523; O3-NEXT:  # %bb.2: # %entry
524; O3-NEXT:    jr $ra
525; O3-NEXT:    nop
526;
527; MIPS32EB-LABEL: AtomicLoadSub32:
528; MIPS32EB:       # %bb.0: # %entry
529; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
530; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
531; MIPS32EB-NEXT:    addu $1, $2, $25
532; MIPS32EB-NEXT:    lw $1, %got(x)($1)
533; MIPS32EB-NEXT:  $BB1_1: # %entry
534; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
535; MIPS32EB-NEXT:    ll $2, 0($1)
536; MIPS32EB-NEXT:    subu $3, $2, $4
537; MIPS32EB-NEXT:    sc $3, 0($1)
538; MIPS32EB-NEXT:    beqz $3, $BB1_1
539; MIPS32EB-NEXT:    nop
540; MIPS32EB-NEXT:  # %bb.2: # %entry
541; MIPS32EB-NEXT:    jr $ra
542; MIPS32EB-NEXT:    nop
543entry:
544  %0 = atomicrmw sub i32* @x, i32 %incr monotonic
545  ret i32 %0
546
547}
548
549define i32 @AtomicLoadXor32(i32 signext %incr) nounwind {
550; MIPS32-LABEL: AtomicLoadXor32:
551; MIPS32:       # %bb.0: # %entry
552; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
553; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
554; MIPS32-NEXT:    addu $1, $2, $25
555; MIPS32-NEXT:    lw $1, %got(x)($1)
556; MIPS32-NEXT:  $BB2_1: # %entry
557; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
558; MIPS32-NEXT:    ll $2, 0($1)
559; MIPS32-NEXT:    xor $3, $2, $4
560; MIPS32-NEXT:    sc $3, 0($1)
561; MIPS32-NEXT:    beqz $3, $BB2_1
562; MIPS32-NEXT:    nop
563; MIPS32-NEXT:  # %bb.2: # %entry
564; MIPS32-NEXT:    jr $ra
565; MIPS32-NEXT:    nop
566;
567; MIPS32O0-LABEL: AtomicLoadXor32:
568; MIPS32O0:       # %bb.0: # %entry
569; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
570; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
571; MIPS32O0-NEXT:    addu $1, $2, $25
572; MIPS32O0-NEXT:    lw $3, %got(x)($1)
573; MIPS32O0-NEXT:  $BB2_1: # %entry
574; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
575; MIPS32O0-NEXT:    ll $2, 0($3)
576; MIPS32O0-NEXT:    xor $1, $2, $4
577; MIPS32O0-NEXT:    sc $1, 0($3)
578; MIPS32O0-NEXT:    beqz $1, $BB2_1
579; MIPS32O0-NEXT:    nop
580; MIPS32O0-NEXT:  # %bb.2: # %entry
581; MIPS32O0-NEXT:    jr $ra
582; MIPS32O0-NEXT:    nop
583;
584; MIPS32R2-LABEL: AtomicLoadXor32:
585; MIPS32R2:       # %bb.0: # %entry
586; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
587; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
588; MIPS32R2-NEXT:    addu $1, $2, $25
589; MIPS32R2-NEXT:    lw $1, %got(x)($1)
590; MIPS32R2-NEXT:  $BB2_1: # %entry
591; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
592; MIPS32R2-NEXT:    ll $2, 0($1)
593; MIPS32R2-NEXT:    xor $3, $2, $4
594; MIPS32R2-NEXT:    sc $3, 0($1)
595; MIPS32R2-NEXT:    beqz $3, $BB2_1
596; MIPS32R2-NEXT:    nop
597; MIPS32R2-NEXT:  # %bb.2: # %entry
598; MIPS32R2-NEXT:    jr $ra
599; MIPS32R2-NEXT:    nop
600;
601; MIPS32R6-LABEL: AtomicLoadXor32:
602; MIPS32R6:       # %bb.0: # %entry
603; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
604; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
605; MIPS32R6-NEXT:    addu $1, $2, $25
606; MIPS32R6-NEXT:    lw $1, %got(x)($1)
607; MIPS32R6-NEXT:  $BB2_1: # %entry
608; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
609; MIPS32R6-NEXT:    ll $2, 0($1)
610; MIPS32R6-NEXT:    xor $3, $2, $4
611; MIPS32R6-NEXT:    sc $3, 0($1)
612; MIPS32R6-NEXT:    beqzc $3, $BB2_1
613; MIPS32R6-NEXT:    nop
614; MIPS32R6-NEXT:  # %bb.2: # %entry
615; MIPS32R6-NEXT:    jrc $ra
616;
617; MIPS32R6O0-LABEL: AtomicLoadXor32:
618; MIPS32R6O0:       # %bb.0: # %entry
619; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
620; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
621; MIPS32R6O0-NEXT:    addu $1, $2, $25
622; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
623; MIPS32R6O0-NEXT:  $BB2_1: # %entry
624; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
625; MIPS32R6O0-NEXT:    ll $2, 0($3)
626; MIPS32R6O0-NEXT:    xor $1, $2, $4
627; MIPS32R6O0-NEXT:    sc $1, 0($3)
628; MIPS32R6O0-NEXT:    beqzc $1, $BB2_1
629; MIPS32R6O0-NEXT:    nop
630; MIPS32R6O0-NEXT:  # %bb.2: # %entry
631; MIPS32R6O0-NEXT:    jrc $ra
632;
633; MIPS4-LABEL: AtomicLoadXor32:
634; MIPS4:       # %bb.0: # %entry
635; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
636; MIPS4-NEXT:    daddu $1, $1, $25
637; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
638; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
639; MIPS4-NEXT:  .LBB2_1: # %entry
640; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
641; MIPS4-NEXT:    ll $2, 0($1)
642; MIPS4-NEXT:    xor $3, $2, $4
643; MIPS4-NEXT:    sc $3, 0($1)
644; MIPS4-NEXT:    beqz $3, .LBB2_1
645; MIPS4-NEXT:    nop
646; MIPS4-NEXT:  # %bb.2: # %entry
647; MIPS4-NEXT:    jr $ra
648; MIPS4-NEXT:    nop
649;
650; MIPS64-LABEL: AtomicLoadXor32:
651; MIPS64:       # %bb.0: # %entry
652; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
653; MIPS64-NEXT:    daddu $1, $1, $25
654; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
655; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
656; MIPS64-NEXT:  .LBB2_1: # %entry
657; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
658; MIPS64-NEXT:    ll $2, 0($1)
659; MIPS64-NEXT:    xor $3, $2, $4
660; MIPS64-NEXT:    sc $3, 0($1)
661; MIPS64-NEXT:    beqz $3, .LBB2_1
662; MIPS64-NEXT:    nop
663; MIPS64-NEXT:  # %bb.2: # %entry
664; MIPS64-NEXT:    jr $ra
665; MIPS64-NEXT:    nop
666;
667; MIPS64R2-LABEL: AtomicLoadXor32:
668; MIPS64R2:       # %bb.0: # %entry
669; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
670; MIPS64R2-NEXT:    daddu $1, $1, $25
671; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
672; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
673; MIPS64R2-NEXT:  .LBB2_1: # %entry
674; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
675; MIPS64R2-NEXT:    ll $2, 0($1)
676; MIPS64R2-NEXT:    xor $3, $2, $4
677; MIPS64R2-NEXT:    sc $3, 0($1)
678; MIPS64R2-NEXT:    beqz $3, .LBB2_1
679; MIPS64R2-NEXT:    nop
680; MIPS64R2-NEXT:  # %bb.2: # %entry
681; MIPS64R2-NEXT:    jr $ra
682; MIPS64R2-NEXT:    nop
683;
684; MIPS64R6-LABEL: AtomicLoadXor32:
685; MIPS64R6:       # %bb.0: # %entry
686; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
687; MIPS64R6-NEXT:    daddu $1, $1, $25
688; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
689; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
690; MIPS64R6-NEXT:  .LBB2_1: # %entry
691; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
692; MIPS64R6-NEXT:    ll $2, 0($1)
693; MIPS64R6-NEXT:    xor $3, $2, $4
694; MIPS64R6-NEXT:    sc $3, 0($1)
695; MIPS64R6-NEXT:    beqzc $3, .LBB2_1
696; MIPS64R6-NEXT:    nop
697; MIPS64R6-NEXT:  # %bb.2: # %entry
698; MIPS64R6-NEXT:    jrc $ra
699;
700; MIPS64R6O0-LABEL: AtomicLoadXor32:
701; MIPS64R6O0:       # %bb.0: # %entry
702; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor32)))
703; MIPS64R6O0-NEXT:    daddu $1, $1, $25
704; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor32)))
705; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
706; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
707; MIPS64R6O0-NEXT:  .LBB2_1: # %entry
708; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
709; MIPS64R6O0-NEXT:    ll $2, 0($3)
710; MIPS64R6O0-NEXT:    xor $1, $2, $4
711; MIPS64R6O0-NEXT:    sc $1, 0($3)
712; MIPS64R6O0-NEXT:    beqzc $1, .LBB2_1
713; MIPS64R6O0-NEXT:    nop
714; MIPS64R6O0-NEXT:  # %bb.2: # %entry
715; MIPS64R6O0-NEXT:    jrc $ra
716;
717; MM32-LABEL: AtomicLoadXor32:
718; MM32:       # %bb.0: # %entry
719; MM32-NEXT:    lui $2, %hi(_gp_disp)
720; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
721; MM32-NEXT:    addu $2, $2, $25
722; MM32-NEXT:    lw $1, %got(x)($2)
723; MM32-NEXT:  $BB2_1: # %entry
724; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
725; MM32-NEXT:    ll $2, 0($1)
726; MM32-NEXT:    xor $3, $2, $4
727; MM32-NEXT:    sc $3, 0($1)
728; MM32-NEXT:    beqzc $3, $BB2_1
729; MM32-NEXT:  # %bb.2: # %entry
730; MM32-NEXT:    jrc $ra
731;
732; O1-LABEL: AtomicLoadXor32:
733; O1:       # %bb.0: # %entry
734; O1-NEXT:    lui $2, %hi(_gp_disp)
735; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
736; O1-NEXT:    addu $1, $2, $25
737; O1-NEXT:    lw $1, %got(x)($1)
738; O1-NEXT:  $BB2_1: # %entry
739; O1-NEXT:    # =>This Inner Loop Header: Depth=1
740; O1-NEXT:    ll $2, 0($1)
741; O1-NEXT:    xor $3, $2, $4
742; O1-NEXT:    sc $3, 0($1)
743; O1-NEXT:    beqz $3, $BB2_1
744; O1-NEXT:    nop
745; O1-NEXT:  # %bb.2: # %entry
746; O1-NEXT:    jr $ra
747; O1-NEXT:    nop
748;
749; O2-LABEL: AtomicLoadXor32:
750; O2:       # %bb.0: # %entry
751; O2-NEXT:    lui $2, %hi(_gp_disp)
752; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
753; O2-NEXT:    addu $1, $2, $25
754; O2-NEXT:    lw $1, %got(x)($1)
755; O2-NEXT:  $BB2_1: # %entry
756; O2-NEXT:    # =>This Inner Loop Header: Depth=1
757; O2-NEXT:    ll $2, 0($1)
758; O2-NEXT:    xor $3, $2, $4
759; O2-NEXT:    sc $3, 0($1)
760; O2-NEXT:    beqz $3, $BB2_1
761; O2-NEXT:    nop
762; O2-NEXT:  # %bb.2: # %entry
763; O2-NEXT:    jr $ra
764; O2-NEXT:    nop
765;
766; O3-LABEL: AtomicLoadXor32:
767; O3:       # %bb.0: # %entry
768; O3-NEXT:    lui $2, %hi(_gp_disp)
769; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
770; O3-NEXT:    addu $1, $2, $25
771; O3-NEXT:    lw $1, %got(x)($1)
772; O3-NEXT:  $BB2_1: # %entry
773; O3-NEXT:    # =>This Inner Loop Header: Depth=1
774; O3-NEXT:    ll $2, 0($1)
775; O3-NEXT:    xor $3, $2, $4
776; O3-NEXT:    sc $3, 0($1)
777; O3-NEXT:    beqz $3, $BB2_1
778; O3-NEXT:    nop
779; O3-NEXT:  # %bb.2: # %entry
780; O3-NEXT:    jr $ra
781; O3-NEXT:    nop
782;
783; MIPS32EB-LABEL: AtomicLoadXor32:
784; MIPS32EB:       # %bb.0: # %entry
785; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
786; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
787; MIPS32EB-NEXT:    addu $1, $2, $25
788; MIPS32EB-NEXT:    lw $1, %got(x)($1)
789; MIPS32EB-NEXT:  $BB2_1: # %entry
790; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
791; MIPS32EB-NEXT:    ll $2, 0($1)
792; MIPS32EB-NEXT:    xor $3, $2, $4
793; MIPS32EB-NEXT:    sc $3, 0($1)
794; MIPS32EB-NEXT:    beqz $3, $BB2_1
795; MIPS32EB-NEXT:    nop
796; MIPS32EB-NEXT:  # %bb.2: # %entry
797; MIPS32EB-NEXT:    jr $ra
798; MIPS32EB-NEXT:    nop
799entry:
800  %0 = atomicrmw xor i32* @x, i32 %incr monotonic
801  ret i32 %0
802}
803
804define i32 @AtomicLoadOr32(i32 signext %incr) nounwind {
805; MIPS32-LABEL: AtomicLoadOr32:
806; MIPS32:       # %bb.0: # %entry
807; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
808; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
809; MIPS32-NEXT:    addu $1, $2, $25
810; MIPS32-NEXT:    lw $1, %got(x)($1)
811; MIPS32-NEXT:  $BB3_1: # %entry
812; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
813; MIPS32-NEXT:    ll $2, 0($1)
814; MIPS32-NEXT:    or $3, $2, $4
815; MIPS32-NEXT:    sc $3, 0($1)
816; MIPS32-NEXT:    beqz $3, $BB3_1
817; MIPS32-NEXT:    nop
818; MIPS32-NEXT:  # %bb.2: # %entry
819; MIPS32-NEXT:    jr $ra
820; MIPS32-NEXT:    nop
821;
822; MIPS32O0-LABEL: AtomicLoadOr32:
823; MIPS32O0:       # %bb.0: # %entry
824; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
825; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
826; MIPS32O0-NEXT:    addu $1, $2, $25
827; MIPS32O0-NEXT:    lw $3, %got(x)($1)
828; MIPS32O0-NEXT:  $BB3_1: # %entry
829; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
830; MIPS32O0-NEXT:    ll $2, 0($3)
831; MIPS32O0-NEXT:    or $1, $2, $4
832; MIPS32O0-NEXT:    sc $1, 0($3)
833; MIPS32O0-NEXT:    beqz $1, $BB3_1
834; MIPS32O0-NEXT:    nop
835; MIPS32O0-NEXT:  # %bb.2: # %entry
836; MIPS32O0-NEXT:    jr $ra
837; MIPS32O0-NEXT:    nop
838;
839; MIPS32R2-LABEL: AtomicLoadOr32:
840; MIPS32R2:       # %bb.0: # %entry
841; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
842; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
843; MIPS32R2-NEXT:    addu $1, $2, $25
844; MIPS32R2-NEXT:    lw $1, %got(x)($1)
845; MIPS32R2-NEXT:  $BB3_1: # %entry
846; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
847; MIPS32R2-NEXT:    ll $2, 0($1)
848; MIPS32R2-NEXT:    or $3, $2, $4
849; MIPS32R2-NEXT:    sc $3, 0($1)
850; MIPS32R2-NEXT:    beqz $3, $BB3_1
851; MIPS32R2-NEXT:    nop
852; MIPS32R2-NEXT:  # %bb.2: # %entry
853; MIPS32R2-NEXT:    jr $ra
854; MIPS32R2-NEXT:    nop
855;
856; MIPS32R6-LABEL: AtomicLoadOr32:
857; MIPS32R6:       # %bb.0: # %entry
858; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
859; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
860; MIPS32R6-NEXT:    addu $1, $2, $25
861; MIPS32R6-NEXT:    lw $1, %got(x)($1)
862; MIPS32R6-NEXT:  $BB3_1: # %entry
863; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
864; MIPS32R6-NEXT:    ll $2, 0($1)
865; MIPS32R6-NEXT:    or $3, $2, $4
866; MIPS32R6-NEXT:    sc $3, 0($1)
867; MIPS32R6-NEXT:    beqzc $3, $BB3_1
868; MIPS32R6-NEXT:    nop
869; MIPS32R6-NEXT:  # %bb.2: # %entry
870; MIPS32R6-NEXT:    jrc $ra
871;
872; MIPS32R6O0-LABEL: AtomicLoadOr32:
873; MIPS32R6O0:       # %bb.0: # %entry
874; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
875; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
876; MIPS32R6O0-NEXT:    addu $1, $2, $25
877; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
878; MIPS32R6O0-NEXT:  $BB3_1: # %entry
879; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
880; MIPS32R6O0-NEXT:    ll $2, 0($3)
881; MIPS32R6O0-NEXT:    or $1, $2, $4
882; MIPS32R6O0-NEXT:    sc $1, 0($3)
883; MIPS32R6O0-NEXT:    beqzc $1, $BB3_1
884; MIPS32R6O0-NEXT:    nop
885; MIPS32R6O0-NEXT:  # %bb.2: # %entry
886; MIPS32R6O0-NEXT:    jrc $ra
887;
888; MIPS4-LABEL: AtomicLoadOr32:
889; MIPS4:       # %bb.0: # %entry
890; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
891; MIPS4-NEXT:    daddu $1, $1, $25
892; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
893; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
894; MIPS4-NEXT:  .LBB3_1: # %entry
895; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
896; MIPS4-NEXT:    ll $2, 0($1)
897; MIPS4-NEXT:    or $3, $2, $4
898; MIPS4-NEXT:    sc $3, 0($1)
899; MIPS4-NEXT:    beqz $3, .LBB3_1
900; MIPS4-NEXT:    nop
901; MIPS4-NEXT:  # %bb.2: # %entry
902; MIPS4-NEXT:    jr $ra
903; MIPS4-NEXT:    nop
904;
905; MIPS64-LABEL: AtomicLoadOr32:
906; MIPS64:       # %bb.0: # %entry
907; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
908; MIPS64-NEXT:    daddu $1, $1, $25
909; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
910; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
911; MIPS64-NEXT:  .LBB3_1: # %entry
912; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
913; MIPS64-NEXT:    ll $2, 0($1)
914; MIPS64-NEXT:    or $3, $2, $4
915; MIPS64-NEXT:    sc $3, 0($1)
916; MIPS64-NEXT:    beqz $3, .LBB3_1
917; MIPS64-NEXT:    nop
918; MIPS64-NEXT:  # %bb.2: # %entry
919; MIPS64-NEXT:    jr $ra
920; MIPS64-NEXT:    nop
921;
922; MIPS64R2-LABEL: AtomicLoadOr32:
923; MIPS64R2:       # %bb.0: # %entry
924; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
925; MIPS64R2-NEXT:    daddu $1, $1, $25
926; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
927; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
928; MIPS64R2-NEXT:  .LBB3_1: # %entry
929; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
930; MIPS64R2-NEXT:    ll $2, 0($1)
931; MIPS64R2-NEXT:    or $3, $2, $4
932; MIPS64R2-NEXT:    sc $3, 0($1)
933; MIPS64R2-NEXT:    beqz $3, .LBB3_1
934; MIPS64R2-NEXT:    nop
935; MIPS64R2-NEXT:  # %bb.2: # %entry
936; MIPS64R2-NEXT:    jr $ra
937; MIPS64R2-NEXT:    nop
938;
939; MIPS64R6-LABEL: AtomicLoadOr32:
940; MIPS64R6:       # %bb.0: # %entry
941; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
942; MIPS64R6-NEXT:    daddu $1, $1, $25
943; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
944; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
945; MIPS64R6-NEXT:  .LBB3_1: # %entry
946; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
947; MIPS64R6-NEXT:    ll $2, 0($1)
948; MIPS64R6-NEXT:    or $3, $2, $4
949; MIPS64R6-NEXT:    sc $3, 0($1)
950; MIPS64R6-NEXT:    beqzc $3, .LBB3_1
951; MIPS64R6-NEXT:    nop
952; MIPS64R6-NEXT:  # %bb.2: # %entry
953; MIPS64R6-NEXT:    jrc $ra
954;
955; MIPS64R6O0-LABEL: AtomicLoadOr32:
956; MIPS64R6O0:       # %bb.0: # %entry
957; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr32)))
958; MIPS64R6O0-NEXT:    daddu $1, $1, $25
959; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr32)))
960; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
961; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
962; MIPS64R6O0-NEXT:  .LBB3_1: # %entry
963; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
964; MIPS64R6O0-NEXT:    ll $2, 0($3)
965; MIPS64R6O0-NEXT:    or $1, $2, $4
966; MIPS64R6O0-NEXT:    sc $1, 0($3)
967; MIPS64R6O0-NEXT:    beqzc $1, .LBB3_1
968; MIPS64R6O0-NEXT:    nop
969; MIPS64R6O0-NEXT:  # %bb.2: # %entry
970; MIPS64R6O0-NEXT:    jrc $ra
971;
972; MM32-LABEL: AtomicLoadOr32:
973; MM32:       # %bb.0: # %entry
974; MM32-NEXT:    lui $2, %hi(_gp_disp)
975; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
976; MM32-NEXT:    addu $2, $2, $25
977; MM32-NEXT:    lw $1, %got(x)($2)
978; MM32-NEXT:  $BB3_1: # %entry
979; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
980; MM32-NEXT:    ll $2, 0($1)
981; MM32-NEXT:    or $3, $2, $4
982; MM32-NEXT:    sc $3, 0($1)
983; MM32-NEXT:    beqzc $3, $BB3_1
984; MM32-NEXT:  # %bb.2: # %entry
985; MM32-NEXT:    jrc $ra
986;
987; O1-LABEL: AtomicLoadOr32:
988; O1:       # %bb.0: # %entry
989; O1-NEXT:    lui $2, %hi(_gp_disp)
990; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
991; O1-NEXT:    addu $1, $2, $25
992; O1-NEXT:    lw $1, %got(x)($1)
993; O1-NEXT:  $BB3_1: # %entry
994; O1-NEXT:    # =>This Inner Loop Header: Depth=1
995; O1-NEXT:    ll $2, 0($1)
996; O1-NEXT:    or $3, $2, $4
997; O1-NEXT:    sc $3, 0($1)
998; O1-NEXT:    beqz $3, $BB3_1
999; O1-NEXT:    nop
1000; O1-NEXT:  # %bb.2: # %entry
1001; O1-NEXT:    jr $ra
1002; O1-NEXT:    nop
1003;
1004; O2-LABEL: AtomicLoadOr32:
1005; O2:       # %bb.0: # %entry
1006; O2-NEXT:    lui $2, %hi(_gp_disp)
1007; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1008; O2-NEXT:    addu $1, $2, $25
1009; O2-NEXT:    lw $1, %got(x)($1)
1010; O2-NEXT:  $BB3_1: # %entry
1011; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1012; O2-NEXT:    ll $2, 0($1)
1013; O2-NEXT:    or $3, $2, $4
1014; O2-NEXT:    sc $3, 0($1)
1015; O2-NEXT:    beqz $3, $BB3_1
1016; O2-NEXT:    nop
1017; O2-NEXT:  # %bb.2: # %entry
1018; O2-NEXT:    jr $ra
1019; O2-NEXT:    nop
1020;
1021; O3-LABEL: AtomicLoadOr32:
1022; O3:       # %bb.0: # %entry
1023; O3-NEXT:    lui $2, %hi(_gp_disp)
1024; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1025; O3-NEXT:    addu $1, $2, $25
1026; O3-NEXT:    lw $1, %got(x)($1)
1027; O3-NEXT:  $BB3_1: # %entry
1028; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1029; O3-NEXT:    ll $2, 0($1)
1030; O3-NEXT:    or $3, $2, $4
1031; O3-NEXT:    sc $3, 0($1)
1032; O3-NEXT:    beqz $3, $BB3_1
1033; O3-NEXT:    nop
1034; O3-NEXT:  # %bb.2: # %entry
1035; O3-NEXT:    jr $ra
1036; O3-NEXT:    nop
1037;
1038; MIPS32EB-LABEL: AtomicLoadOr32:
1039; MIPS32EB:       # %bb.0: # %entry
1040; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1041; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1042; MIPS32EB-NEXT:    addu $1, $2, $25
1043; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1044; MIPS32EB-NEXT:  $BB3_1: # %entry
1045; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1046; MIPS32EB-NEXT:    ll $2, 0($1)
1047; MIPS32EB-NEXT:    or $3, $2, $4
1048; MIPS32EB-NEXT:    sc $3, 0($1)
1049; MIPS32EB-NEXT:    beqz $3, $BB3_1
1050; MIPS32EB-NEXT:    nop
1051; MIPS32EB-NEXT:  # %bb.2: # %entry
1052; MIPS32EB-NEXT:    jr $ra
1053; MIPS32EB-NEXT:    nop
1054entry:
1055  %0 = atomicrmw or i32* @x, i32 %incr monotonic
1056  ret i32 %0
1057}
1058
1059define i32 @AtomicLoadAnd32(i32 signext %incr) nounwind {
1060; MIPS32-LABEL: AtomicLoadAnd32:
1061; MIPS32:       # %bb.0: # %entry
1062; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1063; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1064; MIPS32-NEXT:    addu $1, $2, $25
1065; MIPS32-NEXT:    lw $1, %got(x)($1)
1066; MIPS32-NEXT:  $BB4_1: # %entry
1067; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1068; MIPS32-NEXT:    ll $2, 0($1)
1069; MIPS32-NEXT:    and $3, $2, $4
1070; MIPS32-NEXT:    sc $3, 0($1)
1071; MIPS32-NEXT:    beqz $3, $BB4_1
1072; MIPS32-NEXT:    nop
1073; MIPS32-NEXT:  # %bb.2: # %entry
1074; MIPS32-NEXT:    jr $ra
1075; MIPS32-NEXT:    nop
1076;
1077; MIPS32O0-LABEL: AtomicLoadAnd32:
1078; MIPS32O0:       # %bb.0: # %entry
1079; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1080; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1081; MIPS32O0-NEXT:    addu $1, $2, $25
1082; MIPS32O0-NEXT:    lw $3, %got(x)($1)
1083; MIPS32O0-NEXT:  $BB4_1: # %entry
1084; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1085; MIPS32O0-NEXT:    ll $2, 0($3)
1086; MIPS32O0-NEXT:    and $1, $2, $4
1087; MIPS32O0-NEXT:    sc $1, 0($3)
1088; MIPS32O0-NEXT:    beqz $1, $BB4_1
1089; MIPS32O0-NEXT:    nop
1090; MIPS32O0-NEXT:  # %bb.2: # %entry
1091; MIPS32O0-NEXT:    jr $ra
1092; MIPS32O0-NEXT:    nop
1093;
1094; MIPS32R2-LABEL: AtomicLoadAnd32:
1095; MIPS32R2:       # %bb.0: # %entry
1096; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1097; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1098; MIPS32R2-NEXT:    addu $1, $2, $25
1099; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1100; MIPS32R2-NEXT:  $BB4_1: # %entry
1101; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1102; MIPS32R2-NEXT:    ll $2, 0($1)
1103; MIPS32R2-NEXT:    and $3, $2, $4
1104; MIPS32R2-NEXT:    sc $3, 0($1)
1105; MIPS32R2-NEXT:    beqz $3, $BB4_1
1106; MIPS32R2-NEXT:    nop
1107; MIPS32R2-NEXT:  # %bb.2: # %entry
1108; MIPS32R2-NEXT:    jr $ra
1109; MIPS32R2-NEXT:    nop
1110;
1111; MIPS32R6-LABEL: AtomicLoadAnd32:
1112; MIPS32R6:       # %bb.0: # %entry
1113; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1114; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1115; MIPS32R6-NEXT:    addu $1, $2, $25
1116; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1117; MIPS32R6-NEXT:  $BB4_1: # %entry
1118; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1119; MIPS32R6-NEXT:    ll $2, 0($1)
1120; MIPS32R6-NEXT:    and $3, $2, $4
1121; MIPS32R6-NEXT:    sc $3, 0($1)
1122; MIPS32R6-NEXT:    beqzc $3, $BB4_1
1123; MIPS32R6-NEXT:    nop
1124; MIPS32R6-NEXT:  # %bb.2: # %entry
1125; MIPS32R6-NEXT:    jrc $ra
1126;
1127; MIPS32R6O0-LABEL: AtomicLoadAnd32:
1128; MIPS32R6O0:       # %bb.0: # %entry
1129; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1130; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1131; MIPS32R6O0-NEXT:    addu $1, $2, $25
1132; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
1133; MIPS32R6O0-NEXT:  $BB4_1: # %entry
1134; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1135; MIPS32R6O0-NEXT:    ll $2, 0($3)
1136; MIPS32R6O0-NEXT:    and $1, $2, $4
1137; MIPS32R6O0-NEXT:    sc $1, 0($3)
1138; MIPS32R6O0-NEXT:    beqzc $1, $BB4_1
1139; MIPS32R6O0-NEXT:    nop
1140; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1141; MIPS32R6O0-NEXT:    jrc $ra
1142;
1143; MIPS4-LABEL: AtomicLoadAnd32:
1144; MIPS4:       # %bb.0: # %entry
1145; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1146; MIPS4-NEXT:    daddu $1, $1, $25
1147; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1148; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1149; MIPS4-NEXT:  .LBB4_1: # %entry
1150; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1151; MIPS4-NEXT:    ll $2, 0($1)
1152; MIPS4-NEXT:    and $3, $2, $4
1153; MIPS4-NEXT:    sc $3, 0($1)
1154; MIPS4-NEXT:    beqz $3, .LBB4_1
1155; MIPS4-NEXT:    nop
1156; MIPS4-NEXT:  # %bb.2: # %entry
1157; MIPS4-NEXT:    jr $ra
1158; MIPS4-NEXT:    nop
1159;
1160; MIPS64-LABEL: AtomicLoadAnd32:
1161; MIPS64:       # %bb.0: # %entry
1162; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1163; MIPS64-NEXT:    daddu $1, $1, $25
1164; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1165; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1166; MIPS64-NEXT:  .LBB4_1: # %entry
1167; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1168; MIPS64-NEXT:    ll $2, 0($1)
1169; MIPS64-NEXT:    and $3, $2, $4
1170; MIPS64-NEXT:    sc $3, 0($1)
1171; MIPS64-NEXT:    beqz $3, .LBB4_1
1172; MIPS64-NEXT:    nop
1173; MIPS64-NEXT:  # %bb.2: # %entry
1174; MIPS64-NEXT:    jr $ra
1175; MIPS64-NEXT:    nop
1176;
1177; MIPS64R2-LABEL: AtomicLoadAnd32:
1178; MIPS64R2:       # %bb.0: # %entry
1179; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1180; MIPS64R2-NEXT:    daddu $1, $1, $25
1181; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1182; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1183; MIPS64R2-NEXT:  .LBB4_1: # %entry
1184; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1185; MIPS64R2-NEXT:    ll $2, 0($1)
1186; MIPS64R2-NEXT:    and $3, $2, $4
1187; MIPS64R2-NEXT:    sc $3, 0($1)
1188; MIPS64R2-NEXT:    beqz $3, .LBB4_1
1189; MIPS64R2-NEXT:    nop
1190; MIPS64R2-NEXT:  # %bb.2: # %entry
1191; MIPS64R2-NEXT:    jr $ra
1192; MIPS64R2-NEXT:    nop
1193;
1194; MIPS64R6-LABEL: AtomicLoadAnd32:
1195; MIPS64R6:       # %bb.0: # %entry
1196; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1197; MIPS64R6-NEXT:    daddu $1, $1, $25
1198; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1199; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1200; MIPS64R6-NEXT:  .LBB4_1: # %entry
1201; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1202; MIPS64R6-NEXT:    ll $2, 0($1)
1203; MIPS64R6-NEXT:    and $3, $2, $4
1204; MIPS64R6-NEXT:    sc $3, 0($1)
1205; MIPS64R6-NEXT:    beqzc $3, .LBB4_1
1206; MIPS64R6-NEXT:    nop
1207; MIPS64R6-NEXT:  # %bb.2: # %entry
1208; MIPS64R6-NEXT:    jrc $ra
1209;
1210; MIPS64R6O0-LABEL: AtomicLoadAnd32:
1211; MIPS64R6O0:       # %bb.0: # %entry
1212; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd32)))
1213; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1214; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd32)))
1215; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
1216; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
1217; MIPS64R6O0-NEXT:  .LBB4_1: # %entry
1218; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1219; MIPS64R6O0-NEXT:    ll $2, 0($3)
1220; MIPS64R6O0-NEXT:    and $1, $2, $4
1221; MIPS64R6O0-NEXT:    sc $1, 0($3)
1222; MIPS64R6O0-NEXT:    beqzc $1, .LBB4_1
1223; MIPS64R6O0-NEXT:    nop
1224; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1225; MIPS64R6O0-NEXT:    jrc $ra
1226;
1227; MM32-LABEL: AtomicLoadAnd32:
1228; MM32:       # %bb.0: # %entry
1229; MM32-NEXT:    lui $2, %hi(_gp_disp)
1230; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1231; MM32-NEXT:    addu $2, $2, $25
1232; MM32-NEXT:    lw $1, %got(x)($2)
1233; MM32-NEXT:  $BB4_1: # %entry
1234; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1235; MM32-NEXT:    ll $2, 0($1)
1236; MM32-NEXT:    and $3, $2, $4
1237; MM32-NEXT:    sc $3, 0($1)
1238; MM32-NEXT:    beqzc $3, $BB4_1
1239; MM32-NEXT:  # %bb.2: # %entry
1240; MM32-NEXT:    jrc $ra
1241;
1242; O1-LABEL: AtomicLoadAnd32:
1243; O1:       # %bb.0: # %entry
1244; O1-NEXT:    lui $2, %hi(_gp_disp)
1245; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1246; O1-NEXT:    addu $1, $2, $25
1247; O1-NEXT:    lw $1, %got(x)($1)
1248; O1-NEXT:  $BB4_1: # %entry
1249; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1250; O1-NEXT:    ll $2, 0($1)
1251; O1-NEXT:    and $3, $2, $4
1252; O1-NEXT:    sc $3, 0($1)
1253; O1-NEXT:    beqz $3, $BB4_1
1254; O1-NEXT:    nop
1255; O1-NEXT:  # %bb.2: # %entry
1256; O1-NEXT:    jr $ra
1257; O1-NEXT:    nop
1258;
1259; O2-LABEL: AtomicLoadAnd32:
1260; O2:       # %bb.0: # %entry
1261; O2-NEXT:    lui $2, %hi(_gp_disp)
1262; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1263; O2-NEXT:    addu $1, $2, $25
1264; O2-NEXT:    lw $1, %got(x)($1)
1265; O2-NEXT:  $BB4_1: # %entry
1266; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1267; O2-NEXT:    ll $2, 0($1)
1268; O2-NEXT:    and $3, $2, $4
1269; O2-NEXT:    sc $3, 0($1)
1270; O2-NEXT:    beqz $3, $BB4_1
1271; O2-NEXT:    nop
1272; O2-NEXT:  # %bb.2: # %entry
1273; O2-NEXT:    jr $ra
1274; O2-NEXT:    nop
1275;
1276; O3-LABEL: AtomicLoadAnd32:
1277; O3:       # %bb.0: # %entry
1278; O3-NEXT:    lui $2, %hi(_gp_disp)
1279; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1280; O3-NEXT:    addu $1, $2, $25
1281; O3-NEXT:    lw $1, %got(x)($1)
1282; O3-NEXT:  $BB4_1: # %entry
1283; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1284; O3-NEXT:    ll $2, 0($1)
1285; O3-NEXT:    and $3, $2, $4
1286; O3-NEXT:    sc $3, 0($1)
1287; O3-NEXT:    beqz $3, $BB4_1
1288; O3-NEXT:    nop
1289; O3-NEXT:  # %bb.2: # %entry
1290; O3-NEXT:    jr $ra
1291; O3-NEXT:    nop
1292;
1293; MIPS32EB-LABEL: AtomicLoadAnd32:
1294; MIPS32EB:       # %bb.0: # %entry
1295; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1296; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1297; MIPS32EB-NEXT:    addu $1, $2, $25
1298; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1299; MIPS32EB-NEXT:  $BB4_1: # %entry
1300; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1301; MIPS32EB-NEXT:    ll $2, 0($1)
1302; MIPS32EB-NEXT:    and $3, $2, $4
1303; MIPS32EB-NEXT:    sc $3, 0($1)
1304; MIPS32EB-NEXT:    beqz $3, $BB4_1
1305; MIPS32EB-NEXT:    nop
1306; MIPS32EB-NEXT:  # %bb.2: # %entry
1307; MIPS32EB-NEXT:    jr $ra
1308; MIPS32EB-NEXT:    nop
1309entry:
1310  %0 = atomicrmw and i32* @x, i32 %incr monotonic
1311  ret i32 %0
1312}
1313
1314define i32 @AtomicLoadNand32(i32 signext %incr) nounwind {
1315; MIPS32-LABEL: AtomicLoadNand32:
1316; MIPS32:       # %bb.0: # %entry
1317; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1318; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1319; MIPS32-NEXT:    addu $1, $2, $25
1320; MIPS32-NEXT:    lw $1, %got(x)($1)
1321; MIPS32-NEXT:  $BB5_1: # %entry
1322; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1323; MIPS32-NEXT:    ll $2, 0($1)
1324; MIPS32-NEXT:    and $3, $2, $4
1325; MIPS32-NEXT:    nor $3, $zero, $3
1326; MIPS32-NEXT:    sc $3, 0($1)
1327; MIPS32-NEXT:    beqz $3, $BB5_1
1328; MIPS32-NEXT:    nop
1329; MIPS32-NEXT:  # %bb.2: # %entry
1330; MIPS32-NEXT:    jr $ra
1331; MIPS32-NEXT:    nop
1332;
1333; MIPS32O0-LABEL: AtomicLoadNand32:
1334; MIPS32O0:       # %bb.0: # %entry
1335; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1336; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1337; MIPS32O0-NEXT:    addu $1, $2, $25
1338; MIPS32O0-NEXT:    lw $3, %got(x)($1)
1339; MIPS32O0-NEXT:  $BB5_1: # %entry
1340; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1341; MIPS32O0-NEXT:    ll $2, 0($3)
1342; MIPS32O0-NEXT:    and $1, $2, $4
1343; MIPS32O0-NEXT:    nor $1, $zero, $1
1344; MIPS32O0-NEXT:    sc $1, 0($3)
1345; MIPS32O0-NEXT:    beqz $1, $BB5_1
1346; MIPS32O0-NEXT:    nop
1347; MIPS32O0-NEXT:  # %bb.2: # %entry
1348; MIPS32O0-NEXT:    jr $ra
1349; MIPS32O0-NEXT:    nop
1350;
1351; MIPS32R2-LABEL: AtomicLoadNand32:
1352; MIPS32R2:       # %bb.0: # %entry
1353; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1354; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1355; MIPS32R2-NEXT:    addu $1, $2, $25
1356; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1357; MIPS32R2-NEXT:  $BB5_1: # %entry
1358; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1359; MIPS32R2-NEXT:    ll $2, 0($1)
1360; MIPS32R2-NEXT:    and $3, $2, $4
1361; MIPS32R2-NEXT:    nor $3, $zero, $3
1362; MIPS32R2-NEXT:    sc $3, 0($1)
1363; MIPS32R2-NEXT:    beqz $3, $BB5_1
1364; MIPS32R2-NEXT:    nop
1365; MIPS32R2-NEXT:  # %bb.2: # %entry
1366; MIPS32R2-NEXT:    jr $ra
1367; MIPS32R2-NEXT:    nop
1368;
1369; MIPS32R6-LABEL: AtomicLoadNand32:
1370; MIPS32R6:       # %bb.0: # %entry
1371; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1372; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1373; MIPS32R6-NEXT:    addu $1, $2, $25
1374; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1375; MIPS32R6-NEXT:  $BB5_1: # %entry
1376; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1377; MIPS32R6-NEXT:    ll $2, 0($1)
1378; MIPS32R6-NEXT:    and $3, $2, $4
1379; MIPS32R6-NEXT:    nor $3, $zero, $3
1380; MIPS32R6-NEXT:    sc $3, 0($1)
1381; MIPS32R6-NEXT:    beqzc $3, $BB5_1
1382; MIPS32R6-NEXT:    nop
1383; MIPS32R6-NEXT:  # %bb.2: # %entry
1384; MIPS32R6-NEXT:    jrc $ra
1385;
1386; MIPS32R6O0-LABEL: AtomicLoadNand32:
1387; MIPS32R6O0:       # %bb.0: # %entry
1388; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1389; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1390; MIPS32R6O0-NEXT:    addu $1, $2, $25
1391; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
1392; MIPS32R6O0-NEXT:  $BB5_1: # %entry
1393; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1394; MIPS32R6O0-NEXT:    ll $2, 0($3)
1395; MIPS32R6O0-NEXT:    and $1, $2, $4
1396; MIPS32R6O0-NEXT:    nor $1, $zero, $1
1397; MIPS32R6O0-NEXT:    sc $1, 0($3)
1398; MIPS32R6O0-NEXT:    beqzc $1, $BB5_1
1399; MIPS32R6O0-NEXT:    nop
1400; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1401; MIPS32R6O0-NEXT:    jrc $ra
1402;
1403; MIPS4-LABEL: AtomicLoadNand32:
1404; MIPS4:       # %bb.0: # %entry
1405; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1406; MIPS4-NEXT:    daddu $1, $1, $25
1407; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1408; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1409; MIPS4-NEXT:  .LBB5_1: # %entry
1410; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1411; MIPS4-NEXT:    ll $2, 0($1)
1412; MIPS4-NEXT:    and $3, $2, $4
1413; MIPS4-NEXT:    nor $3, $zero, $3
1414; MIPS4-NEXT:    sc $3, 0($1)
1415; MIPS4-NEXT:    beqz $3, .LBB5_1
1416; MIPS4-NEXT:    nop
1417; MIPS4-NEXT:  # %bb.2: # %entry
1418; MIPS4-NEXT:    jr $ra
1419; MIPS4-NEXT:    nop
1420;
1421; MIPS64-LABEL: AtomicLoadNand32:
1422; MIPS64:       # %bb.0: # %entry
1423; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1424; MIPS64-NEXT:    daddu $1, $1, $25
1425; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1426; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1427; MIPS64-NEXT:  .LBB5_1: # %entry
1428; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1429; MIPS64-NEXT:    ll $2, 0($1)
1430; MIPS64-NEXT:    and $3, $2, $4
1431; MIPS64-NEXT:    nor $3, $zero, $3
1432; MIPS64-NEXT:    sc $3, 0($1)
1433; MIPS64-NEXT:    beqz $3, .LBB5_1
1434; MIPS64-NEXT:    nop
1435; MIPS64-NEXT:  # %bb.2: # %entry
1436; MIPS64-NEXT:    jr $ra
1437; MIPS64-NEXT:    nop
1438;
1439; MIPS64R2-LABEL: AtomicLoadNand32:
1440; MIPS64R2:       # %bb.0: # %entry
1441; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1442; MIPS64R2-NEXT:    daddu $1, $1, $25
1443; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1444; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1445; MIPS64R2-NEXT:  .LBB5_1: # %entry
1446; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1447; MIPS64R2-NEXT:    ll $2, 0($1)
1448; MIPS64R2-NEXT:    and $3, $2, $4
1449; MIPS64R2-NEXT:    nor $3, $zero, $3
1450; MIPS64R2-NEXT:    sc $3, 0($1)
1451; MIPS64R2-NEXT:    beqz $3, .LBB5_1
1452; MIPS64R2-NEXT:    nop
1453; MIPS64R2-NEXT:  # %bb.2: # %entry
1454; MIPS64R2-NEXT:    jr $ra
1455; MIPS64R2-NEXT:    nop
1456;
1457; MIPS64R6-LABEL: AtomicLoadNand32:
1458; MIPS64R6:       # %bb.0: # %entry
1459; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1460; MIPS64R6-NEXT:    daddu $1, $1, $25
1461; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1462; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1463; MIPS64R6-NEXT:  .LBB5_1: # %entry
1464; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1465; MIPS64R6-NEXT:    ll $2, 0($1)
1466; MIPS64R6-NEXT:    and $3, $2, $4
1467; MIPS64R6-NEXT:    nor $3, $zero, $3
1468; MIPS64R6-NEXT:    sc $3, 0($1)
1469; MIPS64R6-NEXT:    beqzc $3, .LBB5_1
1470; MIPS64R6-NEXT:    nop
1471; MIPS64R6-NEXT:  # %bb.2: # %entry
1472; MIPS64R6-NEXT:    jrc $ra
1473;
1474; MIPS64R6O0-LABEL: AtomicLoadNand32:
1475; MIPS64R6O0:       # %bb.0: # %entry
1476; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand32)))
1477; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1478; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand32)))
1479; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
1480; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
1481; MIPS64R6O0-NEXT:  .LBB5_1: # %entry
1482; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1483; MIPS64R6O0-NEXT:    ll $2, 0($3)
1484; MIPS64R6O0-NEXT:    and $1, $2, $4
1485; MIPS64R6O0-NEXT:    nor $1, $zero, $1
1486; MIPS64R6O0-NEXT:    sc $1, 0($3)
1487; MIPS64R6O0-NEXT:    beqzc $1, .LBB5_1
1488; MIPS64R6O0-NEXT:    nop
1489; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1490; MIPS64R6O0-NEXT:    jrc $ra
1491;
1492; MM32-LABEL: AtomicLoadNand32:
1493; MM32:       # %bb.0: # %entry
1494; MM32-NEXT:    lui $2, %hi(_gp_disp)
1495; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1496; MM32-NEXT:    addu $2, $2, $25
1497; MM32-NEXT:    lw $1, %got(x)($2)
1498; MM32-NEXT:  $BB5_1: # %entry
1499; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1500; MM32-NEXT:    ll $2, 0($1)
1501; MM32-NEXT:    and $3, $2, $4
1502; MM32-NEXT:    nor $3, $zero, $3
1503; MM32-NEXT:    sc $3, 0($1)
1504; MM32-NEXT:    beqzc $3, $BB5_1
1505; MM32-NEXT:  # %bb.2: # %entry
1506; MM32-NEXT:    jrc $ra
1507;
1508; O1-LABEL: AtomicLoadNand32:
1509; O1:       # %bb.0: # %entry
1510; O1-NEXT:    lui $2, %hi(_gp_disp)
1511; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1512; O1-NEXT:    addu $1, $2, $25
1513; O1-NEXT:    lw $1, %got(x)($1)
1514; O1-NEXT:  $BB5_1: # %entry
1515; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1516; O1-NEXT:    ll $2, 0($1)
1517; O1-NEXT:    and $3, $2, $4
1518; O1-NEXT:    nor $3, $zero, $3
1519; O1-NEXT:    sc $3, 0($1)
1520; O1-NEXT:    beqz $3, $BB5_1
1521; O1-NEXT:    nop
1522; O1-NEXT:  # %bb.2: # %entry
1523; O1-NEXT:    jr $ra
1524; O1-NEXT:    nop
1525;
1526; O2-LABEL: AtomicLoadNand32:
1527; O2:       # %bb.0: # %entry
1528; O2-NEXT:    lui $2, %hi(_gp_disp)
1529; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1530; O2-NEXT:    addu $1, $2, $25
1531; O2-NEXT:    lw $1, %got(x)($1)
1532; O2-NEXT:  $BB5_1: # %entry
1533; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1534; O2-NEXT:    ll $2, 0($1)
1535; O2-NEXT:    and $3, $2, $4
1536; O2-NEXT:    nor $3, $zero, $3
1537; O2-NEXT:    sc $3, 0($1)
1538; O2-NEXT:    beqz $3, $BB5_1
1539; O2-NEXT:    nop
1540; O2-NEXT:  # %bb.2: # %entry
1541; O2-NEXT:    jr $ra
1542; O2-NEXT:    nop
1543;
1544; O3-LABEL: AtomicLoadNand32:
1545; O3:       # %bb.0: # %entry
1546; O3-NEXT:    lui $2, %hi(_gp_disp)
1547; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1548; O3-NEXT:    addu $1, $2, $25
1549; O3-NEXT:    lw $1, %got(x)($1)
1550; O3-NEXT:  $BB5_1: # %entry
1551; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1552; O3-NEXT:    ll $2, 0($1)
1553; O3-NEXT:    and $3, $2, $4
1554; O3-NEXT:    nor $3, $zero, $3
1555; O3-NEXT:    sc $3, 0($1)
1556; O3-NEXT:    beqz $3, $BB5_1
1557; O3-NEXT:    nop
1558; O3-NEXT:  # %bb.2: # %entry
1559; O3-NEXT:    jr $ra
1560; O3-NEXT:    nop
1561;
1562; MIPS32EB-LABEL: AtomicLoadNand32:
1563; MIPS32EB:       # %bb.0: # %entry
1564; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1565; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1566; MIPS32EB-NEXT:    addu $1, $2, $25
1567; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1568; MIPS32EB-NEXT:  $BB5_1: # %entry
1569; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1570; MIPS32EB-NEXT:    ll $2, 0($1)
1571; MIPS32EB-NEXT:    and $3, $2, $4
1572; MIPS32EB-NEXT:    nor $3, $zero, $3
1573; MIPS32EB-NEXT:    sc $3, 0($1)
1574; MIPS32EB-NEXT:    beqz $3, $BB5_1
1575; MIPS32EB-NEXT:    nop
1576; MIPS32EB-NEXT:  # %bb.2: # %entry
1577; MIPS32EB-NEXT:    jr $ra
1578; MIPS32EB-NEXT:    nop
1579entry:
1580  %0 = atomicrmw nand i32* @x, i32 %incr monotonic
1581  ret i32 %0
1582
1583}
1584
1585define i32 @AtomicSwap32(i32 signext %newval) nounwind {
1586; MIPS32-LABEL: AtomicSwap32:
1587; MIPS32:       # %bb.0: # %entry
1588; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1589; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1590; MIPS32-NEXT:    addiu $sp, $sp, -8
1591; MIPS32-NEXT:    addu $1, $2, $25
1592; MIPS32-NEXT:    sw $4, 4($sp)
1593; MIPS32-NEXT:    lw $1, %got(x)($1)
1594; MIPS32-NEXT:  $BB6_1: # %entry
1595; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1596; MIPS32-NEXT:    ll $2, 0($1)
1597; MIPS32-NEXT:    move $3, $4
1598; MIPS32-NEXT:    sc $3, 0($1)
1599; MIPS32-NEXT:    beqz $3, $BB6_1
1600; MIPS32-NEXT:    nop
1601; MIPS32-NEXT:  # %bb.2: # %entry
1602; MIPS32-NEXT:    jr $ra
1603; MIPS32-NEXT:    addiu $sp, $sp, 8
1604;
1605; MIPS32O0-LABEL: AtomicSwap32:
1606; MIPS32O0:       # %bb.0: # %entry
1607; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1608; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1609; MIPS32O0-NEXT:    addiu $sp, $sp, -8
1610; MIPS32O0-NEXT:    addu $1, $2, $25
1611; MIPS32O0-NEXT:    sw $4, 4($sp)
1612; MIPS32O0-NEXT:    lw $4, 4($sp)
1613; MIPS32O0-NEXT:    lw $3, %got(x)($1)
1614; MIPS32O0-NEXT:  $BB6_1: # %entry
1615; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1616; MIPS32O0-NEXT:    ll $2, 0($3)
1617; MIPS32O0-NEXT:    move $1, $4
1618; MIPS32O0-NEXT:    sc $1, 0($3)
1619; MIPS32O0-NEXT:    beqz $1, $BB6_1
1620; MIPS32O0-NEXT:    nop
1621; MIPS32O0-NEXT:  # %bb.2: # %entry
1622; MIPS32O0-NEXT:    addiu $sp, $sp, 8
1623; MIPS32O0-NEXT:    jr $ra
1624; MIPS32O0-NEXT:    nop
1625;
1626; MIPS32R2-LABEL: AtomicSwap32:
1627; MIPS32R2:       # %bb.0: # %entry
1628; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1629; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1630; MIPS32R2-NEXT:    addiu $sp, $sp, -8
1631; MIPS32R2-NEXT:    addu $1, $2, $25
1632; MIPS32R2-NEXT:    sw $4, 4($sp)
1633; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1634; MIPS32R2-NEXT:  $BB6_1: # %entry
1635; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1636; MIPS32R2-NEXT:    ll $2, 0($1)
1637; MIPS32R2-NEXT:    move $3, $4
1638; MIPS32R2-NEXT:    sc $3, 0($1)
1639; MIPS32R2-NEXT:    beqz $3, $BB6_1
1640; MIPS32R2-NEXT:    nop
1641; MIPS32R2-NEXT:  # %bb.2: # %entry
1642; MIPS32R2-NEXT:    jr $ra
1643; MIPS32R2-NEXT:    addiu $sp, $sp, 8
1644;
1645; MIPS32R6-LABEL: AtomicSwap32:
1646; MIPS32R6:       # %bb.0: # %entry
1647; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1648; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1649; MIPS32R6-NEXT:    addiu $sp, $sp, -8
1650; MIPS32R6-NEXT:    addu $1, $2, $25
1651; MIPS32R6-NEXT:    sw $4, 4($sp)
1652; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1653; MIPS32R6-NEXT:  $BB6_1: # %entry
1654; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1655; MIPS32R6-NEXT:    ll $2, 0($1)
1656; MIPS32R6-NEXT:    move $3, $4
1657; MIPS32R6-NEXT:    sc $3, 0($1)
1658; MIPS32R6-NEXT:    beqzc $3, $BB6_1
1659; MIPS32R6-NEXT:    nop
1660; MIPS32R6-NEXT:  # %bb.2: # %entry
1661; MIPS32R6-NEXT:    jr $ra
1662; MIPS32R6-NEXT:    addiu $sp, $sp, 8
1663;
1664; MIPS32R6O0-LABEL: AtomicSwap32:
1665; MIPS32R6O0:       # %bb.0: # %entry
1666; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1667; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1668; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
1669; MIPS32R6O0-NEXT:    addu $1, $2, $25
1670; MIPS32R6O0-NEXT:    sw $4, 4($sp)
1671; MIPS32R6O0-NEXT:    lw $4, 4($sp)
1672; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
1673; MIPS32R6O0-NEXT:  $BB6_1: # %entry
1674; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1675; MIPS32R6O0-NEXT:    ll $2, 0($3)
1676; MIPS32R6O0-NEXT:    move $1, $4
1677; MIPS32R6O0-NEXT:    sc $1, 0($3)
1678; MIPS32R6O0-NEXT:    beqzc $1, $BB6_1
1679; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1680; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
1681; MIPS32R6O0-NEXT:    jrc $ra
1682;
1683; MIPS4-LABEL: AtomicSwap32:
1684; MIPS4:       # %bb.0: # %entry
1685; MIPS4-NEXT:    daddiu $sp, $sp, -16
1686; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1687; MIPS4-NEXT:    daddu $1, $1, $25
1688; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1689; MIPS4-NEXT:    sw $4, 12($sp)
1690; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1691; MIPS4-NEXT:  .LBB6_1: # %entry
1692; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1693; MIPS4-NEXT:    ll $2, 0($1)
1694; MIPS4-NEXT:    move $3, $4
1695; MIPS4-NEXT:    sc $3, 0($1)
1696; MIPS4-NEXT:    beqz $3, .LBB6_1
1697; MIPS4-NEXT:    nop
1698; MIPS4-NEXT:  # %bb.2: # %entry
1699; MIPS4-NEXT:    jr $ra
1700; MIPS4-NEXT:    daddiu $sp, $sp, 16
1701;
1702; MIPS64-LABEL: AtomicSwap32:
1703; MIPS64:       # %bb.0: # %entry
1704; MIPS64-NEXT:    daddiu $sp, $sp, -16
1705; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1706; MIPS64-NEXT:    daddu $1, $1, $25
1707; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1708; MIPS64-NEXT:    sw $4, 12($sp)
1709; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1710; MIPS64-NEXT:  .LBB6_1: # %entry
1711; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1712; MIPS64-NEXT:    ll $2, 0($1)
1713; MIPS64-NEXT:    move $3, $4
1714; MIPS64-NEXT:    sc $3, 0($1)
1715; MIPS64-NEXT:    beqz $3, .LBB6_1
1716; MIPS64-NEXT:    nop
1717; MIPS64-NEXT:  # %bb.2: # %entry
1718; MIPS64-NEXT:    jr $ra
1719; MIPS64-NEXT:    daddiu $sp, $sp, 16
1720;
1721; MIPS64R2-LABEL: AtomicSwap32:
1722; MIPS64R2:       # %bb.0: # %entry
1723; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
1724; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1725; MIPS64R2-NEXT:    daddu $1, $1, $25
1726; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1727; MIPS64R2-NEXT:    sw $4, 12($sp)
1728; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1729; MIPS64R2-NEXT:  .LBB6_1: # %entry
1730; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1731; MIPS64R2-NEXT:    ll $2, 0($1)
1732; MIPS64R2-NEXT:    move $3, $4
1733; MIPS64R2-NEXT:    sc $3, 0($1)
1734; MIPS64R2-NEXT:    beqz $3, .LBB6_1
1735; MIPS64R2-NEXT:    nop
1736; MIPS64R2-NEXT:  # %bb.2: # %entry
1737; MIPS64R2-NEXT:    jr $ra
1738; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
1739;
1740; MIPS64R6-LABEL: AtomicSwap32:
1741; MIPS64R6:       # %bb.0: # %entry
1742; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
1743; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1744; MIPS64R6-NEXT:    daddu $1, $1, $25
1745; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1746; MIPS64R6-NEXT:    sw $4, 12($sp)
1747; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1748; MIPS64R6-NEXT:  .LBB6_1: # %entry
1749; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1750; MIPS64R6-NEXT:    ll $2, 0($1)
1751; MIPS64R6-NEXT:    move $3, $4
1752; MIPS64R6-NEXT:    sc $3, 0($1)
1753; MIPS64R6-NEXT:    beqzc $3, .LBB6_1
1754; MIPS64R6-NEXT:    nop
1755; MIPS64R6-NEXT:  # %bb.2: # %entry
1756; MIPS64R6-NEXT:    jr $ra
1757; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
1758;
1759; MIPS64R6O0-LABEL: AtomicSwap32:
1760; MIPS64R6O0:       # %bb.0: # %entry
1761; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
1762; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1763; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1764; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1765; MIPS64R6O0-NEXT:    move $2, $4
1766; MIPS64R6O0-NEXT:    sw $2, 12($sp)
1767; MIPS64R6O0-NEXT:    lw $4, 12($sp)
1768; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
1769; MIPS64R6O0-NEXT:  .LBB6_1: # %entry
1770; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1771; MIPS64R6O0-NEXT:    ll $2, 0($3)
1772; MIPS64R6O0-NEXT:    move $1, $4
1773; MIPS64R6O0-NEXT:    sc $1, 0($3)
1774; MIPS64R6O0-NEXT:    beqzc $1, .LBB6_1
1775; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1776; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
1777; MIPS64R6O0-NEXT:    jrc $ra
1778;
1779; MM32-LABEL: AtomicSwap32:
1780; MM32:       # %bb.0: # %entry
1781; MM32-NEXT:    lui $2, %hi(_gp_disp)
1782; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1783; MM32-NEXT:    addiu $sp, $sp, -8
1784; MM32-NEXT:    addu $2, $2, $25
1785; MM32-NEXT:    sw $4, 4($sp)
1786; MM32-NEXT:    lw $1, %got(x)($2)
1787; MM32-NEXT:  $BB6_1: # %entry
1788; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1789; MM32-NEXT:    ll $2, 0($1)
1790; MM32-NEXT:    or $3, $4, $zero
1791; MM32-NEXT:    sc $3, 0($1)
1792; MM32-NEXT:    beqzc $3, $BB6_1
1793; MM32-NEXT:  # %bb.2: # %entry
1794; MM32-NEXT:    addiusp 8
1795; MM32-NEXT:    jrc $ra
1796;
1797; O1-LABEL: AtomicSwap32:
1798; O1:       # %bb.0: # %entry
1799; O1-NEXT:    lui $2, %hi(_gp_disp)
1800; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1801; O1-NEXT:    addiu $sp, $sp, -8
1802; O1-NEXT:    addu $1, $2, $25
1803; O1-NEXT:    sw $4, 4($sp)
1804; O1-NEXT:    lw $1, %got(x)($1)
1805; O1-NEXT:  $BB6_1: # %entry
1806; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1807; O1-NEXT:    ll $2, 0($1)
1808; O1-NEXT:    move $3, $4
1809; O1-NEXT:    sc $3, 0($1)
1810; O1-NEXT:    beqz $3, $BB6_1
1811; O1-NEXT:    nop
1812; O1-NEXT:  # %bb.2: # %entry
1813; O1-NEXT:    jr $ra
1814; O1-NEXT:    addiu $sp, $sp, 8
1815;
1816; O2-LABEL: AtomicSwap32:
1817; O2:       # %bb.0: # %entry
1818; O2-NEXT:    lui $2, %hi(_gp_disp)
1819; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1820; O2-NEXT:    addiu $sp, $sp, -8
1821; O2-NEXT:    addu $1, $2, $25
1822; O2-NEXT:    sw $4, 4($sp)
1823; O2-NEXT:    lw $1, %got(x)($1)
1824; O2-NEXT:  $BB6_1: # %entry
1825; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1826; O2-NEXT:    ll $2, 0($1)
1827; O2-NEXT:    move $3, $4
1828; O2-NEXT:    sc $3, 0($1)
1829; O2-NEXT:    beqz $3, $BB6_1
1830; O2-NEXT:    nop
1831; O2-NEXT:  # %bb.2: # %entry
1832; O2-NEXT:    jr $ra
1833; O2-NEXT:    addiu $sp, $sp, 8
1834;
1835; O3-LABEL: AtomicSwap32:
1836; O3:       # %bb.0: # %entry
1837; O3-NEXT:    lui $2, %hi(_gp_disp)
1838; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1839; O3-NEXT:    addiu $sp, $sp, -8
1840; O3-NEXT:    addu $1, $2, $25
1841; O3-NEXT:    sw $4, 4($sp)
1842; O3-NEXT:    lw $1, %got(x)($1)
1843; O3-NEXT:  $BB6_1: # %entry
1844; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1845; O3-NEXT:    ll $2, 0($1)
1846; O3-NEXT:    move $3, $4
1847; O3-NEXT:    sc $3, 0($1)
1848; O3-NEXT:    beqz $3, $BB6_1
1849; O3-NEXT:    nop
1850; O3-NEXT:  # %bb.2: # %entry
1851; O3-NEXT:    jr $ra
1852; O3-NEXT:    addiu $sp, $sp, 8
1853;
1854; MIPS32EB-LABEL: AtomicSwap32:
1855; MIPS32EB:       # %bb.0: # %entry
1856; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1857; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1858; MIPS32EB-NEXT:    addiu $sp, $sp, -8
1859; MIPS32EB-NEXT:    addu $1, $2, $25
1860; MIPS32EB-NEXT:    sw $4, 4($sp)
1861; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1862; MIPS32EB-NEXT:  $BB6_1: # %entry
1863; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1864; MIPS32EB-NEXT:    ll $2, 0($1)
1865; MIPS32EB-NEXT:    move $3, $4
1866; MIPS32EB-NEXT:    sc $3, 0($1)
1867; MIPS32EB-NEXT:    beqz $3, $BB6_1
1868; MIPS32EB-NEXT:    nop
1869; MIPS32EB-NEXT:  # %bb.2: # %entry
1870; MIPS32EB-NEXT:    jr $ra
1871; MIPS32EB-NEXT:    addiu $sp, $sp, 8
1872entry:
1873  %newval.addr = alloca i32, align 4
1874  store i32 %newval, i32* %newval.addr, align 4
1875  %tmp = load i32, i32* %newval.addr, align 4
1876  %0 = atomicrmw xchg i32* @x, i32 %tmp monotonic
1877  ret i32 %0
1878
1879}
1880
1881define i32 @AtomicCmpSwap32(i32 signext %oldval, i32 signext %newval) nounwind {
1882; MIPS32-LABEL: AtomicCmpSwap32:
1883; MIPS32:       # %bb.0: # %entry
1884; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1885; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1886; MIPS32-NEXT:    addiu $sp, $sp, -8
1887; MIPS32-NEXT:    addu $1, $2, $25
1888; MIPS32-NEXT:    sw $5, 4($sp)
1889; MIPS32-NEXT:    lw $1, %got(x)($1)
1890; MIPS32-NEXT:  $BB7_1: # %entry
1891; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1892; MIPS32-NEXT:    ll $2, 0($1)
1893; MIPS32-NEXT:    bne $2, $4, $BB7_3
1894; MIPS32-NEXT:    nop
1895; MIPS32-NEXT:  # %bb.2: # %entry
1896; MIPS32-NEXT:    # in Loop: Header=BB7_1 Depth=1
1897; MIPS32-NEXT:    move $3, $5
1898; MIPS32-NEXT:    sc $3, 0($1)
1899; MIPS32-NEXT:    beqz $3, $BB7_1
1900; MIPS32-NEXT:    nop
1901; MIPS32-NEXT:  $BB7_3: # %entry
1902; MIPS32-NEXT:    jr $ra
1903; MIPS32-NEXT:    addiu $sp, $sp, 8
1904;
1905; MIPS32O0-LABEL: AtomicCmpSwap32:
1906; MIPS32O0:       # %bb.0: # %entry
1907; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1908; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1909; MIPS32O0-NEXT:    addiu $sp, $sp, -8
1910; MIPS32O0-NEXT:    addu $1, $2, $25
1911; MIPS32O0-NEXT:    sw $5, 4($sp)
1912; MIPS32O0-NEXT:    lw $6, 4($sp)
1913; MIPS32O0-NEXT:    lw $3, %got(x)($1)
1914; MIPS32O0-NEXT:    move $5, $4
1915; MIPS32O0-NEXT:  $BB7_1: # %entry
1916; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1917; MIPS32O0-NEXT:    ll $2, 0($3)
1918; MIPS32O0-NEXT:    bne $2, $5, $BB7_3
1919; MIPS32O0-NEXT:    nop
1920; MIPS32O0-NEXT:  # %bb.2: # %entry
1921; MIPS32O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
1922; MIPS32O0-NEXT:    move $1, $6
1923; MIPS32O0-NEXT:    sc $1, 0($3)
1924; MIPS32O0-NEXT:    beqz $1, $BB7_1
1925; MIPS32O0-NEXT:    nop
1926; MIPS32O0-NEXT:  $BB7_3: # %entry
1927; MIPS32O0-NEXT:    xor $1, $2, $4
1928; MIPS32O0-NEXT:    sltiu $1, $1, 1
1929; MIPS32O0-NEXT:    addiu $sp, $sp, 8
1930; MIPS32O0-NEXT:    jr $ra
1931; MIPS32O0-NEXT:    nop
1932;
1933; MIPS32R2-LABEL: AtomicCmpSwap32:
1934; MIPS32R2:       # %bb.0: # %entry
1935; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1936; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1937; MIPS32R2-NEXT:    addiu $sp, $sp, -8
1938; MIPS32R2-NEXT:    addu $1, $2, $25
1939; MIPS32R2-NEXT:    sw $5, 4($sp)
1940; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1941; MIPS32R2-NEXT:  $BB7_1: # %entry
1942; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1943; MIPS32R2-NEXT:    ll $2, 0($1)
1944; MIPS32R2-NEXT:    bne $2, $4, $BB7_3
1945; MIPS32R2-NEXT:    nop
1946; MIPS32R2-NEXT:  # %bb.2: # %entry
1947; MIPS32R2-NEXT:    # in Loop: Header=BB7_1 Depth=1
1948; MIPS32R2-NEXT:    move $3, $5
1949; MIPS32R2-NEXT:    sc $3, 0($1)
1950; MIPS32R2-NEXT:    beqz $3, $BB7_1
1951; MIPS32R2-NEXT:    nop
1952; MIPS32R2-NEXT:  $BB7_3: # %entry
1953; MIPS32R2-NEXT:    jr $ra
1954; MIPS32R2-NEXT:    addiu $sp, $sp, 8
1955;
1956; MIPS32R6-LABEL: AtomicCmpSwap32:
1957; MIPS32R6:       # %bb.0: # %entry
1958; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1959; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1960; MIPS32R6-NEXT:    addiu $sp, $sp, -8
1961; MIPS32R6-NEXT:    addu $1, $2, $25
1962; MIPS32R6-NEXT:    sw $5, 4($sp)
1963; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1964; MIPS32R6-NEXT:  $BB7_1: # %entry
1965; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1966; MIPS32R6-NEXT:    ll $2, 0($1)
1967; MIPS32R6-NEXT:    bnec $2, $4, $BB7_3
1968; MIPS32R6-NEXT:  # %bb.2: # %entry
1969; MIPS32R6-NEXT:    # in Loop: Header=BB7_1 Depth=1
1970; MIPS32R6-NEXT:    move $3, $5
1971; MIPS32R6-NEXT:    sc $3, 0($1)
1972; MIPS32R6-NEXT:    beqzc $3, $BB7_1
1973; MIPS32R6-NEXT:    nop
1974; MIPS32R6-NEXT:  $BB7_3: # %entry
1975; MIPS32R6-NEXT:    jr $ra
1976; MIPS32R6-NEXT:    addiu $sp, $sp, 8
1977;
1978; MIPS32R6O0-LABEL: AtomicCmpSwap32:
1979; MIPS32R6O0:       # %bb.0: # %entry
1980; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1981; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1982; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
1983; MIPS32R6O0-NEXT:    addu $1, $2, $25
1984; MIPS32R6O0-NEXT:    sw $5, 4($sp)
1985; MIPS32R6O0-NEXT:    lw $5, 4($sp)
1986; MIPS32R6O0-NEXT:    lw $3, %got(x)($1)
1987; MIPS32R6O0-NEXT:  $BB7_1: # %entry
1988; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1989; MIPS32R6O0-NEXT:    ll $2, 0($3)
1990; MIPS32R6O0-NEXT:    bnec $2, $4, $BB7_3
1991; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1992; MIPS32R6O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
1993; MIPS32R6O0-NEXT:    move $1, $5
1994; MIPS32R6O0-NEXT:    sc $1, 0($3)
1995; MIPS32R6O0-NEXT:    beqzc $1, $BB7_1
1996; MIPS32R6O0-NEXT:  $BB7_3: # %entry
1997; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
1998; MIPS32R6O0-NEXT:    jrc $ra
1999;
2000; MIPS4-LABEL: AtomicCmpSwap32:
2001; MIPS4:       # %bb.0: # %entry
2002; MIPS4-NEXT:    daddiu $sp, $sp, -16
2003; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2004; MIPS4-NEXT:    daddu $1, $1, $25
2005; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2006; MIPS4-NEXT:    sw $5, 12($sp)
2007; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
2008; MIPS4-NEXT:  .LBB7_1: # %entry
2009; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2010; MIPS4-NEXT:    ll $2, 0($1)
2011; MIPS4-NEXT:    bne $2, $4, .LBB7_3
2012; MIPS4-NEXT:    nop
2013; MIPS4-NEXT:  # %bb.2: # %entry
2014; MIPS4-NEXT:    # in Loop: Header=BB7_1 Depth=1
2015; MIPS4-NEXT:    move $3, $5
2016; MIPS4-NEXT:    sc $3, 0($1)
2017; MIPS4-NEXT:    beqz $3, .LBB7_1
2018; MIPS4-NEXT:    nop
2019; MIPS4-NEXT:  .LBB7_3: # %entry
2020; MIPS4-NEXT:    jr $ra
2021; MIPS4-NEXT:    daddiu $sp, $sp, 16
2022;
2023; MIPS64-LABEL: AtomicCmpSwap32:
2024; MIPS64:       # %bb.0: # %entry
2025; MIPS64-NEXT:    daddiu $sp, $sp, -16
2026; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2027; MIPS64-NEXT:    daddu $1, $1, $25
2028; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2029; MIPS64-NEXT:    sw $5, 12($sp)
2030; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
2031; MIPS64-NEXT:  .LBB7_1: # %entry
2032; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2033; MIPS64-NEXT:    ll $2, 0($1)
2034; MIPS64-NEXT:    bne $2, $4, .LBB7_3
2035; MIPS64-NEXT:    nop
2036; MIPS64-NEXT:  # %bb.2: # %entry
2037; MIPS64-NEXT:    # in Loop: Header=BB7_1 Depth=1
2038; MIPS64-NEXT:    move $3, $5
2039; MIPS64-NEXT:    sc $3, 0($1)
2040; MIPS64-NEXT:    beqz $3, .LBB7_1
2041; MIPS64-NEXT:    nop
2042; MIPS64-NEXT:  .LBB7_3: # %entry
2043; MIPS64-NEXT:    jr $ra
2044; MIPS64-NEXT:    daddiu $sp, $sp, 16
2045;
2046; MIPS64R2-LABEL: AtomicCmpSwap32:
2047; MIPS64R2:       # %bb.0: # %entry
2048; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
2049; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2050; MIPS64R2-NEXT:    daddu $1, $1, $25
2051; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2052; MIPS64R2-NEXT:    sw $5, 12($sp)
2053; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
2054; MIPS64R2-NEXT:  .LBB7_1: # %entry
2055; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
2056; MIPS64R2-NEXT:    ll $2, 0($1)
2057; MIPS64R2-NEXT:    bne $2, $4, .LBB7_3
2058; MIPS64R2-NEXT:    nop
2059; MIPS64R2-NEXT:  # %bb.2: # %entry
2060; MIPS64R2-NEXT:    # in Loop: Header=BB7_1 Depth=1
2061; MIPS64R2-NEXT:    move $3, $5
2062; MIPS64R2-NEXT:    sc $3, 0($1)
2063; MIPS64R2-NEXT:    beqz $3, .LBB7_1
2064; MIPS64R2-NEXT:    nop
2065; MIPS64R2-NEXT:  .LBB7_3: # %entry
2066; MIPS64R2-NEXT:    jr $ra
2067; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
2068;
2069; MIPS64R6-LABEL: AtomicCmpSwap32:
2070; MIPS64R6:       # %bb.0: # %entry
2071; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
2072; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2073; MIPS64R6-NEXT:    daddu $1, $1, $25
2074; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2075; MIPS64R6-NEXT:    sw $5, 12($sp)
2076; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
2077; MIPS64R6-NEXT:  .LBB7_1: # %entry
2078; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
2079; MIPS64R6-NEXT:    ll $2, 0($1)
2080; MIPS64R6-NEXT:    bnec $2, $4, .LBB7_3
2081; MIPS64R6-NEXT:  # %bb.2: # %entry
2082; MIPS64R6-NEXT:    # in Loop: Header=BB7_1 Depth=1
2083; MIPS64R6-NEXT:    move $3, $5
2084; MIPS64R6-NEXT:    sc $3, 0($1)
2085; MIPS64R6-NEXT:    beqzc $3, .LBB7_1
2086; MIPS64R6-NEXT:    nop
2087; MIPS64R6-NEXT:  .LBB7_3: # %entry
2088; MIPS64R6-NEXT:    jr $ra
2089; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
2090;
2091; MIPS64R6O0-LABEL: AtomicCmpSwap32:
2092; MIPS64R6O0:       # %bb.0: # %entry
2093; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
2094; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2095; MIPS64R6O0-NEXT:    daddu $1, $1, $25
2096; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2097; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
2098; MIPS64R6O0-NEXT:    move $2, $5
2099; MIPS64R6O0-NEXT:    sw $2, 12($sp)
2100; MIPS64R6O0-NEXT:    lw $5, 12($sp)
2101; MIPS64R6O0-NEXT:    ld $3, %got_disp(x)($1)
2102; MIPS64R6O0-NEXT:  .LBB7_1: # %entry
2103; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2104; MIPS64R6O0-NEXT:    ll $2, 0($3)
2105; MIPS64R6O0-NEXT:    bnec $2, $4, .LBB7_3
2106; MIPS64R6O0-NEXT:  # %bb.2: # %entry
2107; MIPS64R6O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
2108; MIPS64R6O0-NEXT:    move $1, $5
2109; MIPS64R6O0-NEXT:    sc $1, 0($3)
2110; MIPS64R6O0-NEXT:    beqzc $1, .LBB7_1
2111; MIPS64R6O0-NEXT:  .LBB7_3: # %entry
2112; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
2113; MIPS64R6O0-NEXT:    jrc $ra
2114;
2115; MM32-LABEL: AtomicCmpSwap32:
2116; MM32:       # %bb.0: # %entry
2117; MM32-NEXT:    lui $2, %hi(_gp_disp)
2118; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2119; MM32-NEXT:    addiu $sp, $sp, -8
2120; MM32-NEXT:    addu $2, $2, $25
2121; MM32-NEXT:    sw $5, 4($sp)
2122; MM32-NEXT:    lw $1, %got(x)($2)
2123; MM32-NEXT:  $BB7_1: # %entry
2124; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
2125; MM32-NEXT:    ll $2, 0($1)
2126; MM32-NEXT:    bne $2, $4, $BB7_3
2127; MM32-NEXT:    nop
2128; MM32-NEXT:  # %bb.2: # %entry
2129; MM32-NEXT:    # in Loop: Header=BB7_1 Depth=1
2130; MM32-NEXT:    move $3, $5
2131; MM32-NEXT:    sc $3, 0($1)
2132; MM32-NEXT:    beqzc $3, $BB7_1
2133; MM32-NEXT:  $BB7_3: # %entry
2134; MM32-NEXT:    addiusp 8
2135; MM32-NEXT:    jrc $ra
2136;
2137; O1-LABEL: AtomicCmpSwap32:
2138; O1:       # %bb.0: # %entry
2139; O1-NEXT:    lui $2, %hi(_gp_disp)
2140; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
2141; O1-NEXT:    addiu $sp, $sp, -8
2142; O1-NEXT:    addu $1, $2, $25
2143; O1-NEXT:    sw $5, 4($sp)
2144; O1-NEXT:    lw $1, %got(x)($1)
2145; O1-NEXT:  $BB7_1: # %entry
2146; O1-NEXT:    # =>This Inner Loop Header: Depth=1
2147; O1-NEXT:    ll $2, 0($1)
2148; O1-NEXT:    bne $2, $4, $BB7_3
2149; O1-NEXT:    nop
2150; O1-NEXT:  # %bb.2: # %entry
2151; O1-NEXT:    # in Loop: Header=BB7_1 Depth=1
2152; O1-NEXT:    move $3, $5
2153; O1-NEXT:    sc $3, 0($1)
2154; O1-NEXT:    beqz $3, $BB7_1
2155; O1-NEXT:    nop
2156; O1-NEXT:  $BB7_3: # %entry
2157; O1-NEXT:    jr $ra
2158; O1-NEXT:    addiu $sp, $sp, 8
2159;
2160; O2-LABEL: AtomicCmpSwap32:
2161; O2:       # %bb.0: # %entry
2162; O2-NEXT:    lui $2, %hi(_gp_disp)
2163; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2164; O2-NEXT:    addiu $sp, $sp, -8
2165; O2-NEXT:    addu $1, $2, $25
2166; O2-NEXT:    sw $5, 4($sp)
2167; O2-NEXT:    lw $1, %got(x)($1)
2168; O2-NEXT:  $BB7_1: # %entry
2169; O2-NEXT:    # =>This Inner Loop Header: Depth=1
2170; O2-NEXT:    ll $2, 0($1)
2171; O2-NEXT:    bne $2, $4, $BB7_3
2172; O2-NEXT:    nop
2173; O2-NEXT:  # %bb.2: # %entry
2174; O2-NEXT:    # in Loop: Header=BB7_1 Depth=1
2175; O2-NEXT:    move $3, $5
2176; O2-NEXT:    sc $3, 0($1)
2177; O2-NEXT:    beqz $3, $BB7_1
2178; O2-NEXT:    nop
2179; O2-NEXT:  $BB7_3: # %entry
2180; O2-NEXT:    jr $ra
2181; O2-NEXT:    addiu $sp, $sp, 8
2182;
2183; O3-LABEL: AtomicCmpSwap32:
2184; O3:       # %bb.0: # %entry
2185; O3-NEXT:    lui $2, %hi(_gp_disp)
2186; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
2187; O3-NEXT:    addiu $sp, $sp, -8
2188; O3-NEXT:    addu $1, $2, $25
2189; O3-NEXT:    sw $5, 4($sp)
2190; O3-NEXT:    lw $1, %got(x)($1)
2191; O3-NEXT:  $BB7_1: # %entry
2192; O3-NEXT:    # =>This Inner Loop Header: Depth=1
2193; O3-NEXT:    ll $2, 0($1)
2194; O3-NEXT:    bne $2, $4, $BB7_3
2195; O3-NEXT:    nop
2196; O3-NEXT:  # %bb.2: # %entry
2197; O3-NEXT:    # in Loop: Header=BB7_1 Depth=1
2198; O3-NEXT:    move $3, $5
2199; O3-NEXT:    sc $3, 0($1)
2200; O3-NEXT:    beqz $3, $BB7_1
2201; O3-NEXT:    nop
2202; O3-NEXT:  $BB7_3: # %entry
2203; O3-NEXT:    jr $ra
2204; O3-NEXT:    addiu $sp, $sp, 8
2205;
2206; MIPS32EB-LABEL: AtomicCmpSwap32:
2207; MIPS32EB:       # %bb.0: # %entry
2208; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
2209; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
2210; MIPS32EB-NEXT:    addiu $sp, $sp, -8
2211; MIPS32EB-NEXT:    addu $1, $2, $25
2212; MIPS32EB-NEXT:    sw $5, 4($sp)
2213; MIPS32EB-NEXT:    lw $1, %got(x)($1)
2214; MIPS32EB-NEXT:  $BB7_1: # %entry
2215; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
2216; MIPS32EB-NEXT:    ll $2, 0($1)
2217; MIPS32EB-NEXT:    bne $2, $4, $BB7_3
2218; MIPS32EB-NEXT:    nop
2219; MIPS32EB-NEXT:  # %bb.2: # %entry
2220; MIPS32EB-NEXT:    # in Loop: Header=BB7_1 Depth=1
2221; MIPS32EB-NEXT:    move $3, $5
2222; MIPS32EB-NEXT:    sc $3, 0($1)
2223; MIPS32EB-NEXT:    beqz $3, $BB7_1
2224; MIPS32EB-NEXT:    nop
2225; MIPS32EB-NEXT:  $BB7_3: # %entry
2226; MIPS32EB-NEXT:    jr $ra
2227; MIPS32EB-NEXT:    addiu $sp, $sp, 8
2228entry:
2229  %newval.addr = alloca i32, align 4
2230  store i32 %newval, i32* %newval.addr, align 4
2231  %tmp = load i32, i32* %newval.addr, align 4
2232  %0 = cmpxchg i32* @x, i32 %oldval, i32 %tmp monotonic monotonic
2233  %1 = extractvalue { i32, i1 } %0, 0
2234  ret i32 %1
2235
2236}
2237
2238@y = common global i8 0, align 1
2239
2240define signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind {
2241; MIPS32-LABEL: AtomicLoadAdd8:
2242; MIPS32:       # %bb.0: # %entry
2243; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
2244; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2245; MIPS32-NEXT:    addu $1, $2, $25
2246; MIPS32-NEXT:    lw $1, %got(y)($1)
2247; MIPS32-NEXT:    addiu $2, $zero, -4
2248; MIPS32-NEXT:    and $2, $1, $2
2249; MIPS32-NEXT:    andi $1, $1, 3
2250; MIPS32-NEXT:    sll $3, $1, 3
2251; MIPS32-NEXT:    ori $1, $zero, 255
2252; MIPS32-NEXT:    sllv $5, $1, $3
2253; MIPS32-NEXT:    nor $6, $zero, $5
2254; MIPS32-NEXT:    sllv $4, $4, $3
2255; MIPS32-NEXT:  $BB8_1: # %entry
2256; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
2257; MIPS32-NEXT:    ll $7, 0($2)
2258; MIPS32-NEXT:    addu $8, $7, $4
2259; MIPS32-NEXT:    and $8, $8, $5
2260; MIPS32-NEXT:    and $9, $7, $6
2261; MIPS32-NEXT:    or $9, $9, $8
2262; MIPS32-NEXT:    sc $9, 0($2)
2263; MIPS32-NEXT:    beqz $9, $BB8_1
2264; MIPS32-NEXT:    nop
2265; MIPS32-NEXT:  # %bb.2: # %entry
2266; MIPS32-NEXT:    and $1, $7, $5
2267; MIPS32-NEXT:    srlv $1, $1, $3
2268; MIPS32-NEXT:    sll $1, $1, 24
2269; MIPS32-NEXT:    sra $1, $1, 24
2270; MIPS32-NEXT:  # %bb.3: # %entry
2271; MIPS32-NEXT:    sll $1, $1, 24
2272; MIPS32-NEXT:    jr $ra
2273; MIPS32-NEXT:    sra $2, $1, 24
2274;
2275; MIPS32O0-LABEL: AtomicLoadAdd8:
2276; MIPS32O0:       # %bb.0: # %entry
2277; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
2278; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2279; MIPS32O0-NEXT:    addiu $sp, $sp, -8
2280; MIPS32O0-NEXT:    addu $1, $2, $25
2281; MIPS32O0-NEXT:    lw $1, %got(y)($1)
2282; MIPS32O0-NEXT:    addiu $2, $zero, -4
2283; MIPS32O0-NEXT:    and $5, $1, $2
2284; MIPS32O0-NEXT:    andi $1, $1, 3
2285; MIPS32O0-NEXT:    sll $9, $1, 3
2286; MIPS32O0-NEXT:    ori $1, $zero, 255
2287; MIPS32O0-NEXT:    sllv $7, $1, $9
2288; MIPS32O0-NEXT:    nor $8, $zero, $7
2289; MIPS32O0-NEXT:    sllv $6, $4, $9
2290; MIPS32O0-NEXT:  $BB8_1: # %entry
2291; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
2292; MIPS32O0-NEXT:    ll $2, 0($5)
2293; MIPS32O0-NEXT:    addu $3, $2, $6
2294; MIPS32O0-NEXT:    and $3, $3, $7
2295; MIPS32O0-NEXT:    and $4, $2, $8
2296; MIPS32O0-NEXT:    or $4, $4, $3
2297; MIPS32O0-NEXT:    sc $4, 0($5)
2298; MIPS32O0-NEXT:    beqz $4, $BB8_1
2299; MIPS32O0-NEXT:    nop
2300; MIPS32O0-NEXT:  # %bb.2: # %entry
2301; MIPS32O0-NEXT:    and $1, $2, $7
2302; MIPS32O0-NEXT:    srlv $1, $1, $9
2303; MIPS32O0-NEXT:    sll $1, $1, 24
2304; MIPS32O0-NEXT:    sra $1, $1, 24
2305; MIPS32O0-NEXT:  # %bb.3: # %entry
2306; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
2307; MIPS32O0-NEXT:  # %bb.4: # %entry
2308; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2309; MIPS32O0-NEXT:    sll $1, $1, 24
2310; MIPS32O0-NEXT:    sra $2, $1, 24
2311; MIPS32O0-NEXT:    addiu $sp, $sp, 8
2312; MIPS32O0-NEXT:    jr $ra
2313; MIPS32O0-NEXT:    nop
2314;
2315; MIPS32R2-LABEL: AtomicLoadAdd8:
2316; MIPS32R2:       # %bb.0: # %entry
2317; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
2318; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2319; MIPS32R2-NEXT:    addu $1, $2, $25
2320; MIPS32R2-NEXT:    lw $1, %got(y)($1)
2321; MIPS32R2-NEXT:    addiu $2, $zero, -4
2322; MIPS32R2-NEXT:    and $2, $1, $2
2323; MIPS32R2-NEXT:    andi $1, $1, 3
2324; MIPS32R2-NEXT:    sll $3, $1, 3
2325; MIPS32R2-NEXT:    ori $1, $zero, 255
2326; MIPS32R2-NEXT:    sllv $5, $1, $3
2327; MIPS32R2-NEXT:    nor $6, $zero, $5
2328; MIPS32R2-NEXT:    sllv $4, $4, $3
2329; MIPS32R2-NEXT:  $BB8_1: # %entry
2330; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
2331; MIPS32R2-NEXT:    ll $7, 0($2)
2332; MIPS32R2-NEXT:    addu $8, $7, $4
2333; MIPS32R2-NEXT:    and $8, $8, $5
2334; MIPS32R2-NEXT:    and $9, $7, $6
2335; MIPS32R2-NEXT:    or $9, $9, $8
2336; MIPS32R2-NEXT:    sc $9, 0($2)
2337; MIPS32R2-NEXT:    beqz $9, $BB8_1
2338; MIPS32R2-NEXT:    nop
2339; MIPS32R2-NEXT:  # %bb.2: # %entry
2340; MIPS32R2-NEXT:    and $1, $7, $5
2341; MIPS32R2-NEXT:    srlv $1, $1, $3
2342; MIPS32R2-NEXT:    seb $1, $1
2343; MIPS32R2-NEXT:  # %bb.3: # %entry
2344; MIPS32R2-NEXT:    jr $ra
2345; MIPS32R2-NEXT:    seb $2, $1
2346;
2347; MIPS32R6-LABEL: AtomicLoadAdd8:
2348; MIPS32R6:       # %bb.0: # %entry
2349; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
2350; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
2351; MIPS32R6-NEXT:    addu $1, $2, $25
2352; MIPS32R6-NEXT:    lw $1, %got(y)($1)
2353; MIPS32R6-NEXT:    addiu $2, $zero, -4
2354; MIPS32R6-NEXT:    and $2, $1, $2
2355; MIPS32R6-NEXT:    andi $1, $1, 3
2356; MIPS32R6-NEXT:    sll $3, $1, 3
2357; MIPS32R6-NEXT:    ori $1, $zero, 255
2358; MIPS32R6-NEXT:    sllv $5, $1, $3
2359; MIPS32R6-NEXT:    nor $6, $zero, $5
2360; MIPS32R6-NEXT:    sllv $4, $4, $3
2361; MIPS32R6-NEXT:  $BB8_1: # %entry
2362; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
2363; MIPS32R6-NEXT:    ll $7, 0($2)
2364; MIPS32R6-NEXT:    addu $8, $7, $4
2365; MIPS32R6-NEXT:    and $8, $8, $5
2366; MIPS32R6-NEXT:    and $9, $7, $6
2367; MIPS32R6-NEXT:    or $9, $9, $8
2368; MIPS32R6-NEXT:    sc $9, 0($2)
2369; MIPS32R6-NEXT:    beqzc $9, $BB8_1
2370; MIPS32R6-NEXT:  # %bb.2: # %entry
2371; MIPS32R6-NEXT:    and $1, $7, $5
2372; MIPS32R6-NEXT:    srlv $1, $1, $3
2373; MIPS32R6-NEXT:    seb $1, $1
2374; MIPS32R6-NEXT:  # %bb.3: # %entry
2375; MIPS32R6-NEXT:    jr $ra
2376; MIPS32R6-NEXT:    seb $2, $1
2377;
2378; MIPS32R6O0-LABEL: AtomicLoadAdd8:
2379; MIPS32R6O0:       # %bb.0: # %entry
2380; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
2381; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2382; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
2383; MIPS32R6O0-NEXT:    addu $1, $2, $25
2384; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a0
2385; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
2386; MIPS32R6O0-NEXT:    addiu $2, $zero, -4
2387; MIPS32R6O0-NEXT:    and $5, $1, $2
2388; MIPS32R6O0-NEXT:    andi $1, $1, 3
2389; MIPS32R6O0-NEXT:    sll $9, $1, 3
2390; MIPS32R6O0-NEXT:    ori $1, $zero, 255
2391; MIPS32R6O0-NEXT:    sllv $7, $1, $9
2392; MIPS32R6O0-NEXT:    nor $8, $zero, $7
2393; MIPS32R6O0-NEXT:    sllv $6, $4, $9
2394; MIPS32R6O0-NEXT:  $BB8_1: # %entry
2395; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2396; MIPS32R6O0-NEXT:    ll $2, 0($5)
2397; MIPS32R6O0-NEXT:    addu $3, $2, $6
2398; MIPS32R6O0-NEXT:    and $3, $3, $7
2399; MIPS32R6O0-NEXT:    and $4, $2, $8
2400; MIPS32R6O0-NEXT:    or $4, $4, $3
2401; MIPS32R6O0-NEXT:    sc $4, 0($5)
2402; MIPS32R6O0-NEXT:    beqzc $4, $BB8_1
2403; MIPS32R6O0-NEXT:  # %bb.2: # %entry
2404; MIPS32R6O0-NEXT:    and $1, $2, $7
2405; MIPS32R6O0-NEXT:    srlv $1, $1, $9
2406; MIPS32R6O0-NEXT:    seb $1, $1
2407; MIPS32R6O0-NEXT:  # %bb.3: # %entry
2408; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
2409; MIPS32R6O0-NEXT:  # %bb.4: # %entry
2410; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2411; MIPS32R6O0-NEXT:    seb $2, $1
2412; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
2413; MIPS32R6O0-NEXT:    jrc $ra
2414;
2415; MIPS4-LABEL: AtomicLoadAdd8:
2416; MIPS4:       # %bb.0: # %entry
2417; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2418; MIPS4-NEXT:    daddu $1, $1, $25
2419; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2420; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
2421; MIPS4-NEXT:    daddiu $2, $zero, -4
2422; MIPS4-NEXT:    and $2, $1, $2
2423; MIPS4-NEXT:    andi $1, $1, 3
2424; MIPS4-NEXT:    sll $3, $1, 3
2425; MIPS4-NEXT:    ori $1, $zero, 255
2426; MIPS4-NEXT:    sllv $5, $1, $3
2427; MIPS4-NEXT:    nor $6, $zero, $5
2428; MIPS4-NEXT:    sllv $4, $4, $3
2429; MIPS4-NEXT:  .LBB8_1: # %entry
2430; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2431; MIPS4-NEXT:    ll $7, 0($2)
2432; MIPS4-NEXT:    addu $8, $7, $4
2433; MIPS4-NEXT:    and $8, $8, $5
2434; MIPS4-NEXT:    and $9, $7, $6
2435; MIPS4-NEXT:    or $9, $9, $8
2436; MIPS4-NEXT:    sc $9, 0($2)
2437; MIPS4-NEXT:    beqz $9, .LBB8_1
2438; MIPS4-NEXT:    nop
2439; MIPS4-NEXT:  # %bb.2: # %entry
2440; MIPS4-NEXT:    and $1, $7, $5
2441; MIPS4-NEXT:    srlv $1, $1, $3
2442; MIPS4-NEXT:    sll $1, $1, 24
2443; MIPS4-NEXT:    sra $1, $1, 24
2444; MIPS4-NEXT:  # %bb.3: # %entry
2445; MIPS4-NEXT:    sll $1, $1, 24
2446; MIPS4-NEXT:    jr $ra
2447; MIPS4-NEXT:    sra $2, $1, 24
2448;
2449; MIPS64-LABEL: AtomicLoadAdd8:
2450; MIPS64:       # %bb.0: # %entry
2451; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2452; MIPS64-NEXT:    daddu $1, $1, $25
2453; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2454; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
2455; MIPS64-NEXT:    daddiu $2, $zero, -4
2456; MIPS64-NEXT:    and $2, $1, $2
2457; MIPS64-NEXT:    andi $1, $1, 3
2458; MIPS64-NEXT:    sll $3, $1, 3
2459; MIPS64-NEXT:    ori $1, $zero, 255
2460; MIPS64-NEXT:    sllv $5, $1, $3
2461; MIPS64-NEXT:    nor $6, $zero, $5
2462; MIPS64-NEXT:    sllv $4, $4, $3
2463; MIPS64-NEXT:  .LBB8_1: # %entry
2464; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2465; MIPS64-NEXT:    ll $7, 0($2)
2466; MIPS64-NEXT:    addu $8, $7, $4
2467; MIPS64-NEXT:    and $8, $8, $5
2468; MIPS64-NEXT:    and $9, $7, $6
2469; MIPS64-NEXT:    or $9, $9, $8
2470; MIPS64-NEXT:    sc $9, 0($2)
2471; MIPS64-NEXT:    beqz $9, .LBB8_1
2472; MIPS64-NEXT:    nop
2473; MIPS64-NEXT:  # %bb.2: # %entry
2474; MIPS64-NEXT:    and $1, $7, $5
2475; MIPS64-NEXT:    srlv $1, $1, $3
2476; MIPS64-NEXT:    sll $1, $1, 24
2477; MIPS64-NEXT:    sra $1, $1, 24
2478; MIPS64-NEXT:  # %bb.3: # %entry
2479; MIPS64-NEXT:    sll $1, $1, 24
2480; MIPS64-NEXT:    jr $ra
2481; MIPS64-NEXT:    sra $2, $1, 24
2482;
2483; MIPS64R2-LABEL: AtomicLoadAdd8:
2484; MIPS64R2:       # %bb.0: # %entry
2485; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2486; MIPS64R2-NEXT:    daddu $1, $1, $25
2487; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2488; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
2489; MIPS64R2-NEXT:    daddiu $2, $zero, -4
2490; MIPS64R2-NEXT:    and $2, $1, $2
2491; MIPS64R2-NEXT:    andi $1, $1, 3
2492; MIPS64R2-NEXT:    sll $3, $1, 3
2493; MIPS64R2-NEXT:    ori $1, $zero, 255
2494; MIPS64R2-NEXT:    sllv $5, $1, $3
2495; MIPS64R2-NEXT:    nor $6, $zero, $5
2496; MIPS64R2-NEXT:    sllv $4, $4, $3
2497; MIPS64R2-NEXT:  .LBB8_1: # %entry
2498; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
2499; MIPS64R2-NEXT:    ll $7, 0($2)
2500; MIPS64R2-NEXT:    addu $8, $7, $4
2501; MIPS64R2-NEXT:    and $8, $8, $5
2502; MIPS64R2-NEXT:    and $9, $7, $6
2503; MIPS64R2-NEXT:    or $9, $9, $8
2504; MIPS64R2-NEXT:    sc $9, 0($2)
2505; MIPS64R2-NEXT:    beqz $9, .LBB8_1
2506; MIPS64R2-NEXT:    nop
2507; MIPS64R2-NEXT:  # %bb.2: # %entry
2508; MIPS64R2-NEXT:    and $1, $7, $5
2509; MIPS64R2-NEXT:    srlv $1, $1, $3
2510; MIPS64R2-NEXT:    seb $1, $1
2511; MIPS64R2-NEXT:  # %bb.3: # %entry
2512; MIPS64R2-NEXT:    jr $ra
2513; MIPS64R2-NEXT:    seb $2, $1
2514;
2515; MIPS64R6-LABEL: AtomicLoadAdd8:
2516; MIPS64R6:       # %bb.0: # %entry
2517; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2518; MIPS64R6-NEXT:    daddu $1, $1, $25
2519; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2520; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
2521; MIPS64R6-NEXT:    daddiu $2, $zero, -4
2522; MIPS64R6-NEXT:    and $2, $1, $2
2523; MIPS64R6-NEXT:    andi $1, $1, 3
2524; MIPS64R6-NEXT:    sll $3, $1, 3
2525; MIPS64R6-NEXT:    ori $1, $zero, 255
2526; MIPS64R6-NEXT:    sllv $5, $1, $3
2527; MIPS64R6-NEXT:    nor $6, $zero, $5
2528; MIPS64R6-NEXT:    sllv $4, $4, $3
2529; MIPS64R6-NEXT:  .LBB8_1: # %entry
2530; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
2531; MIPS64R6-NEXT:    ll $7, 0($2)
2532; MIPS64R6-NEXT:    addu $8, $7, $4
2533; MIPS64R6-NEXT:    and $8, $8, $5
2534; MIPS64R6-NEXT:    and $9, $7, $6
2535; MIPS64R6-NEXT:    or $9, $9, $8
2536; MIPS64R6-NEXT:    sc $9, 0($2)
2537; MIPS64R6-NEXT:    beqzc $9, .LBB8_1
2538; MIPS64R6-NEXT:  # %bb.2: # %entry
2539; MIPS64R6-NEXT:    and $1, $7, $5
2540; MIPS64R6-NEXT:    srlv $1, $1, $3
2541; MIPS64R6-NEXT:    seb $1, $1
2542; MIPS64R6-NEXT:  # %bb.3: # %entry
2543; MIPS64R6-NEXT:    jr $ra
2544; MIPS64R6-NEXT:    seb $2, $1
2545;
2546; MIPS64R6O0-LABEL: AtomicLoadAdd8:
2547; MIPS64R6O0:       # %bb.0: # %entry
2548; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
2549; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2550; MIPS64R6O0-NEXT:    daddu $1, $1, $25
2551; MIPS64R6O0-NEXT:    daddiu $2, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2552; MIPS64R6O0-NEXT:    move $1, $4
2553; MIPS64R6O0-NEXT:    ld $2, %got_disp(y)($2)
2554; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
2555; MIPS64R6O0-NEXT:    and $5, $2, $3
2556; MIPS64R6O0-NEXT:    andi $2, $2, 3
2557; MIPS64R6O0-NEXT:    xori $2, $2, 3
2558; MIPS64R6O0-NEXT:    sll $9, $2, 3
2559; MIPS64R6O0-NEXT:    ori $2, $zero, 255
2560; MIPS64R6O0-NEXT:    sllv $7, $2, $9
2561; MIPS64R6O0-NEXT:    nor $8, $zero, $7
2562; MIPS64R6O0-NEXT:    sllv $6, $1, $9
2563; MIPS64R6O0-NEXT:  .LBB8_1: # %entry
2564; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2565; MIPS64R6O0-NEXT:    ll $2, 0($5)
2566; MIPS64R6O0-NEXT:    addu $3, $2, $6
2567; MIPS64R6O0-NEXT:    and $3, $3, $7
2568; MIPS64R6O0-NEXT:    and $4, $2, $8
2569; MIPS64R6O0-NEXT:    or $4, $4, $3
2570; MIPS64R6O0-NEXT:    sc $4, 0($5)
2571; MIPS64R6O0-NEXT:    beqzc $4, .LBB8_1
2572; MIPS64R6O0-NEXT:  # %bb.2: # %entry
2573; MIPS64R6O0-NEXT:    and $1, $2, $7
2574; MIPS64R6O0-NEXT:    srlv $1, $1, $9
2575; MIPS64R6O0-NEXT:    seb $1, $1
2576; MIPS64R6O0-NEXT:  # %bb.3: # %entry
2577; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
2578; MIPS64R6O0-NEXT:  # %bb.4: # %entry
2579; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
2580; MIPS64R6O0-NEXT:    seb $2, $1
2581; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
2582; MIPS64R6O0-NEXT:    jrc $ra
2583;
2584; MM32-LABEL: AtomicLoadAdd8:
2585; MM32:       # %bb.0: # %entry
2586; MM32-NEXT:    lui $2, %hi(_gp_disp)
2587; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2588; MM32-NEXT:    addu $2, $2, $25
2589; MM32-NEXT:    lw $1, %got(y)($2)
2590; MM32-NEXT:    addiu $2, $zero, -4
2591; MM32-NEXT:    and $2, $1, $2
2592; MM32-NEXT:    andi $1, $1, 3
2593; MM32-NEXT:    sll $3, $1, 3
2594; MM32-NEXT:    ori $1, $zero, 255
2595; MM32-NEXT:    sllv $5, $1, $3
2596; MM32-NEXT:    nor $6, $zero, $5
2597; MM32-NEXT:    sllv $4, $4, $3
2598; MM32-NEXT:  $BB8_1: # %entry
2599; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
2600; MM32-NEXT:    ll $7, 0($2)
2601; MM32-NEXT:    addu $8, $7, $4
2602; MM32-NEXT:    and $8, $8, $5
2603; MM32-NEXT:    and $9, $7, $6
2604; MM32-NEXT:    or $9, $9, $8
2605; MM32-NEXT:    sc $9, 0($2)
2606; MM32-NEXT:    beqzc $9, $BB8_1
2607; MM32-NEXT:  # %bb.2: # %entry
2608; MM32-NEXT:    and $1, $7, $5
2609; MM32-NEXT:    srlv $1, $1, $3
2610; MM32-NEXT:    seb $1, $1
2611; MM32-NEXT:  # %bb.3: # %entry
2612; MM32-NEXT:    jr $ra
2613; MM32-NEXT:    seb $2, $1
2614;
2615; O1-LABEL: AtomicLoadAdd8:
2616; O1:       # %bb.0: # %entry
2617; O1-NEXT:    lui $2, %hi(_gp_disp)
2618; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
2619; O1-NEXT:    addu $1, $2, $25
2620; O1-NEXT:    lw $1, %got(y)($1)
2621; O1-NEXT:    addiu $2, $zero, -4
2622; O1-NEXT:    and $2, $1, $2
2623; O1-NEXT:    andi $1, $1, 3
2624; O1-NEXT:    sll $3, $1, 3
2625; O1-NEXT:    ori $1, $zero, 255
2626; O1-NEXT:    sllv $5, $1, $3
2627; O1-NEXT:    nor $6, $zero, $5
2628; O1-NEXT:    sllv $4, $4, $3
2629; O1-NEXT:  $BB8_1: # %entry
2630; O1-NEXT:    # =>This Inner Loop Header: Depth=1
2631; O1-NEXT:    ll $7, 0($2)
2632; O1-NEXT:    addu $8, $7, $4
2633; O1-NEXT:    and $8, $8, $5
2634; O1-NEXT:    and $9, $7, $6
2635; O1-NEXT:    or $9, $9, $8
2636; O1-NEXT:    sc $9, 0($2)
2637; O1-NEXT:    beqz $9, $BB8_1
2638; O1-NEXT:    nop
2639; O1-NEXT:  # %bb.2: # %entry
2640; O1-NEXT:    and $1, $7, $5
2641; O1-NEXT:    srlv $1, $1, $3
2642; O1-NEXT:    sll $1, $1, 24
2643; O1-NEXT:    sra $1, $1, 24
2644; O1-NEXT:  # %bb.3: # %entry
2645; O1-NEXT:    sll $1, $1, 24
2646; O1-NEXT:    jr $ra
2647; O1-NEXT:    sra $2, $1, 24
2648;
2649; O2-LABEL: AtomicLoadAdd8:
2650; O2:       # %bb.0: # %entry
2651; O2-NEXT:    lui $2, %hi(_gp_disp)
2652; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2653; O2-NEXT:    addu $1, $2, $25
2654; O2-NEXT:    lw $1, %got(y)($1)
2655; O2-NEXT:    addiu $2, $zero, -4
2656; O2-NEXT:    and $2, $1, $2
2657; O2-NEXT:    andi $1, $1, 3
2658; O2-NEXT:    sll $3, $1, 3
2659; O2-NEXT:    ori $1, $zero, 255
2660; O2-NEXT:    sllv $5, $1, $3
2661; O2-NEXT:    nor $6, $zero, $5
2662; O2-NEXT:    sllv $4, $4, $3
2663; O2-NEXT:  $BB8_1: # %entry
2664; O2-NEXT:    # =>This Inner Loop Header: Depth=1
2665; O2-NEXT:    ll $7, 0($2)
2666; O2-NEXT:    addu $8, $7, $4
2667; O2-NEXT:    and $8, $8, $5
2668; O2-NEXT:    and $9, $7, $6
2669; O2-NEXT:    or $9, $9, $8
2670; O2-NEXT:    sc $9, 0($2)
2671; O2-NEXT:    beqz $9, $BB8_1
2672; O2-NEXT:    nop
2673; O2-NEXT:  # %bb.2: # %entry
2674; O2-NEXT:    and $1, $7, $5
2675; O2-NEXT:    srlv $1, $1, $3
2676; O2-NEXT:    sll $1, $1, 24
2677; O2-NEXT:    sra $1, $1, 24
2678; O2-NEXT:  # %bb.3: # %entry
2679; O2-NEXT:    sll $1, $1, 24
2680; O2-NEXT:    jr $ra
2681; O2-NEXT:    sra $2, $1, 24
2682;
2683; O3-LABEL: AtomicLoadAdd8:
2684; O3:       # %bb.0: # %entry
2685; O3-NEXT:    lui $2, %hi(_gp_disp)
2686; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
2687; O3-NEXT:    addu $1, $2, $25
2688; O3-NEXT:    addiu $2, $zero, -4
2689; O3-NEXT:    lw $1, %got(y)($1)
2690; O3-NEXT:    and $2, $1, $2
2691; O3-NEXT:    andi $1, $1, 3
2692; O3-NEXT:    sll $3, $1, 3
2693; O3-NEXT:    ori $1, $zero, 255
2694; O3-NEXT:    sllv $5, $1, $3
2695; O3-NEXT:    sllv $4, $4, $3
2696; O3-NEXT:    nor $6, $zero, $5
2697; O3-NEXT:  $BB8_1: # %entry
2698; O3-NEXT:    # =>This Inner Loop Header: Depth=1
2699; O3-NEXT:    ll $7, 0($2)
2700; O3-NEXT:    addu $8, $7, $4
2701; O3-NEXT:    and $8, $8, $5
2702; O3-NEXT:    and $9, $7, $6
2703; O3-NEXT:    or $9, $9, $8
2704; O3-NEXT:    sc $9, 0($2)
2705; O3-NEXT:    beqz $9, $BB8_1
2706; O3-NEXT:    nop
2707; O3-NEXT:  # %bb.2: # %entry
2708; O3-NEXT:    and $1, $7, $5
2709; O3-NEXT:    srlv $1, $1, $3
2710; O3-NEXT:    sll $1, $1, 24
2711; O3-NEXT:    sra $1, $1, 24
2712; O3-NEXT:  # %bb.3: # %entry
2713; O3-NEXT:    sll $1, $1, 24
2714; O3-NEXT:    jr $ra
2715; O3-NEXT:    sra $2, $1, 24
2716;
2717; MIPS32EB-LABEL: AtomicLoadAdd8:
2718; MIPS32EB:       # %bb.0: # %entry
2719; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
2720; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
2721; MIPS32EB-NEXT:    addu $1, $2, $25
2722; MIPS32EB-NEXT:    lw $1, %got(y)($1)
2723; MIPS32EB-NEXT:    addiu $2, $zero, -4
2724; MIPS32EB-NEXT:    and $2, $1, $2
2725; MIPS32EB-NEXT:    andi $1, $1, 3
2726; MIPS32EB-NEXT:    xori $1, $1, 3
2727; MIPS32EB-NEXT:    sll $3, $1, 3
2728; MIPS32EB-NEXT:    ori $1, $zero, 255
2729; MIPS32EB-NEXT:    sllv $5, $1, $3
2730; MIPS32EB-NEXT:    nor $6, $zero, $5
2731; MIPS32EB-NEXT:    sllv $4, $4, $3
2732; MIPS32EB-NEXT:  $BB8_1: # %entry
2733; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
2734; MIPS32EB-NEXT:    ll $7, 0($2)
2735; MIPS32EB-NEXT:    addu $8, $7, $4
2736; MIPS32EB-NEXT:    and $8, $8, $5
2737; MIPS32EB-NEXT:    and $9, $7, $6
2738; MIPS32EB-NEXT:    or $9, $9, $8
2739; MIPS32EB-NEXT:    sc $9, 0($2)
2740; MIPS32EB-NEXT:    beqz $9, $BB8_1
2741; MIPS32EB-NEXT:    nop
2742; MIPS32EB-NEXT:  # %bb.2: # %entry
2743; MIPS32EB-NEXT:    and $1, $7, $5
2744; MIPS32EB-NEXT:    srlv $1, $1, $3
2745; MIPS32EB-NEXT:    sll $1, $1, 24
2746; MIPS32EB-NEXT:    sra $1, $1, 24
2747; MIPS32EB-NEXT:  # %bb.3: # %entry
2748; MIPS32EB-NEXT:    sll $1, $1, 24
2749; MIPS32EB-NEXT:    jr $ra
2750; MIPS32EB-NEXT:    sra $2, $1, 24
2751entry:
2752  %0 = atomicrmw add i8* @y, i8 %incr monotonic
2753  ret i8 %0
2754}
2755
2756define signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind {
2757; MIPS32-LABEL: AtomicLoadSub8:
2758; MIPS32:       # %bb.0: # %entry
2759; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
2760; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2761; MIPS32-NEXT:    addu $1, $2, $25
2762; MIPS32-NEXT:    lw $1, %got(y)($1)
2763; MIPS32-NEXT:    addiu $2, $zero, -4
2764; MIPS32-NEXT:    and $2, $1, $2
2765; MIPS32-NEXT:    andi $1, $1, 3
2766; MIPS32-NEXT:    sll $3, $1, 3
2767; MIPS32-NEXT:    ori $1, $zero, 255
2768; MIPS32-NEXT:    sllv $5, $1, $3
2769; MIPS32-NEXT:    nor $6, $zero, $5
2770; MIPS32-NEXT:    sllv $4, $4, $3
2771; MIPS32-NEXT:  $BB9_1: # %entry
2772; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
2773; MIPS32-NEXT:    ll $7, 0($2)
2774; MIPS32-NEXT:    subu $8, $7, $4
2775; MIPS32-NEXT:    and $8, $8, $5
2776; MIPS32-NEXT:    and $9, $7, $6
2777; MIPS32-NEXT:    or $9, $9, $8
2778; MIPS32-NEXT:    sc $9, 0($2)
2779; MIPS32-NEXT:    beqz $9, $BB9_1
2780; MIPS32-NEXT:    nop
2781; MIPS32-NEXT:  # %bb.2: # %entry
2782; MIPS32-NEXT:    and $1, $7, $5
2783; MIPS32-NEXT:    srlv $1, $1, $3
2784; MIPS32-NEXT:    sll $1, $1, 24
2785; MIPS32-NEXT:    sra $1, $1, 24
2786; MIPS32-NEXT:  # %bb.3: # %entry
2787; MIPS32-NEXT:    sll $1, $1, 24
2788; MIPS32-NEXT:    jr $ra
2789; MIPS32-NEXT:    sra $2, $1, 24
2790;
2791; MIPS32O0-LABEL: AtomicLoadSub8:
2792; MIPS32O0:       # %bb.0: # %entry
2793; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
2794; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2795; MIPS32O0-NEXT:    addiu $sp, $sp, -8
2796; MIPS32O0-NEXT:    addu $1, $2, $25
2797; MIPS32O0-NEXT:    lw $1, %got(y)($1)
2798; MIPS32O0-NEXT:    addiu $2, $zero, -4
2799; MIPS32O0-NEXT:    and $5, $1, $2
2800; MIPS32O0-NEXT:    andi $1, $1, 3
2801; MIPS32O0-NEXT:    sll $9, $1, 3
2802; MIPS32O0-NEXT:    ori $1, $zero, 255
2803; MIPS32O0-NEXT:    sllv $7, $1, $9
2804; MIPS32O0-NEXT:    nor $8, $zero, $7
2805; MIPS32O0-NEXT:    sllv $6, $4, $9
2806; MIPS32O0-NEXT:  $BB9_1: # %entry
2807; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
2808; MIPS32O0-NEXT:    ll $2, 0($5)
2809; MIPS32O0-NEXT:    subu $3, $2, $6
2810; MIPS32O0-NEXT:    and $3, $3, $7
2811; MIPS32O0-NEXT:    and $4, $2, $8
2812; MIPS32O0-NEXT:    or $4, $4, $3
2813; MIPS32O0-NEXT:    sc $4, 0($5)
2814; MIPS32O0-NEXT:    beqz $4, $BB9_1
2815; MIPS32O0-NEXT:    nop
2816; MIPS32O0-NEXT:  # %bb.2: # %entry
2817; MIPS32O0-NEXT:    and $1, $2, $7
2818; MIPS32O0-NEXT:    srlv $1, $1, $9
2819; MIPS32O0-NEXT:    sll $1, $1, 24
2820; MIPS32O0-NEXT:    sra $1, $1, 24
2821; MIPS32O0-NEXT:  # %bb.3: # %entry
2822; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
2823; MIPS32O0-NEXT:  # %bb.4: # %entry
2824; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2825; MIPS32O0-NEXT:    sll $1, $1, 24
2826; MIPS32O0-NEXT:    sra $2, $1, 24
2827; MIPS32O0-NEXT:    addiu $sp, $sp, 8
2828; MIPS32O0-NEXT:    jr $ra
2829; MIPS32O0-NEXT:    nop
2830;
2831; MIPS32R2-LABEL: AtomicLoadSub8:
2832; MIPS32R2:       # %bb.0: # %entry
2833; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
2834; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2835; MIPS32R2-NEXT:    addu $1, $2, $25
2836; MIPS32R2-NEXT:    lw $1, %got(y)($1)
2837; MIPS32R2-NEXT:    addiu $2, $zero, -4
2838; MIPS32R2-NEXT:    and $2, $1, $2
2839; MIPS32R2-NEXT:    andi $1, $1, 3
2840; MIPS32R2-NEXT:    sll $3, $1, 3
2841; MIPS32R2-NEXT:    ori $1, $zero, 255
2842; MIPS32R2-NEXT:    sllv $5, $1, $3
2843; MIPS32R2-NEXT:    nor $6, $zero, $5
2844; MIPS32R2-NEXT:    sllv $4, $4, $3
2845; MIPS32R2-NEXT:  $BB9_1: # %entry
2846; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
2847; MIPS32R2-NEXT:    ll $7, 0($2)
2848; MIPS32R2-NEXT:    subu $8, $7, $4
2849; MIPS32R2-NEXT:    and $8, $8, $5
2850; MIPS32R2-NEXT:    and $9, $7, $6
2851; MIPS32R2-NEXT:    or $9, $9, $8
2852; MIPS32R2-NEXT:    sc $9, 0($2)
2853; MIPS32R2-NEXT:    beqz $9, $BB9_1
2854; MIPS32R2-NEXT:    nop
2855; MIPS32R2-NEXT:  # %bb.2: # %entry
2856; MIPS32R2-NEXT:    and $1, $7, $5
2857; MIPS32R2-NEXT:    srlv $1, $1, $3
2858; MIPS32R2-NEXT:    seb $1, $1
2859; MIPS32R2-NEXT:  # %bb.3: # %entry
2860; MIPS32R2-NEXT:    jr $ra
2861; MIPS32R2-NEXT:    seb $2, $1
2862;
2863; MIPS32R6-LABEL: AtomicLoadSub8:
2864; MIPS32R6:       # %bb.0: # %entry
2865; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
2866; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
2867; MIPS32R6-NEXT:    addu $1, $2, $25
2868; MIPS32R6-NEXT:    lw $1, %got(y)($1)
2869; MIPS32R6-NEXT:    addiu $2, $zero, -4
2870; MIPS32R6-NEXT:    and $2, $1, $2
2871; MIPS32R6-NEXT:    andi $1, $1, 3
2872; MIPS32R6-NEXT:    sll $3, $1, 3
2873; MIPS32R6-NEXT:    ori $1, $zero, 255
2874; MIPS32R6-NEXT:    sllv $5, $1, $3
2875; MIPS32R6-NEXT:    nor $6, $zero, $5
2876; MIPS32R6-NEXT:    sllv $4, $4, $3
2877; MIPS32R6-NEXT:  $BB9_1: # %entry
2878; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
2879; MIPS32R6-NEXT:    ll $7, 0($2)
2880; MIPS32R6-NEXT:    subu $8, $7, $4
2881; MIPS32R6-NEXT:    and $8, $8, $5
2882; MIPS32R6-NEXT:    and $9, $7, $6
2883; MIPS32R6-NEXT:    or $9, $9, $8
2884; MIPS32R6-NEXT:    sc $9, 0($2)
2885; MIPS32R6-NEXT:    beqzc $9, $BB9_1
2886; MIPS32R6-NEXT:  # %bb.2: # %entry
2887; MIPS32R6-NEXT:    and $1, $7, $5
2888; MIPS32R6-NEXT:    srlv $1, $1, $3
2889; MIPS32R6-NEXT:    seb $1, $1
2890; MIPS32R6-NEXT:  # %bb.3: # %entry
2891; MIPS32R6-NEXT:    jr $ra
2892; MIPS32R6-NEXT:    seb $2, $1
2893;
2894; MIPS32R6O0-LABEL: AtomicLoadSub8:
2895; MIPS32R6O0:       # %bb.0: # %entry
2896; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
2897; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2898; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
2899; MIPS32R6O0-NEXT:    addu $1, $2, $25
2900; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a0
2901; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
2902; MIPS32R6O0-NEXT:    addiu $2, $zero, -4
2903; MIPS32R6O0-NEXT:    and $5, $1, $2
2904; MIPS32R6O0-NEXT:    andi $1, $1, 3
2905; MIPS32R6O0-NEXT:    sll $9, $1, 3
2906; MIPS32R6O0-NEXT:    ori $1, $zero, 255
2907; MIPS32R6O0-NEXT:    sllv $7, $1, $9
2908; MIPS32R6O0-NEXT:    nor $8, $zero, $7
2909; MIPS32R6O0-NEXT:    sllv $6, $4, $9
2910; MIPS32R6O0-NEXT:  $BB9_1: # %entry
2911; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2912; MIPS32R6O0-NEXT:    ll $2, 0($5)
2913; MIPS32R6O0-NEXT:    subu $3, $2, $6
2914; MIPS32R6O0-NEXT:    and $3, $3, $7
2915; MIPS32R6O0-NEXT:    and $4, $2, $8
2916; MIPS32R6O0-NEXT:    or $4, $4, $3
2917; MIPS32R6O0-NEXT:    sc $4, 0($5)
2918; MIPS32R6O0-NEXT:    beqzc $4, $BB9_1
2919; MIPS32R6O0-NEXT:  # %bb.2: # %entry
2920; MIPS32R6O0-NEXT:    and $1, $2, $7
2921; MIPS32R6O0-NEXT:    srlv $1, $1, $9
2922; MIPS32R6O0-NEXT:    seb $1, $1
2923; MIPS32R6O0-NEXT:  # %bb.3: # %entry
2924; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
2925; MIPS32R6O0-NEXT:  # %bb.4: # %entry
2926; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2927; MIPS32R6O0-NEXT:    seb $2, $1
2928; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
2929; MIPS32R6O0-NEXT:    jrc $ra
2930;
2931; MIPS4-LABEL: AtomicLoadSub8:
2932; MIPS4:       # %bb.0: # %entry
2933; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
2934; MIPS4-NEXT:    daddu $1, $1, $25
2935; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
2936; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
2937; MIPS4-NEXT:    daddiu $2, $zero, -4
2938; MIPS4-NEXT:    and $2, $1, $2
2939; MIPS4-NEXT:    andi $1, $1, 3
2940; MIPS4-NEXT:    sll $3, $1, 3
2941; MIPS4-NEXT:    ori $1, $zero, 255
2942; MIPS4-NEXT:    sllv $5, $1, $3
2943; MIPS4-NEXT:    nor $6, $zero, $5
2944; MIPS4-NEXT:    sllv $4, $4, $3
2945; MIPS4-NEXT:  .LBB9_1: # %entry
2946; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2947; MIPS4-NEXT:    ll $7, 0($2)
2948; MIPS4-NEXT:    subu $8, $7, $4
2949; MIPS4-NEXT:    and $8, $8, $5
2950; MIPS4-NEXT:    and $9, $7, $6
2951; MIPS4-NEXT:    or $9, $9, $8
2952; MIPS4-NEXT:    sc $9, 0($2)
2953; MIPS4-NEXT:    beqz $9, .LBB9_1
2954; MIPS4-NEXT:    nop
2955; MIPS4-NEXT:  # %bb.2: # %entry
2956; MIPS4-NEXT:    and $1, $7, $5
2957; MIPS4-NEXT:    srlv $1, $1, $3
2958; MIPS4-NEXT:    sll $1, $1, 24
2959; MIPS4-NEXT:    sra $1, $1, 24
2960; MIPS4-NEXT:  # %bb.3: # %entry
2961; MIPS4-NEXT:    sll $1, $1, 24
2962; MIPS4-NEXT:    jr $ra
2963; MIPS4-NEXT:    sra $2, $1, 24
2964;
2965; MIPS64-LABEL: AtomicLoadSub8:
2966; MIPS64:       # %bb.0: # %entry
2967; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
2968; MIPS64-NEXT:    daddu $1, $1, $25
2969; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
2970; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
2971; MIPS64-NEXT:    daddiu $2, $zero, -4
2972; MIPS64-NEXT:    and $2, $1, $2
2973; MIPS64-NEXT:    andi $1, $1, 3
2974; MIPS64-NEXT:    sll $3, $1, 3
2975; MIPS64-NEXT:    ori $1, $zero, 255
2976; MIPS64-NEXT:    sllv $5, $1, $3
2977; MIPS64-NEXT:    nor $6, $zero, $5
2978; MIPS64-NEXT:    sllv $4, $4, $3
2979; MIPS64-NEXT:  .LBB9_1: # %entry
2980; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2981; MIPS64-NEXT:    ll $7, 0($2)
2982; MIPS64-NEXT:    subu $8, $7, $4
2983; MIPS64-NEXT:    and $8, $8, $5
2984; MIPS64-NEXT:    and $9, $7, $6
2985; MIPS64-NEXT:    or $9, $9, $8
2986; MIPS64-NEXT:    sc $9, 0($2)
2987; MIPS64-NEXT:    beqz $9, .LBB9_1
2988; MIPS64-NEXT:    nop
2989; MIPS64-NEXT:  # %bb.2: # %entry
2990; MIPS64-NEXT:    and $1, $7, $5
2991; MIPS64-NEXT:    srlv $1, $1, $3
2992; MIPS64-NEXT:    sll $1, $1, 24
2993; MIPS64-NEXT:    sra $1, $1, 24
2994; MIPS64-NEXT:  # %bb.3: # %entry
2995; MIPS64-NEXT:    sll $1, $1, 24
2996; MIPS64-NEXT:    jr $ra
2997; MIPS64-NEXT:    sra $2, $1, 24
2998;
2999; MIPS64R2-LABEL: AtomicLoadSub8:
3000; MIPS64R2:       # %bb.0: # %entry
3001; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3002; MIPS64R2-NEXT:    daddu $1, $1, $25
3003; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3004; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
3005; MIPS64R2-NEXT:    daddiu $2, $zero, -4
3006; MIPS64R2-NEXT:    and $2, $1, $2
3007; MIPS64R2-NEXT:    andi $1, $1, 3
3008; MIPS64R2-NEXT:    sll $3, $1, 3
3009; MIPS64R2-NEXT:    ori $1, $zero, 255
3010; MIPS64R2-NEXT:    sllv $5, $1, $3
3011; MIPS64R2-NEXT:    nor $6, $zero, $5
3012; MIPS64R2-NEXT:    sllv $4, $4, $3
3013; MIPS64R2-NEXT:  .LBB9_1: # %entry
3014; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
3015; MIPS64R2-NEXT:    ll $7, 0($2)
3016; MIPS64R2-NEXT:    subu $8, $7, $4
3017; MIPS64R2-NEXT:    and $8, $8, $5
3018; MIPS64R2-NEXT:    and $9, $7, $6
3019; MIPS64R2-NEXT:    or $9, $9, $8
3020; MIPS64R2-NEXT:    sc $9, 0($2)
3021; MIPS64R2-NEXT:    beqz $9, .LBB9_1
3022; MIPS64R2-NEXT:    nop
3023; MIPS64R2-NEXT:  # %bb.2: # %entry
3024; MIPS64R2-NEXT:    and $1, $7, $5
3025; MIPS64R2-NEXT:    srlv $1, $1, $3
3026; MIPS64R2-NEXT:    seb $1, $1
3027; MIPS64R2-NEXT:  # %bb.3: # %entry
3028; MIPS64R2-NEXT:    jr $ra
3029; MIPS64R2-NEXT:    seb $2, $1
3030;
3031; MIPS64R6-LABEL: AtomicLoadSub8:
3032; MIPS64R6:       # %bb.0: # %entry
3033; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3034; MIPS64R6-NEXT:    daddu $1, $1, $25
3035; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3036; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
3037; MIPS64R6-NEXT:    daddiu $2, $zero, -4
3038; MIPS64R6-NEXT:    and $2, $1, $2
3039; MIPS64R6-NEXT:    andi $1, $1, 3
3040; MIPS64R6-NEXT:    sll $3, $1, 3
3041; MIPS64R6-NEXT:    ori $1, $zero, 255
3042; MIPS64R6-NEXT:    sllv $5, $1, $3
3043; MIPS64R6-NEXT:    nor $6, $zero, $5
3044; MIPS64R6-NEXT:    sllv $4, $4, $3
3045; MIPS64R6-NEXT:  .LBB9_1: # %entry
3046; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
3047; MIPS64R6-NEXT:    ll $7, 0($2)
3048; MIPS64R6-NEXT:    subu $8, $7, $4
3049; MIPS64R6-NEXT:    and $8, $8, $5
3050; MIPS64R6-NEXT:    and $9, $7, $6
3051; MIPS64R6-NEXT:    or $9, $9, $8
3052; MIPS64R6-NEXT:    sc $9, 0($2)
3053; MIPS64R6-NEXT:    beqzc $9, .LBB9_1
3054; MIPS64R6-NEXT:  # %bb.2: # %entry
3055; MIPS64R6-NEXT:    and $1, $7, $5
3056; MIPS64R6-NEXT:    srlv $1, $1, $3
3057; MIPS64R6-NEXT:    seb $1, $1
3058; MIPS64R6-NEXT:  # %bb.3: # %entry
3059; MIPS64R6-NEXT:    jr $ra
3060; MIPS64R6-NEXT:    seb $2, $1
3061;
3062; MIPS64R6O0-LABEL: AtomicLoadSub8:
3063; MIPS64R6O0:       # %bb.0: # %entry
3064; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
3065; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3066; MIPS64R6O0-NEXT:    daddu $1, $1, $25
3067; MIPS64R6O0-NEXT:    daddiu $2, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3068; MIPS64R6O0-NEXT:    move $1, $4
3069; MIPS64R6O0-NEXT:    ld $2, %got_disp(y)($2)
3070; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
3071; MIPS64R6O0-NEXT:    and $5, $2, $3
3072; MIPS64R6O0-NEXT:    andi $2, $2, 3
3073; MIPS64R6O0-NEXT:    xori $2, $2, 3
3074; MIPS64R6O0-NEXT:    sll $9, $2, 3
3075; MIPS64R6O0-NEXT:    ori $2, $zero, 255
3076; MIPS64R6O0-NEXT:    sllv $7, $2, $9
3077; MIPS64R6O0-NEXT:    nor $8, $zero, $7
3078; MIPS64R6O0-NEXT:    sllv $6, $1, $9
3079; MIPS64R6O0-NEXT:  .LBB9_1: # %entry
3080; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3081; MIPS64R6O0-NEXT:    ll $2, 0($5)
3082; MIPS64R6O0-NEXT:    subu $3, $2, $6
3083; MIPS64R6O0-NEXT:    and $3, $3, $7
3084; MIPS64R6O0-NEXT:    and $4, $2, $8
3085; MIPS64R6O0-NEXT:    or $4, $4, $3
3086; MIPS64R6O0-NEXT:    sc $4, 0($5)
3087; MIPS64R6O0-NEXT:    beqzc $4, .LBB9_1
3088; MIPS64R6O0-NEXT:  # %bb.2: # %entry
3089; MIPS64R6O0-NEXT:    and $1, $2, $7
3090; MIPS64R6O0-NEXT:    srlv $1, $1, $9
3091; MIPS64R6O0-NEXT:    seb $1, $1
3092; MIPS64R6O0-NEXT:  # %bb.3: # %entry
3093; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
3094; MIPS64R6O0-NEXT:  # %bb.4: # %entry
3095; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
3096; MIPS64R6O0-NEXT:    seb $2, $1
3097; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
3098; MIPS64R6O0-NEXT:    jrc $ra
3099;
3100; MM32-LABEL: AtomicLoadSub8:
3101; MM32:       # %bb.0: # %entry
3102; MM32-NEXT:    lui $2, %hi(_gp_disp)
3103; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3104; MM32-NEXT:    addu $2, $2, $25
3105; MM32-NEXT:    lw $1, %got(y)($2)
3106; MM32-NEXT:    addiu $2, $zero, -4
3107; MM32-NEXT:    and $2, $1, $2
3108; MM32-NEXT:    andi $1, $1, 3
3109; MM32-NEXT:    sll $3, $1, 3
3110; MM32-NEXT:    ori $1, $zero, 255
3111; MM32-NEXT:    sllv $5, $1, $3
3112; MM32-NEXT:    nor $6, $zero, $5
3113; MM32-NEXT:    sllv $4, $4, $3
3114; MM32-NEXT:  $BB9_1: # %entry
3115; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
3116; MM32-NEXT:    ll $7, 0($2)
3117; MM32-NEXT:    subu $8, $7, $4
3118; MM32-NEXT:    and $8, $8, $5
3119; MM32-NEXT:    and $9, $7, $6
3120; MM32-NEXT:    or $9, $9, $8
3121; MM32-NEXT:    sc $9, 0($2)
3122; MM32-NEXT:    beqzc $9, $BB9_1
3123; MM32-NEXT:  # %bb.2: # %entry
3124; MM32-NEXT:    and $1, $7, $5
3125; MM32-NEXT:    srlv $1, $1, $3
3126; MM32-NEXT:    seb $1, $1
3127; MM32-NEXT:  # %bb.3: # %entry
3128; MM32-NEXT:    jr $ra
3129; MM32-NEXT:    seb $2, $1
3130;
3131; O1-LABEL: AtomicLoadSub8:
3132; O1:       # %bb.0: # %entry
3133; O1-NEXT:    lui $2, %hi(_gp_disp)
3134; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
3135; O1-NEXT:    addu $1, $2, $25
3136; O1-NEXT:    lw $1, %got(y)($1)
3137; O1-NEXT:    addiu $2, $zero, -4
3138; O1-NEXT:    and $2, $1, $2
3139; O1-NEXT:    andi $1, $1, 3
3140; O1-NEXT:    sll $3, $1, 3
3141; O1-NEXT:    ori $1, $zero, 255
3142; O1-NEXT:    sllv $5, $1, $3
3143; O1-NEXT:    nor $6, $zero, $5
3144; O1-NEXT:    sllv $4, $4, $3
3145; O1-NEXT:  $BB9_1: # %entry
3146; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3147; O1-NEXT:    ll $7, 0($2)
3148; O1-NEXT:    subu $8, $7, $4
3149; O1-NEXT:    and $8, $8, $5
3150; O1-NEXT:    and $9, $7, $6
3151; O1-NEXT:    or $9, $9, $8
3152; O1-NEXT:    sc $9, 0($2)
3153; O1-NEXT:    beqz $9, $BB9_1
3154; O1-NEXT:    nop
3155; O1-NEXT:  # %bb.2: # %entry
3156; O1-NEXT:    and $1, $7, $5
3157; O1-NEXT:    srlv $1, $1, $3
3158; O1-NEXT:    sll $1, $1, 24
3159; O1-NEXT:    sra $1, $1, 24
3160; O1-NEXT:  # %bb.3: # %entry
3161; O1-NEXT:    sll $1, $1, 24
3162; O1-NEXT:    jr $ra
3163; O1-NEXT:    sra $2, $1, 24
3164;
3165; O2-LABEL: AtomicLoadSub8:
3166; O2:       # %bb.0: # %entry
3167; O2-NEXT:    lui $2, %hi(_gp_disp)
3168; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3169; O2-NEXT:    addu $1, $2, $25
3170; O2-NEXT:    lw $1, %got(y)($1)
3171; O2-NEXT:    addiu $2, $zero, -4
3172; O2-NEXT:    and $2, $1, $2
3173; O2-NEXT:    andi $1, $1, 3
3174; O2-NEXT:    sll $3, $1, 3
3175; O2-NEXT:    ori $1, $zero, 255
3176; O2-NEXT:    sllv $5, $1, $3
3177; O2-NEXT:    nor $6, $zero, $5
3178; O2-NEXT:    sllv $4, $4, $3
3179; O2-NEXT:  $BB9_1: # %entry
3180; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3181; O2-NEXT:    ll $7, 0($2)
3182; O2-NEXT:    subu $8, $7, $4
3183; O2-NEXT:    and $8, $8, $5
3184; O2-NEXT:    and $9, $7, $6
3185; O2-NEXT:    or $9, $9, $8
3186; O2-NEXT:    sc $9, 0($2)
3187; O2-NEXT:    beqz $9, $BB9_1
3188; O2-NEXT:    nop
3189; O2-NEXT:  # %bb.2: # %entry
3190; O2-NEXT:    and $1, $7, $5
3191; O2-NEXT:    srlv $1, $1, $3
3192; O2-NEXT:    sll $1, $1, 24
3193; O2-NEXT:    sra $1, $1, 24
3194; O2-NEXT:  # %bb.3: # %entry
3195; O2-NEXT:    sll $1, $1, 24
3196; O2-NEXT:    jr $ra
3197; O2-NEXT:    sra $2, $1, 24
3198;
3199; O3-LABEL: AtomicLoadSub8:
3200; O3:       # %bb.0: # %entry
3201; O3-NEXT:    lui $2, %hi(_gp_disp)
3202; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
3203; O3-NEXT:    addu $1, $2, $25
3204; O3-NEXT:    addiu $2, $zero, -4
3205; O3-NEXT:    lw $1, %got(y)($1)
3206; O3-NEXT:    and $2, $1, $2
3207; O3-NEXT:    andi $1, $1, 3
3208; O3-NEXT:    sll $3, $1, 3
3209; O3-NEXT:    ori $1, $zero, 255
3210; O3-NEXT:    sllv $5, $1, $3
3211; O3-NEXT:    sllv $4, $4, $3
3212; O3-NEXT:    nor $6, $zero, $5
3213; O3-NEXT:  $BB9_1: # %entry
3214; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3215; O3-NEXT:    ll $7, 0($2)
3216; O3-NEXT:    subu $8, $7, $4
3217; O3-NEXT:    and $8, $8, $5
3218; O3-NEXT:    and $9, $7, $6
3219; O3-NEXT:    or $9, $9, $8
3220; O3-NEXT:    sc $9, 0($2)
3221; O3-NEXT:    beqz $9, $BB9_1
3222; O3-NEXT:    nop
3223; O3-NEXT:  # %bb.2: # %entry
3224; O3-NEXT:    and $1, $7, $5
3225; O3-NEXT:    srlv $1, $1, $3
3226; O3-NEXT:    sll $1, $1, 24
3227; O3-NEXT:    sra $1, $1, 24
3228; O3-NEXT:  # %bb.3: # %entry
3229; O3-NEXT:    sll $1, $1, 24
3230; O3-NEXT:    jr $ra
3231; O3-NEXT:    sra $2, $1, 24
3232;
3233; MIPS32EB-LABEL: AtomicLoadSub8:
3234; MIPS32EB:       # %bb.0: # %entry
3235; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
3236; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
3237; MIPS32EB-NEXT:    addu $1, $2, $25
3238; MIPS32EB-NEXT:    lw $1, %got(y)($1)
3239; MIPS32EB-NEXT:    addiu $2, $zero, -4
3240; MIPS32EB-NEXT:    and $2, $1, $2
3241; MIPS32EB-NEXT:    andi $1, $1, 3
3242; MIPS32EB-NEXT:    xori $1, $1, 3
3243; MIPS32EB-NEXT:    sll $3, $1, 3
3244; MIPS32EB-NEXT:    ori $1, $zero, 255
3245; MIPS32EB-NEXT:    sllv $5, $1, $3
3246; MIPS32EB-NEXT:    nor $6, $zero, $5
3247; MIPS32EB-NEXT:    sllv $4, $4, $3
3248; MIPS32EB-NEXT:  $BB9_1: # %entry
3249; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
3250; MIPS32EB-NEXT:    ll $7, 0($2)
3251; MIPS32EB-NEXT:    subu $8, $7, $4
3252; MIPS32EB-NEXT:    and $8, $8, $5
3253; MIPS32EB-NEXT:    and $9, $7, $6
3254; MIPS32EB-NEXT:    or $9, $9, $8
3255; MIPS32EB-NEXT:    sc $9, 0($2)
3256; MIPS32EB-NEXT:    beqz $9, $BB9_1
3257; MIPS32EB-NEXT:    nop
3258; MIPS32EB-NEXT:  # %bb.2: # %entry
3259; MIPS32EB-NEXT:    and $1, $7, $5
3260; MIPS32EB-NEXT:    srlv $1, $1, $3
3261; MIPS32EB-NEXT:    sll $1, $1, 24
3262; MIPS32EB-NEXT:    sra $1, $1, 24
3263; MIPS32EB-NEXT:  # %bb.3: # %entry
3264; MIPS32EB-NEXT:    sll $1, $1, 24
3265; MIPS32EB-NEXT:    jr $ra
3266; MIPS32EB-NEXT:    sra $2, $1, 24
3267entry:
3268  %0 = atomicrmw sub i8* @y, i8 %incr monotonic
3269  ret i8 %0
3270
3271}
3272
3273define signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind {
3274; MIPS32-LABEL: AtomicLoadNand8:
3275; MIPS32:       # %bb.0: # %entry
3276; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
3277; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3278; MIPS32-NEXT:    addu $1, $2, $25
3279; MIPS32-NEXT:    lw $1, %got(y)($1)
3280; MIPS32-NEXT:    addiu $2, $zero, -4
3281; MIPS32-NEXT:    and $2, $1, $2
3282; MIPS32-NEXT:    andi $1, $1, 3
3283; MIPS32-NEXT:    sll $3, $1, 3
3284; MIPS32-NEXT:    ori $1, $zero, 255
3285; MIPS32-NEXT:    sllv $5, $1, $3
3286; MIPS32-NEXT:    nor $6, $zero, $5
3287; MIPS32-NEXT:    sllv $4, $4, $3
3288; MIPS32-NEXT:  $BB10_1: # %entry
3289; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
3290; MIPS32-NEXT:    ll $7, 0($2)
3291; MIPS32-NEXT:    and $8, $7, $4
3292; MIPS32-NEXT:    nor $8, $zero, $8
3293; MIPS32-NEXT:    and $8, $8, $5
3294; MIPS32-NEXT:    and $9, $7, $6
3295; MIPS32-NEXT:    or $9, $9, $8
3296; MIPS32-NEXT:    sc $9, 0($2)
3297; MIPS32-NEXT:    beqz $9, $BB10_1
3298; MIPS32-NEXT:    nop
3299; MIPS32-NEXT:  # %bb.2: # %entry
3300; MIPS32-NEXT:    and $1, $7, $5
3301; MIPS32-NEXT:    srlv $1, $1, $3
3302; MIPS32-NEXT:    sll $1, $1, 24
3303; MIPS32-NEXT:    sra $1, $1, 24
3304; MIPS32-NEXT:  # %bb.3: # %entry
3305; MIPS32-NEXT:    sll $1, $1, 24
3306; MIPS32-NEXT:    jr $ra
3307; MIPS32-NEXT:    sra $2, $1, 24
3308;
3309; MIPS32O0-LABEL: AtomicLoadNand8:
3310; MIPS32O0:       # %bb.0: # %entry
3311; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
3312; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3313; MIPS32O0-NEXT:    addiu $sp, $sp, -8
3314; MIPS32O0-NEXT:    addu $1, $2, $25
3315; MIPS32O0-NEXT:    lw $1, %got(y)($1)
3316; MIPS32O0-NEXT:    addiu $2, $zero, -4
3317; MIPS32O0-NEXT:    and $5, $1, $2
3318; MIPS32O0-NEXT:    andi $1, $1, 3
3319; MIPS32O0-NEXT:    sll $9, $1, 3
3320; MIPS32O0-NEXT:    ori $1, $zero, 255
3321; MIPS32O0-NEXT:    sllv $7, $1, $9
3322; MIPS32O0-NEXT:    nor $8, $zero, $7
3323; MIPS32O0-NEXT:    sllv $6, $4, $9
3324; MIPS32O0-NEXT:  $BB10_1: # %entry
3325; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
3326; MIPS32O0-NEXT:    ll $2, 0($5)
3327; MIPS32O0-NEXT:    and $3, $2, $6
3328; MIPS32O0-NEXT:    nor $3, $zero, $3
3329; MIPS32O0-NEXT:    and $3, $3, $7
3330; MIPS32O0-NEXT:    and $4, $2, $8
3331; MIPS32O0-NEXT:    or $4, $4, $3
3332; MIPS32O0-NEXT:    sc $4, 0($5)
3333; MIPS32O0-NEXT:    beqz $4, $BB10_1
3334; MIPS32O0-NEXT:    nop
3335; MIPS32O0-NEXT:  # %bb.2: # %entry
3336; MIPS32O0-NEXT:    and $1, $2, $7
3337; MIPS32O0-NEXT:    srlv $1, $1, $9
3338; MIPS32O0-NEXT:    sll $1, $1, 24
3339; MIPS32O0-NEXT:    sra $1, $1, 24
3340; MIPS32O0-NEXT:  # %bb.3: # %entry
3341; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
3342; MIPS32O0-NEXT:  # %bb.4: # %entry
3343; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3344; MIPS32O0-NEXT:    sll $1, $1, 24
3345; MIPS32O0-NEXT:    sra $2, $1, 24
3346; MIPS32O0-NEXT:    addiu $sp, $sp, 8
3347; MIPS32O0-NEXT:    jr $ra
3348; MIPS32O0-NEXT:    nop
3349;
3350; MIPS32R2-LABEL: AtomicLoadNand8:
3351; MIPS32R2:       # %bb.0: # %entry
3352; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
3353; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3354; MIPS32R2-NEXT:    addu $1, $2, $25
3355; MIPS32R2-NEXT:    lw $1, %got(y)($1)
3356; MIPS32R2-NEXT:    addiu $2, $zero, -4
3357; MIPS32R2-NEXT:    and $2, $1, $2
3358; MIPS32R2-NEXT:    andi $1, $1, 3
3359; MIPS32R2-NEXT:    sll $3, $1, 3
3360; MIPS32R2-NEXT:    ori $1, $zero, 255
3361; MIPS32R2-NEXT:    sllv $5, $1, $3
3362; MIPS32R2-NEXT:    nor $6, $zero, $5
3363; MIPS32R2-NEXT:    sllv $4, $4, $3
3364; MIPS32R2-NEXT:  $BB10_1: # %entry
3365; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
3366; MIPS32R2-NEXT:    ll $7, 0($2)
3367; MIPS32R2-NEXT:    and $8, $7, $4
3368; MIPS32R2-NEXT:    nor $8, $zero, $8
3369; MIPS32R2-NEXT:    and $8, $8, $5
3370; MIPS32R2-NEXT:    and $9, $7, $6
3371; MIPS32R2-NEXT:    or $9, $9, $8
3372; MIPS32R2-NEXT:    sc $9, 0($2)
3373; MIPS32R2-NEXT:    beqz $9, $BB10_1
3374; MIPS32R2-NEXT:    nop
3375; MIPS32R2-NEXT:  # %bb.2: # %entry
3376; MIPS32R2-NEXT:    and $1, $7, $5
3377; MIPS32R2-NEXT:    srlv $1, $1, $3
3378; MIPS32R2-NEXT:    seb $1, $1
3379; MIPS32R2-NEXT:  # %bb.3: # %entry
3380; MIPS32R2-NEXT:    jr $ra
3381; MIPS32R2-NEXT:    seb $2, $1
3382;
3383; MIPS32R6-LABEL: AtomicLoadNand8:
3384; MIPS32R6:       # %bb.0: # %entry
3385; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
3386; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
3387; MIPS32R6-NEXT:    addu $1, $2, $25
3388; MIPS32R6-NEXT:    lw $1, %got(y)($1)
3389; MIPS32R6-NEXT:    addiu $2, $zero, -4
3390; MIPS32R6-NEXT:    and $2, $1, $2
3391; MIPS32R6-NEXT:    andi $1, $1, 3
3392; MIPS32R6-NEXT:    sll $3, $1, 3
3393; MIPS32R6-NEXT:    ori $1, $zero, 255
3394; MIPS32R6-NEXT:    sllv $5, $1, $3
3395; MIPS32R6-NEXT:    nor $6, $zero, $5
3396; MIPS32R6-NEXT:    sllv $4, $4, $3
3397; MIPS32R6-NEXT:  $BB10_1: # %entry
3398; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
3399; MIPS32R6-NEXT:    ll $7, 0($2)
3400; MIPS32R6-NEXT:    and $8, $7, $4
3401; MIPS32R6-NEXT:    nor $8, $zero, $8
3402; MIPS32R6-NEXT:    and $8, $8, $5
3403; MIPS32R6-NEXT:    and $9, $7, $6
3404; MIPS32R6-NEXT:    or $9, $9, $8
3405; MIPS32R6-NEXT:    sc $9, 0($2)
3406; MIPS32R6-NEXT:    beqzc $9, $BB10_1
3407; MIPS32R6-NEXT:  # %bb.2: # %entry
3408; MIPS32R6-NEXT:    and $1, $7, $5
3409; MIPS32R6-NEXT:    srlv $1, $1, $3
3410; MIPS32R6-NEXT:    seb $1, $1
3411; MIPS32R6-NEXT:  # %bb.3: # %entry
3412; MIPS32R6-NEXT:    jr $ra
3413; MIPS32R6-NEXT:    seb $2, $1
3414;
3415; MIPS32R6O0-LABEL: AtomicLoadNand8:
3416; MIPS32R6O0:       # %bb.0: # %entry
3417; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
3418; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3419; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
3420; MIPS32R6O0-NEXT:    addu $1, $2, $25
3421; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a0
3422; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
3423; MIPS32R6O0-NEXT:    addiu $2, $zero, -4
3424; MIPS32R6O0-NEXT:    and $5, $1, $2
3425; MIPS32R6O0-NEXT:    andi $1, $1, 3
3426; MIPS32R6O0-NEXT:    sll $9, $1, 3
3427; MIPS32R6O0-NEXT:    ori $1, $zero, 255
3428; MIPS32R6O0-NEXT:    sllv $7, $1, $9
3429; MIPS32R6O0-NEXT:    nor $8, $zero, $7
3430; MIPS32R6O0-NEXT:    sllv $6, $4, $9
3431; MIPS32R6O0-NEXT:  $BB10_1: # %entry
3432; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3433; MIPS32R6O0-NEXT:    ll $2, 0($5)
3434; MIPS32R6O0-NEXT:    and $3, $2, $6
3435; MIPS32R6O0-NEXT:    nor $3, $zero, $3
3436; MIPS32R6O0-NEXT:    and $3, $3, $7
3437; MIPS32R6O0-NEXT:    and $4, $2, $8
3438; MIPS32R6O0-NEXT:    or $4, $4, $3
3439; MIPS32R6O0-NEXT:    sc $4, 0($5)
3440; MIPS32R6O0-NEXT:    beqzc $4, $BB10_1
3441; MIPS32R6O0-NEXT:  # %bb.2: # %entry
3442; MIPS32R6O0-NEXT:    and $1, $2, $7
3443; MIPS32R6O0-NEXT:    srlv $1, $1, $9
3444; MIPS32R6O0-NEXT:    seb $1, $1
3445; MIPS32R6O0-NEXT:  # %bb.3: # %entry
3446; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
3447; MIPS32R6O0-NEXT:  # %bb.4: # %entry
3448; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3449; MIPS32R6O0-NEXT:    seb $2, $1
3450; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
3451; MIPS32R6O0-NEXT:    jrc $ra
3452;
3453; MIPS4-LABEL: AtomicLoadNand8:
3454; MIPS4:       # %bb.0: # %entry
3455; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3456; MIPS4-NEXT:    daddu $1, $1, $25
3457; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3458; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
3459; MIPS4-NEXT:    daddiu $2, $zero, -4
3460; MIPS4-NEXT:    and $2, $1, $2
3461; MIPS4-NEXT:    andi $1, $1, 3
3462; MIPS4-NEXT:    sll $3, $1, 3
3463; MIPS4-NEXT:    ori $1, $zero, 255
3464; MIPS4-NEXT:    sllv $5, $1, $3
3465; MIPS4-NEXT:    nor $6, $zero, $5
3466; MIPS4-NEXT:    sllv $4, $4, $3
3467; MIPS4-NEXT:  .LBB10_1: # %entry
3468; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
3469; MIPS4-NEXT:    ll $7, 0($2)
3470; MIPS4-NEXT:    and $8, $7, $4
3471; MIPS4-NEXT:    nor $8, $zero, $8
3472; MIPS4-NEXT:    and $8, $8, $5
3473; MIPS4-NEXT:    and $9, $7, $6
3474; MIPS4-NEXT:    or $9, $9, $8
3475; MIPS4-NEXT:    sc $9, 0($2)
3476; MIPS4-NEXT:    beqz $9, .LBB10_1
3477; MIPS4-NEXT:    nop
3478; MIPS4-NEXT:  # %bb.2: # %entry
3479; MIPS4-NEXT:    and $1, $7, $5
3480; MIPS4-NEXT:    srlv $1, $1, $3
3481; MIPS4-NEXT:    sll $1, $1, 24
3482; MIPS4-NEXT:    sra $1, $1, 24
3483; MIPS4-NEXT:  # %bb.3: # %entry
3484; MIPS4-NEXT:    sll $1, $1, 24
3485; MIPS4-NEXT:    jr $ra
3486; MIPS4-NEXT:    sra $2, $1, 24
3487;
3488; MIPS64-LABEL: AtomicLoadNand8:
3489; MIPS64:       # %bb.0: # %entry
3490; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3491; MIPS64-NEXT:    daddu $1, $1, $25
3492; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3493; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
3494; MIPS64-NEXT:    daddiu $2, $zero, -4
3495; MIPS64-NEXT:    and $2, $1, $2
3496; MIPS64-NEXT:    andi $1, $1, 3
3497; MIPS64-NEXT:    sll $3, $1, 3
3498; MIPS64-NEXT:    ori $1, $zero, 255
3499; MIPS64-NEXT:    sllv $5, $1, $3
3500; MIPS64-NEXT:    nor $6, $zero, $5
3501; MIPS64-NEXT:    sllv $4, $4, $3
3502; MIPS64-NEXT:  .LBB10_1: # %entry
3503; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
3504; MIPS64-NEXT:    ll $7, 0($2)
3505; MIPS64-NEXT:    and $8, $7, $4
3506; MIPS64-NEXT:    nor $8, $zero, $8
3507; MIPS64-NEXT:    and $8, $8, $5
3508; MIPS64-NEXT:    and $9, $7, $6
3509; MIPS64-NEXT:    or $9, $9, $8
3510; MIPS64-NEXT:    sc $9, 0($2)
3511; MIPS64-NEXT:    beqz $9, .LBB10_1
3512; MIPS64-NEXT:    nop
3513; MIPS64-NEXT:  # %bb.2: # %entry
3514; MIPS64-NEXT:    and $1, $7, $5
3515; MIPS64-NEXT:    srlv $1, $1, $3
3516; MIPS64-NEXT:    sll $1, $1, 24
3517; MIPS64-NEXT:    sra $1, $1, 24
3518; MIPS64-NEXT:  # %bb.3: # %entry
3519; MIPS64-NEXT:    sll $1, $1, 24
3520; MIPS64-NEXT:    jr $ra
3521; MIPS64-NEXT:    sra $2, $1, 24
3522;
3523; MIPS64R2-LABEL: AtomicLoadNand8:
3524; MIPS64R2:       # %bb.0: # %entry
3525; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3526; MIPS64R2-NEXT:    daddu $1, $1, $25
3527; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3528; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
3529; MIPS64R2-NEXT:    daddiu $2, $zero, -4
3530; MIPS64R2-NEXT:    and $2, $1, $2
3531; MIPS64R2-NEXT:    andi $1, $1, 3
3532; MIPS64R2-NEXT:    sll $3, $1, 3
3533; MIPS64R2-NEXT:    ori $1, $zero, 255
3534; MIPS64R2-NEXT:    sllv $5, $1, $3
3535; MIPS64R2-NEXT:    nor $6, $zero, $5
3536; MIPS64R2-NEXT:    sllv $4, $4, $3
3537; MIPS64R2-NEXT:  .LBB10_1: # %entry
3538; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
3539; MIPS64R2-NEXT:    ll $7, 0($2)
3540; MIPS64R2-NEXT:    and $8, $7, $4
3541; MIPS64R2-NEXT:    nor $8, $zero, $8
3542; MIPS64R2-NEXT:    and $8, $8, $5
3543; MIPS64R2-NEXT:    and $9, $7, $6
3544; MIPS64R2-NEXT:    or $9, $9, $8
3545; MIPS64R2-NEXT:    sc $9, 0($2)
3546; MIPS64R2-NEXT:    beqz $9, .LBB10_1
3547; MIPS64R2-NEXT:    nop
3548; MIPS64R2-NEXT:  # %bb.2: # %entry
3549; MIPS64R2-NEXT:    and $1, $7, $5
3550; MIPS64R2-NEXT:    srlv $1, $1, $3
3551; MIPS64R2-NEXT:    seb $1, $1
3552; MIPS64R2-NEXT:  # %bb.3: # %entry
3553; MIPS64R2-NEXT:    jr $ra
3554; MIPS64R2-NEXT:    seb $2, $1
3555;
3556; MIPS64R6-LABEL: AtomicLoadNand8:
3557; MIPS64R6:       # %bb.0: # %entry
3558; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3559; MIPS64R6-NEXT:    daddu $1, $1, $25
3560; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3561; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
3562; MIPS64R6-NEXT:    daddiu $2, $zero, -4
3563; MIPS64R6-NEXT:    and $2, $1, $2
3564; MIPS64R6-NEXT:    andi $1, $1, 3
3565; MIPS64R6-NEXT:    sll $3, $1, 3
3566; MIPS64R6-NEXT:    ori $1, $zero, 255
3567; MIPS64R6-NEXT:    sllv $5, $1, $3
3568; MIPS64R6-NEXT:    nor $6, $zero, $5
3569; MIPS64R6-NEXT:    sllv $4, $4, $3
3570; MIPS64R6-NEXT:  .LBB10_1: # %entry
3571; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
3572; MIPS64R6-NEXT:    ll $7, 0($2)
3573; MIPS64R6-NEXT:    and $8, $7, $4
3574; MIPS64R6-NEXT:    nor $8, $zero, $8
3575; MIPS64R6-NEXT:    and $8, $8, $5
3576; MIPS64R6-NEXT:    and $9, $7, $6
3577; MIPS64R6-NEXT:    or $9, $9, $8
3578; MIPS64R6-NEXT:    sc $9, 0($2)
3579; MIPS64R6-NEXT:    beqzc $9, .LBB10_1
3580; MIPS64R6-NEXT:  # %bb.2: # %entry
3581; MIPS64R6-NEXT:    and $1, $7, $5
3582; MIPS64R6-NEXT:    srlv $1, $1, $3
3583; MIPS64R6-NEXT:    seb $1, $1
3584; MIPS64R6-NEXT:  # %bb.3: # %entry
3585; MIPS64R6-NEXT:    jr $ra
3586; MIPS64R6-NEXT:    seb $2, $1
3587;
3588; MIPS64R6O0-LABEL: AtomicLoadNand8:
3589; MIPS64R6O0:       # %bb.0: # %entry
3590; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
3591; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3592; MIPS64R6O0-NEXT:    daddu $1, $1, $25
3593; MIPS64R6O0-NEXT:    daddiu $2, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3594; MIPS64R6O0-NEXT:    move $1, $4
3595; MIPS64R6O0-NEXT:    ld $2, %got_disp(y)($2)
3596; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
3597; MIPS64R6O0-NEXT:    and $5, $2, $3
3598; MIPS64R6O0-NEXT:    andi $2, $2, 3
3599; MIPS64R6O0-NEXT:    xori $2, $2, 3
3600; MIPS64R6O0-NEXT:    sll $9, $2, 3
3601; MIPS64R6O0-NEXT:    ori $2, $zero, 255
3602; MIPS64R6O0-NEXT:    sllv $7, $2, $9
3603; MIPS64R6O0-NEXT:    nor $8, $zero, $7
3604; MIPS64R6O0-NEXT:    sllv $6, $1, $9
3605; MIPS64R6O0-NEXT:  .LBB10_1: # %entry
3606; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3607; MIPS64R6O0-NEXT:    ll $2, 0($5)
3608; MIPS64R6O0-NEXT:    and $3, $2, $6
3609; MIPS64R6O0-NEXT:    nor $3, $zero, $3
3610; MIPS64R6O0-NEXT:    and $3, $3, $7
3611; MIPS64R6O0-NEXT:    and $4, $2, $8
3612; MIPS64R6O0-NEXT:    or $4, $4, $3
3613; MIPS64R6O0-NEXT:    sc $4, 0($5)
3614; MIPS64R6O0-NEXT:    beqzc $4, .LBB10_1
3615; MIPS64R6O0-NEXT:  # %bb.2: # %entry
3616; MIPS64R6O0-NEXT:    and $1, $2, $7
3617; MIPS64R6O0-NEXT:    srlv $1, $1, $9
3618; MIPS64R6O0-NEXT:    seb $1, $1
3619; MIPS64R6O0-NEXT:  # %bb.3: # %entry
3620; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
3621; MIPS64R6O0-NEXT:  # %bb.4: # %entry
3622; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
3623; MIPS64R6O0-NEXT:    seb $2, $1
3624; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
3625; MIPS64R6O0-NEXT:    jrc $ra
3626;
3627; MM32-LABEL: AtomicLoadNand8:
3628; MM32:       # %bb.0: # %entry
3629; MM32-NEXT:    lui $2, %hi(_gp_disp)
3630; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3631; MM32-NEXT:    addu $2, $2, $25
3632; MM32-NEXT:    lw $1, %got(y)($2)
3633; MM32-NEXT:    addiu $2, $zero, -4
3634; MM32-NEXT:    and $2, $1, $2
3635; MM32-NEXT:    andi $1, $1, 3
3636; MM32-NEXT:    sll $3, $1, 3
3637; MM32-NEXT:    ori $1, $zero, 255
3638; MM32-NEXT:    sllv $5, $1, $3
3639; MM32-NEXT:    nor $6, $zero, $5
3640; MM32-NEXT:    sllv $4, $4, $3
3641; MM32-NEXT:  $BB10_1: # %entry
3642; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
3643; MM32-NEXT:    ll $7, 0($2)
3644; MM32-NEXT:    and $8, $7, $4
3645; MM32-NEXT:    nor $8, $zero, $8
3646; MM32-NEXT:    and $8, $8, $5
3647; MM32-NEXT:    and $9, $7, $6
3648; MM32-NEXT:    or $9, $9, $8
3649; MM32-NEXT:    sc $9, 0($2)
3650; MM32-NEXT:    beqzc $9, $BB10_1
3651; MM32-NEXT:  # %bb.2: # %entry
3652; MM32-NEXT:    and $1, $7, $5
3653; MM32-NEXT:    srlv $1, $1, $3
3654; MM32-NEXT:    seb $1, $1
3655; MM32-NEXT:  # %bb.3: # %entry
3656; MM32-NEXT:    jr $ra
3657; MM32-NEXT:    seb $2, $1
3658;
3659; O1-LABEL: AtomicLoadNand8:
3660; O1:       # %bb.0: # %entry
3661; O1-NEXT:    lui $2, %hi(_gp_disp)
3662; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
3663; O1-NEXT:    addu $1, $2, $25
3664; O1-NEXT:    lw $1, %got(y)($1)
3665; O1-NEXT:    addiu $2, $zero, -4
3666; O1-NEXT:    and $2, $1, $2
3667; O1-NEXT:    andi $1, $1, 3
3668; O1-NEXT:    sll $3, $1, 3
3669; O1-NEXT:    ori $1, $zero, 255
3670; O1-NEXT:    sllv $5, $1, $3
3671; O1-NEXT:    nor $6, $zero, $5
3672; O1-NEXT:    sllv $4, $4, $3
3673; O1-NEXT:  $BB10_1: # %entry
3674; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3675; O1-NEXT:    ll $7, 0($2)
3676; O1-NEXT:    and $8, $7, $4
3677; O1-NEXT:    nor $8, $zero, $8
3678; O1-NEXT:    and $8, $8, $5
3679; O1-NEXT:    and $9, $7, $6
3680; O1-NEXT:    or $9, $9, $8
3681; O1-NEXT:    sc $9, 0($2)
3682; O1-NEXT:    beqz $9, $BB10_1
3683; O1-NEXT:    nop
3684; O1-NEXT:  # %bb.2: # %entry
3685; O1-NEXT:    and $1, $7, $5
3686; O1-NEXT:    srlv $1, $1, $3
3687; O1-NEXT:    sll $1, $1, 24
3688; O1-NEXT:    sra $1, $1, 24
3689; O1-NEXT:  # %bb.3: # %entry
3690; O1-NEXT:    sll $1, $1, 24
3691; O1-NEXT:    jr $ra
3692; O1-NEXT:    sra $2, $1, 24
3693;
3694; O2-LABEL: AtomicLoadNand8:
3695; O2:       # %bb.0: # %entry
3696; O2-NEXT:    lui $2, %hi(_gp_disp)
3697; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3698; O2-NEXT:    addu $1, $2, $25
3699; O2-NEXT:    lw $1, %got(y)($1)
3700; O2-NEXT:    addiu $2, $zero, -4
3701; O2-NEXT:    and $2, $1, $2
3702; O2-NEXT:    andi $1, $1, 3
3703; O2-NEXT:    sll $3, $1, 3
3704; O2-NEXT:    ori $1, $zero, 255
3705; O2-NEXT:    sllv $5, $1, $3
3706; O2-NEXT:    nor $6, $zero, $5
3707; O2-NEXT:    sllv $4, $4, $3
3708; O2-NEXT:  $BB10_1: # %entry
3709; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3710; O2-NEXT:    ll $7, 0($2)
3711; O2-NEXT:    and $8, $7, $4
3712; O2-NEXT:    nor $8, $zero, $8
3713; O2-NEXT:    and $8, $8, $5
3714; O2-NEXT:    and $9, $7, $6
3715; O2-NEXT:    or $9, $9, $8
3716; O2-NEXT:    sc $9, 0($2)
3717; O2-NEXT:    beqz $9, $BB10_1
3718; O2-NEXT:    nop
3719; O2-NEXT:  # %bb.2: # %entry
3720; O2-NEXT:    and $1, $7, $5
3721; O2-NEXT:    srlv $1, $1, $3
3722; O2-NEXT:    sll $1, $1, 24
3723; O2-NEXT:    sra $1, $1, 24
3724; O2-NEXT:  # %bb.3: # %entry
3725; O2-NEXT:    sll $1, $1, 24
3726; O2-NEXT:    jr $ra
3727; O2-NEXT:    sra $2, $1, 24
3728;
3729; O3-LABEL: AtomicLoadNand8:
3730; O3:       # %bb.0: # %entry
3731; O3-NEXT:    lui $2, %hi(_gp_disp)
3732; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
3733; O3-NEXT:    addu $1, $2, $25
3734; O3-NEXT:    addiu $2, $zero, -4
3735; O3-NEXT:    lw $1, %got(y)($1)
3736; O3-NEXT:    and $2, $1, $2
3737; O3-NEXT:    andi $1, $1, 3
3738; O3-NEXT:    sll $3, $1, 3
3739; O3-NEXT:    ori $1, $zero, 255
3740; O3-NEXT:    sllv $5, $1, $3
3741; O3-NEXT:    sllv $4, $4, $3
3742; O3-NEXT:    nor $6, $zero, $5
3743; O3-NEXT:  $BB10_1: # %entry
3744; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3745; O3-NEXT:    ll $7, 0($2)
3746; O3-NEXT:    and $8, $7, $4
3747; O3-NEXT:    nor $8, $zero, $8
3748; O3-NEXT:    and $8, $8, $5
3749; O3-NEXT:    and $9, $7, $6
3750; O3-NEXT:    or $9, $9, $8
3751; O3-NEXT:    sc $9, 0($2)
3752; O3-NEXT:    beqz $9, $BB10_1
3753; O3-NEXT:    nop
3754; O3-NEXT:  # %bb.2: # %entry
3755; O3-NEXT:    and $1, $7, $5
3756; O3-NEXT:    srlv $1, $1, $3
3757; O3-NEXT:    sll $1, $1, 24
3758; O3-NEXT:    sra $1, $1, 24
3759; O3-NEXT:  # %bb.3: # %entry
3760; O3-NEXT:    sll $1, $1, 24
3761; O3-NEXT:    jr $ra
3762; O3-NEXT:    sra $2, $1, 24
3763;
3764; MIPS32EB-LABEL: AtomicLoadNand8:
3765; MIPS32EB:       # %bb.0: # %entry
3766; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
3767; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
3768; MIPS32EB-NEXT:    addu $1, $2, $25
3769; MIPS32EB-NEXT:    lw $1, %got(y)($1)
3770; MIPS32EB-NEXT:    addiu $2, $zero, -4
3771; MIPS32EB-NEXT:    and $2, $1, $2
3772; MIPS32EB-NEXT:    andi $1, $1, 3
3773; MIPS32EB-NEXT:    xori $1, $1, 3
3774; MIPS32EB-NEXT:    sll $3, $1, 3
3775; MIPS32EB-NEXT:    ori $1, $zero, 255
3776; MIPS32EB-NEXT:    sllv $5, $1, $3
3777; MIPS32EB-NEXT:    nor $6, $zero, $5
3778; MIPS32EB-NEXT:    sllv $4, $4, $3
3779; MIPS32EB-NEXT:  $BB10_1: # %entry
3780; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
3781; MIPS32EB-NEXT:    ll $7, 0($2)
3782; MIPS32EB-NEXT:    and $8, $7, $4
3783; MIPS32EB-NEXT:    nor $8, $zero, $8
3784; MIPS32EB-NEXT:    and $8, $8, $5
3785; MIPS32EB-NEXT:    and $9, $7, $6
3786; MIPS32EB-NEXT:    or $9, $9, $8
3787; MIPS32EB-NEXT:    sc $9, 0($2)
3788; MIPS32EB-NEXT:    beqz $9, $BB10_1
3789; MIPS32EB-NEXT:    nop
3790; MIPS32EB-NEXT:  # %bb.2: # %entry
3791; MIPS32EB-NEXT:    and $1, $7, $5
3792; MIPS32EB-NEXT:    srlv $1, $1, $3
3793; MIPS32EB-NEXT:    sll $1, $1, 24
3794; MIPS32EB-NEXT:    sra $1, $1, 24
3795; MIPS32EB-NEXT:  # %bb.3: # %entry
3796; MIPS32EB-NEXT:    sll $1, $1, 24
3797; MIPS32EB-NEXT:    jr $ra
3798; MIPS32EB-NEXT:    sra $2, $1, 24
3799entry:
3800  %0 = atomicrmw nand i8* @y, i8 %incr monotonic
3801  ret i8 %0
3802
3803}
3804
3805define signext i8 @AtomicSwap8(i8 signext %newval) nounwind {
3806; MIPS32-LABEL: AtomicSwap8:
3807; MIPS32:       # %bb.0: # %entry
3808; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
3809; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3810; MIPS32-NEXT:    addu $1, $2, $25
3811; MIPS32-NEXT:    lw $1, %got(y)($1)
3812; MIPS32-NEXT:    addiu $2, $zero, -4
3813; MIPS32-NEXT:    and $2, $1, $2
3814; MIPS32-NEXT:    andi $1, $1, 3
3815; MIPS32-NEXT:    sll $3, $1, 3
3816; MIPS32-NEXT:    ori $1, $zero, 255
3817; MIPS32-NEXT:    sllv $5, $1, $3
3818; MIPS32-NEXT:    nor $6, $zero, $5
3819; MIPS32-NEXT:    sllv $4, $4, $3
3820; MIPS32-NEXT:  $BB11_1: # %entry
3821; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
3822; MIPS32-NEXT:    ll $7, 0($2)
3823; MIPS32-NEXT:    and $8, $4, $5
3824; MIPS32-NEXT:    and $9, $7, $6
3825; MIPS32-NEXT:    or $9, $9, $8
3826; MIPS32-NEXT:    sc $9, 0($2)
3827; MIPS32-NEXT:    beqz $9, $BB11_1
3828; MIPS32-NEXT:    nop
3829; MIPS32-NEXT:  # %bb.2: # %entry
3830; MIPS32-NEXT:    and $1, $7, $5
3831; MIPS32-NEXT:    srlv $1, $1, $3
3832; MIPS32-NEXT:    sll $1, $1, 24
3833; MIPS32-NEXT:    sra $1, $1, 24
3834; MIPS32-NEXT:  # %bb.3: # %entry
3835; MIPS32-NEXT:    sll $1, $1, 24
3836; MIPS32-NEXT:    jr $ra
3837; MIPS32-NEXT:    sra $2, $1, 24
3838;
3839; MIPS32O0-LABEL: AtomicSwap8:
3840; MIPS32O0:       # %bb.0: # %entry
3841; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
3842; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3843; MIPS32O0-NEXT:    addiu $sp, $sp, -8
3844; MIPS32O0-NEXT:    addu $1, $2, $25
3845; MIPS32O0-NEXT:    lw $1, %got(y)($1)
3846; MIPS32O0-NEXT:    addiu $2, $zero, -4
3847; MIPS32O0-NEXT:    and $5, $1, $2
3848; MIPS32O0-NEXT:    andi $1, $1, 3
3849; MIPS32O0-NEXT:    sll $9, $1, 3
3850; MIPS32O0-NEXT:    ori $1, $zero, 255
3851; MIPS32O0-NEXT:    sllv $7, $1, $9
3852; MIPS32O0-NEXT:    nor $8, $zero, $7
3853; MIPS32O0-NEXT:    sllv $6, $4, $9
3854; MIPS32O0-NEXT:  $BB11_1: # %entry
3855; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
3856; MIPS32O0-NEXT:    ll $2, 0($5)
3857; MIPS32O0-NEXT:    and $3, $6, $7
3858; MIPS32O0-NEXT:    and $4, $2, $8
3859; MIPS32O0-NEXT:    or $4, $4, $3
3860; MIPS32O0-NEXT:    sc $4, 0($5)
3861; MIPS32O0-NEXT:    beqz $4, $BB11_1
3862; MIPS32O0-NEXT:    nop
3863; MIPS32O0-NEXT:  # %bb.2: # %entry
3864; MIPS32O0-NEXT:    and $1, $2, $7
3865; MIPS32O0-NEXT:    srlv $1, $1, $9
3866; MIPS32O0-NEXT:    sll $1, $1, 24
3867; MIPS32O0-NEXT:    sra $1, $1, 24
3868; MIPS32O0-NEXT:  # %bb.3: # %entry
3869; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
3870; MIPS32O0-NEXT:  # %bb.4: # %entry
3871; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3872; MIPS32O0-NEXT:    sll $1, $1, 24
3873; MIPS32O0-NEXT:    sra $2, $1, 24
3874; MIPS32O0-NEXT:    addiu $sp, $sp, 8
3875; MIPS32O0-NEXT:    jr $ra
3876; MIPS32O0-NEXT:    nop
3877;
3878; MIPS32R2-LABEL: AtomicSwap8:
3879; MIPS32R2:       # %bb.0: # %entry
3880; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
3881; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3882; MIPS32R2-NEXT:    addu $1, $2, $25
3883; MIPS32R2-NEXT:    lw $1, %got(y)($1)
3884; MIPS32R2-NEXT:    addiu $2, $zero, -4
3885; MIPS32R2-NEXT:    and $2, $1, $2
3886; MIPS32R2-NEXT:    andi $1, $1, 3
3887; MIPS32R2-NEXT:    sll $3, $1, 3
3888; MIPS32R2-NEXT:    ori $1, $zero, 255
3889; MIPS32R2-NEXT:    sllv $5, $1, $3
3890; MIPS32R2-NEXT:    nor $6, $zero, $5
3891; MIPS32R2-NEXT:    sllv $4, $4, $3
3892; MIPS32R2-NEXT:  $BB11_1: # %entry
3893; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
3894; MIPS32R2-NEXT:    ll $7, 0($2)
3895; MIPS32R2-NEXT:    and $8, $4, $5
3896; MIPS32R2-NEXT:    and $9, $7, $6
3897; MIPS32R2-NEXT:    or $9, $9, $8
3898; MIPS32R2-NEXT:    sc $9, 0($2)
3899; MIPS32R2-NEXT:    beqz $9, $BB11_1
3900; MIPS32R2-NEXT:    nop
3901; MIPS32R2-NEXT:  # %bb.2: # %entry
3902; MIPS32R2-NEXT:    and $1, $7, $5
3903; MIPS32R2-NEXT:    srlv $1, $1, $3
3904; MIPS32R2-NEXT:    seb $1, $1
3905; MIPS32R2-NEXT:  # %bb.3: # %entry
3906; MIPS32R2-NEXT:    jr $ra
3907; MIPS32R2-NEXT:    seb $2, $1
3908;
3909; MIPS32R6-LABEL: AtomicSwap8:
3910; MIPS32R6:       # %bb.0: # %entry
3911; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
3912; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
3913; MIPS32R6-NEXT:    addu $1, $2, $25
3914; MIPS32R6-NEXT:    lw $1, %got(y)($1)
3915; MIPS32R6-NEXT:    addiu $2, $zero, -4
3916; MIPS32R6-NEXT:    and $2, $1, $2
3917; MIPS32R6-NEXT:    andi $1, $1, 3
3918; MIPS32R6-NEXT:    sll $3, $1, 3
3919; MIPS32R6-NEXT:    ori $1, $zero, 255
3920; MIPS32R6-NEXT:    sllv $5, $1, $3
3921; MIPS32R6-NEXT:    nor $6, $zero, $5
3922; MIPS32R6-NEXT:    sllv $4, $4, $3
3923; MIPS32R6-NEXT:  $BB11_1: # %entry
3924; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
3925; MIPS32R6-NEXT:    ll $7, 0($2)
3926; MIPS32R6-NEXT:    and $8, $4, $5
3927; MIPS32R6-NEXT:    and $9, $7, $6
3928; MIPS32R6-NEXT:    or $9, $9, $8
3929; MIPS32R6-NEXT:    sc $9, 0($2)
3930; MIPS32R6-NEXT:    beqzc $9, $BB11_1
3931; MIPS32R6-NEXT:  # %bb.2: # %entry
3932; MIPS32R6-NEXT:    and $1, $7, $5
3933; MIPS32R6-NEXT:    srlv $1, $1, $3
3934; MIPS32R6-NEXT:    seb $1, $1
3935; MIPS32R6-NEXT:  # %bb.3: # %entry
3936; MIPS32R6-NEXT:    jr $ra
3937; MIPS32R6-NEXT:    seb $2, $1
3938;
3939; MIPS32R6O0-LABEL: AtomicSwap8:
3940; MIPS32R6O0:       # %bb.0: # %entry
3941; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
3942; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3943; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
3944; MIPS32R6O0-NEXT:    addu $1, $2, $25
3945; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a0
3946; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
3947; MIPS32R6O0-NEXT:    addiu $2, $zero, -4
3948; MIPS32R6O0-NEXT:    and $5, $1, $2
3949; MIPS32R6O0-NEXT:    andi $1, $1, 3
3950; MIPS32R6O0-NEXT:    sll $9, $1, 3
3951; MIPS32R6O0-NEXT:    ori $1, $zero, 255
3952; MIPS32R6O0-NEXT:    sllv $7, $1, $9
3953; MIPS32R6O0-NEXT:    nor $8, $zero, $7
3954; MIPS32R6O0-NEXT:    sllv $6, $4, $9
3955; MIPS32R6O0-NEXT:  $BB11_1: # %entry
3956; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3957; MIPS32R6O0-NEXT:    ll $2, 0($5)
3958; MIPS32R6O0-NEXT:    and $3, $6, $7
3959; MIPS32R6O0-NEXT:    and $4, $2, $8
3960; MIPS32R6O0-NEXT:    or $4, $4, $3
3961; MIPS32R6O0-NEXT:    sc $4, 0($5)
3962; MIPS32R6O0-NEXT:    beqzc $4, $BB11_1
3963; MIPS32R6O0-NEXT:  # %bb.2: # %entry
3964; MIPS32R6O0-NEXT:    and $1, $2, $7
3965; MIPS32R6O0-NEXT:    srlv $1, $1, $9
3966; MIPS32R6O0-NEXT:    seb $1, $1
3967; MIPS32R6O0-NEXT:  # %bb.3: # %entry
3968; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
3969; MIPS32R6O0-NEXT:  # %bb.4: # %entry
3970; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3971; MIPS32R6O0-NEXT:    seb $2, $1
3972; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
3973; MIPS32R6O0-NEXT:    jrc $ra
3974;
3975; MIPS4-LABEL: AtomicSwap8:
3976; MIPS4:       # %bb.0: # %entry
3977; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
3978; MIPS4-NEXT:    daddu $1, $1, $25
3979; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
3980; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
3981; MIPS4-NEXT:    daddiu $2, $zero, -4
3982; MIPS4-NEXT:    and $2, $1, $2
3983; MIPS4-NEXT:    andi $1, $1, 3
3984; MIPS4-NEXT:    sll $3, $1, 3
3985; MIPS4-NEXT:    ori $1, $zero, 255
3986; MIPS4-NEXT:    sllv $5, $1, $3
3987; MIPS4-NEXT:    nor $6, $zero, $5
3988; MIPS4-NEXT:    sllv $4, $4, $3
3989; MIPS4-NEXT:  .LBB11_1: # %entry
3990; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
3991; MIPS4-NEXT:    ll $7, 0($2)
3992; MIPS4-NEXT:    and $8, $4, $5
3993; MIPS4-NEXT:    and $9, $7, $6
3994; MIPS4-NEXT:    or $9, $9, $8
3995; MIPS4-NEXT:    sc $9, 0($2)
3996; MIPS4-NEXT:    beqz $9, .LBB11_1
3997; MIPS4-NEXT:    nop
3998; MIPS4-NEXT:  # %bb.2: # %entry
3999; MIPS4-NEXT:    and $1, $7, $5
4000; MIPS4-NEXT:    srlv $1, $1, $3
4001; MIPS4-NEXT:    sll $1, $1, 24
4002; MIPS4-NEXT:    sra $1, $1, 24
4003; MIPS4-NEXT:  # %bb.3: # %entry
4004; MIPS4-NEXT:    sll $1, $1, 24
4005; MIPS4-NEXT:    jr $ra
4006; MIPS4-NEXT:    sra $2, $1, 24
4007;
4008; MIPS64-LABEL: AtomicSwap8:
4009; MIPS64:       # %bb.0: # %entry
4010; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4011; MIPS64-NEXT:    daddu $1, $1, $25
4012; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4013; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
4014; MIPS64-NEXT:    daddiu $2, $zero, -4
4015; MIPS64-NEXT:    and $2, $1, $2
4016; MIPS64-NEXT:    andi $1, $1, 3
4017; MIPS64-NEXT:    sll $3, $1, 3
4018; MIPS64-NEXT:    ori $1, $zero, 255
4019; MIPS64-NEXT:    sllv $5, $1, $3
4020; MIPS64-NEXT:    nor $6, $zero, $5
4021; MIPS64-NEXT:    sllv $4, $4, $3
4022; MIPS64-NEXT:  .LBB11_1: # %entry
4023; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
4024; MIPS64-NEXT:    ll $7, 0($2)
4025; MIPS64-NEXT:    and $8, $4, $5
4026; MIPS64-NEXT:    and $9, $7, $6
4027; MIPS64-NEXT:    or $9, $9, $8
4028; MIPS64-NEXT:    sc $9, 0($2)
4029; MIPS64-NEXT:    beqz $9, .LBB11_1
4030; MIPS64-NEXT:    nop
4031; MIPS64-NEXT:  # %bb.2: # %entry
4032; MIPS64-NEXT:    and $1, $7, $5
4033; MIPS64-NEXT:    srlv $1, $1, $3
4034; MIPS64-NEXT:    sll $1, $1, 24
4035; MIPS64-NEXT:    sra $1, $1, 24
4036; MIPS64-NEXT:  # %bb.3: # %entry
4037; MIPS64-NEXT:    sll $1, $1, 24
4038; MIPS64-NEXT:    jr $ra
4039; MIPS64-NEXT:    sra $2, $1, 24
4040;
4041; MIPS64R2-LABEL: AtomicSwap8:
4042; MIPS64R2:       # %bb.0: # %entry
4043; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4044; MIPS64R2-NEXT:    daddu $1, $1, $25
4045; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4046; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
4047; MIPS64R2-NEXT:    daddiu $2, $zero, -4
4048; MIPS64R2-NEXT:    and $2, $1, $2
4049; MIPS64R2-NEXT:    andi $1, $1, 3
4050; MIPS64R2-NEXT:    sll $3, $1, 3
4051; MIPS64R2-NEXT:    ori $1, $zero, 255
4052; MIPS64R2-NEXT:    sllv $5, $1, $3
4053; MIPS64R2-NEXT:    nor $6, $zero, $5
4054; MIPS64R2-NEXT:    sllv $4, $4, $3
4055; MIPS64R2-NEXT:  .LBB11_1: # %entry
4056; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
4057; MIPS64R2-NEXT:    ll $7, 0($2)
4058; MIPS64R2-NEXT:    and $8, $4, $5
4059; MIPS64R2-NEXT:    and $9, $7, $6
4060; MIPS64R2-NEXT:    or $9, $9, $8
4061; MIPS64R2-NEXT:    sc $9, 0($2)
4062; MIPS64R2-NEXT:    beqz $9, .LBB11_1
4063; MIPS64R2-NEXT:    nop
4064; MIPS64R2-NEXT:  # %bb.2: # %entry
4065; MIPS64R2-NEXT:    and $1, $7, $5
4066; MIPS64R2-NEXT:    srlv $1, $1, $3
4067; MIPS64R2-NEXT:    seb $1, $1
4068; MIPS64R2-NEXT:  # %bb.3: # %entry
4069; MIPS64R2-NEXT:    jr $ra
4070; MIPS64R2-NEXT:    seb $2, $1
4071;
4072; MIPS64R6-LABEL: AtomicSwap8:
4073; MIPS64R6:       # %bb.0: # %entry
4074; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4075; MIPS64R6-NEXT:    daddu $1, $1, $25
4076; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4077; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
4078; MIPS64R6-NEXT:    daddiu $2, $zero, -4
4079; MIPS64R6-NEXT:    and $2, $1, $2
4080; MIPS64R6-NEXT:    andi $1, $1, 3
4081; MIPS64R6-NEXT:    sll $3, $1, 3
4082; MIPS64R6-NEXT:    ori $1, $zero, 255
4083; MIPS64R6-NEXT:    sllv $5, $1, $3
4084; MIPS64R6-NEXT:    nor $6, $zero, $5
4085; MIPS64R6-NEXT:    sllv $4, $4, $3
4086; MIPS64R6-NEXT:  .LBB11_1: # %entry
4087; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
4088; MIPS64R6-NEXT:    ll $7, 0($2)
4089; MIPS64R6-NEXT:    and $8, $4, $5
4090; MIPS64R6-NEXT:    and $9, $7, $6
4091; MIPS64R6-NEXT:    or $9, $9, $8
4092; MIPS64R6-NEXT:    sc $9, 0($2)
4093; MIPS64R6-NEXT:    beqzc $9, .LBB11_1
4094; MIPS64R6-NEXT:  # %bb.2: # %entry
4095; MIPS64R6-NEXT:    and $1, $7, $5
4096; MIPS64R6-NEXT:    srlv $1, $1, $3
4097; MIPS64R6-NEXT:    seb $1, $1
4098; MIPS64R6-NEXT:  # %bb.3: # %entry
4099; MIPS64R6-NEXT:    jr $ra
4100; MIPS64R6-NEXT:    seb $2, $1
4101;
4102; MIPS64R6O0-LABEL: AtomicSwap8:
4103; MIPS64R6O0:       # %bb.0: # %entry
4104; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
4105; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4106; MIPS64R6O0-NEXT:    daddu $1, $1, $25
4107; MIPS64R6O0-NEXT:    daddiu $2, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4108; MIPS64R6O0-NEXT:    move $1, $4
4109; MIPS64R6O0-NEXT:    ld $2, %got_disp(y)($2)
4110; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
4111; MIPS64R6O0-NEXT:    and $5, $2, $3
4112; MIPS64R6O0-NEXT:    andi $2, $2, 3
4113; MIPS64R6O0-NEXT:    xori $2, $2, 3
4114; MIPS64R6O0-NEXT:    sll $9, $2, 3
4115; MIPS64R6O0-NEXT:    ori $2, $zero, 255
4116; MIPS64R6O0-NEXT:    sllv $7, $2, $9
4117; MIPS64R6O0-NEXT:    nor $8, $zero, $7
4118; MIPS64R6O0-NEXT:    sllv $6, $1, $9
4119; MIPS64R6O0-NEXT:  .LBB11_1: # %entry
4120; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4121; MIPS64R6O0-NEXT:    ll $2, 0($5)
4122; MIPS64R6O0-NEXT:    and $3, $6, $7
4123; MIPS64R6O0-NEXT:    and $4, $2, $8
4124; MIPS64R6O0-NEXT:    or $4, $4, $3
4125; MIPS64R6O0-NEXT:    sc $4, 0($5)
4126; MIPS64R6O0-NEXT:    beqzc $4, .LBB11_1
4127; MIPS64R6O0-NEXT:  # %bb.2: # %entry
4128; MIPS64R6O0-NEXT:    and $1, $2, $7
4129; MIPS64R6O0-NEXT:    srlv $1, $1, $9
4130; MIPS64R6O0-NEXT:    seb $1, $1
4131; MIPS64R6O0-NEXT:  # %bb.3: # %entry
4132; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
4133; MIPS64R6O0-NEXT:  # %bb.4: # %entry
4134; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
4135; MIPS64R6O0-NEXT:    seb $2, $1
4136; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
4137; MIPS64R6O0-NEXT:    jrc $ra
4138;
4139; MM32-LABEL: AtomicSwap8:
4140; MM32:       # %bb.0: # %entry
4141; MM32-NEXT:    lui $2, %hi(_gp_disp)
4142; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4143; MM32-NEXT:    addu $2, $2, $25
4144; MM32-NEXT:    lw $1, %got(y)($2)
4145; MM32-NEXT:    addiu $2, $zero, -4
4146; MM32-NEXT:    and $2, $1, $2
4147; MM32-NEXT:    andi $1, $1, 3
4148; MM32-NEXT:    sll $3, $1, 3
4149; MM32-NEXT:    ori $1, $zero, 255
4150; MM32-NEXT:    sllv $5, $1, $3
4151; MM32-NEXT:    nor $6, $zero, $5
4152; MM32-NEXT:    sllv $4, $4, $3
4153; MM32-NEXT:  $BB11_1: # %entry
4154; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
4155; MM32-NEXT:    ll $7, 0($2)
4156; MM32-NEXT:    and $8, $4, $5
4157; MM32-NEXT:    and $9, $7, $6
4158; MM32-NEXT:    or $9, $9, $8
4159; MM32-NEXT:    sc $9, 0($2)
4160; MM32-NEXT:    beqzc $9, $BB11_1
4161; MM32-NEXT:  # %bb.2: # %entry
4162; MM32-NEXT:    and $1, $7, $5
4163; MM32-NEXT:    srlv $1, $1, $3
4164; MM32-NEXT:    seb $1, $1
4165; MM32-NEXT:  # %bb.3: # %entry
4166; MM32-NEXT:    jr $ra
4167; MM32-NEXT:    seb $2, $1
4168;
4169; O1-LABEL: AtomicSwap8:
4170; O1:       # %bb.0: # %entry
4171; O1-NEXT:    lui $2, %hi(_gp_disp)
4172; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
4173; O1-NEXT:    addu $1, $2, $25
4174; O1-NEXT:    lw $1, %got(y)($1)
4175; O1-NEXT:    addiu $2, $zero, -4
4176; O1-NEXT:    and $2, $1, $2
4177; O1-NEXT:    andi $1, $1, 3
4178; O1-NEXT:    sll $3, $1, 3
4179; O1-NEXT:    ori $1, $zero, 255
4180; O1-NEXT:    sllv $5, $1, $3
4181; O1-NEXT:    nor $6, $zero, $5
4182; O1-NEXT:    sllv $4, $4, $3
4183; O1-NEXT:  $BB11_1: # %entry
4184; O1-NEXT:    # =>This Inner Loop Header: Depth=1
4185; O1-NEXT:    ll $7, 0($2)
4186; O1-NEXT:    and $8, $4, $5
4187; O1-NEXT:    and $9, $7, $6
4188; O1-NEXT:    or $9, $9, $8
4189; O1-NEXT:    sc $9, 0($2)
4190; O1-NEXT:    beqz $9, $BB11_1
4191; O1-NEXT:    nop
4192; O1-NEXT:  # %bb.2: # %entry
4193; O1-NEXT:    and $1, $7, $5
4194; O1-NEXT:    srlv $1, $1, $3
4195; O1-NEXT:    sll $1, $1, 24
4196; O1-NEXT:    sra $1, $1, 24
4197; O1-NEXT:  # %bb.3: # %entry
4198; O1-NEXT:    sll $1, $1, 24
4199; O1-NEXT:    jr $ra
4200; O1-NEXT:    sra $2, $1, 24
4201;
4202; O2-LABEL: AtomicSwap8:
4203; O2:       # %bb.0: # %entry
4204; O2-NEXT:    lui $2, %hi(_gp_disp)
4205; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4206; O2-NEXT:    addu $1, $2, $25
4207; O2-NEXT:    lw $1, %got(y)($1)
4208; O2-NEXT:    addiu $2, $zero, -4
4209; O2-NEXT:    and $2, $1, $2
4210; O2-NEXT:    andi $1, $1, 3
4211; O2-NEXT:    sll $3, $1, 3
4212; O2-NEXT:    ori $1, $zero, 255
4213; O2-NEXT:    sllv $5, $1, $3
4214; O2-NEXT:    nor $6, $zero, $5
4215; O2-NEXT:    sllv $4, $4, $3
4216; O2-NEXT:  $BB11_1: # %entry
4217; O2-NEXT:    # =>This Inner Loop Header: Depth=1
4218; O2-NEXT:    ll $7, 0($2)
4219; O2-NEXT:    and $8, $4, $5
4220; O2-NEXT:    and $9, $7, $6
4221; O2-NEXT:    or $9, $9, $8
4222; O2-NEXT:    sc $9, 0($2)
4223; O2-NEXT:    beqz $9, $BB11_1
4224; O2-NEXT:    nop
4225; O2-NEXT:  # %bb.2: # %entry
4226; O2-NEXT:    and $1, $7, $5
4227; O2-NEXT:    srlv $1, $1, $3
4228; O2-NEXT:    sll $1, $1, 24
4229; O2-NEXT:    sra $1, $1, 24
4230; O2-NEXT:  # %bb.3: # %entry
4231; O2-NEXT:    sll $1, $1, 24
4232; O2-NEXT:    jr $ra
4233; O2-NEXT:    sra $2, $1, 24
4234;
4235; O3-LABEL: AtomicSwap8:
4236; O3:       # %bb.0: # %entry
4237; O3-NEXT:    lui $2, %hi(_gp_disp)
4238; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
4239; O3-NEXT:    addu $1, $2, $25
4240; O3-NEXT:    addiu $2, $zero, -4
4241; O3-NEXT:    lw $1, %got(y)($1)
4242; O3-NEXT:    and $2, $1, $2
4243; O3-NEXT:    andi $1, $1, 3
4244; O3-NEXT:    sll $3, $1, 3
4245; O3-NEXT:    ori $1, $zero, 255
4246; O3-NEXT:    sllv $5, $1, $3
4247; O3-NEXT:    sllv $4, $4, $3
4248; O3-NEXT:    nor $6, $zero, $5
4249; O3-NEXT:  $BB11_1: # %entry
4250; O3-NEXT:    # =>This Inner Loop Header: Depth=1
4251; O3-NEXT:    ll $7, 0($2)
4252; O3-NEXT:    and $8, $4, $5
4253; O3-NEXT:    and $9, $7, $6
4254; O3-NEXT:    or $9, $9, $8
4255; O3-NEXT:    sc $9, 0($2)
4256; O3-NEXT:    beqz $9, $BB11_1
4257; O3-NEXT:    nop
4258; O3-NEXT:  # %bb.2: # %entry
4259; O3-NEXT:    and $1, $7, $5
4260; O3-NEXT:    srlv $1, $1, $3
4261; O3-NEXT:    sll $1, $1, 24
4262; O3-NEXT:    sra $1, $1, 24
4263; O3-NEXT:  # %bb.3: # %entry
4264; O3-NEXT:    sll $1, $1, 24
4265; O3-NEXT:    jr $ra
4266; O3-NEXT:    sra $2, $1, 24
4267;
4268; MIPS32EB-LABEL: AtomicSwap8:
4269; MIPS32EB:       # %bb.0: # %entry
4270; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
4271; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
4272; MIPS32EB-NEXT:    addu $1, $2, $25
4273; MIPS32EB-NEXT:    lw $1, %got(y)($1)
4274; MIPS32EB-NEXT:    addiu $2, $zero, -4
4275; MIPS32EB-NEXT:    and $2, $1, $2
4276; MIPS32EB-NEXT:    andi $1, $1, 3
4277; MIPS32EB-NEXT:    xori $1, $1, 3
4278; MIPS32EB-NEXT:    sll $3, $1, 3
4279; MIPS32EB-NEXT:    ori $1, $zero, 255
4280; MIPS32EB-NEXT:    sllv $5, $1, $3
4281; MIPS32EB-NEXT:    nor $6, $zero, $5
4282; MIPS32EB-NEXT:    sllv $4, $4, $3
4283; MIPS32EB-NEXT:  $BB11_1: # %entry
4284; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
4285; MIPS32EB-NEXT:    ll $7, 0($2)
4286; MIPS32EB-NEXT:    and $8, $4, $5
4287; MIPS32EB-NEXT:    and $9, $7, $6
4288; MIPS32EB-NEXT:    or $9, $9, $8
4289; MIPS32EB-NEXT:    sc $9, 0($2)
4290; MIPS32EB-NEXT:    beqz $9, $BB11_1
4291; MIPS32EB-NEXT:    nop
4292; MIPS32EB-NEXT:  # %bb.2: # %entry
4293; MIPS32EB-NEXT:    and $1, $7, $5
4294; MIPS32EB-NEXT:    srlv $1, $1, $3
4295; MIPS32EB-NEXT:    sll $1, $1, 24
4296; MIPS32EB-NEXT:    sra $1, $1, 24
4297; MIPS32EB-NEXT:  # %bb.3: # %entry
4298; MIPS32EB-NEXT:    sll $1, $1, 24
4299; MIPS32EB-NEXT:    jr $ra
4300; MIPS32EB-NEXT:    sra $2, $1, 24
4301entry:
4302  %0 = atomicrmw xchg i8* @y, i8 %newval monotonic
4303  ret i8 %0
4304}
4305
4306define signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind {
4307; MIPS32-LABEL: AtomicCmpSwap8:
4308; MIPS32:       # %bb.0: # %entry
4309; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
4310; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4311; MIPS32-NEXT:    addu $1, $2, $25
4312; MIPS32-NEXT:    lw $1, %got(y)($1)
4313; MIPS32-NEXT:    addiu $2, $zero, -4
4314; MIPS32-NEXT:    and $3, $1, $2
4315; MIPS32-NEXT:    andi $1, $1, 3
4316; MIPS32-NEXT:    sll $1, $1, 3
4317; MIPS32-NEXT:    ori $2, $zero, 255
4318; MIPS32-NEXT:    sllv $6, $2, $1
4319; MIPS32-NEXT:    nor $7, $zero, $6
4320; MIPS32-NEXT:    andi $2, $4, 255
4321; MIPS32-NEXT:    sllv $4, $2, $1
4322; MIPS32-NEXT:    andi $2, $5, 255
4323; MIPS32-NEXT:    sllv $5, $2, $1
4324; MIPS32-NEXT:  $BB12_1: # %entry
4325; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
4326; MIPS32-NEXT:    ll $8, 0($3)
4327; MIPS32-NEXT:    and $9, $8, $6
4328; MIPS32-NEXT:    bne $9, $4, $BB12_3
4329; MIPS32-NEXT:    nop
4330; MIPS32-NEXT:  # %bb.2: # %entry
4331; MIPS32-NEXT:    # in Loop: Header=BB12_1 Depth=1
4332; MIPS32-NEXT:    and $8, $8, $7
4333; MIPS32-NEXT:    or $8, $8, $5
4334; MIPS32-NEXT:    sc $8, 0($3)
4335; MIPS32-NEXT:    beqz $8, $BB12_1
4336; MIPS32-NEXT:    nop
4337; MIPS32-NEXT:  $BB12_3: # %entry
4338; MIPS32-NEXT:    srlv $2, $9, $1
4339; MIPS32-NEXT:    sll $2, $2, 24
4340; MIPS32-NEXT:    sra $2, $2, 24
4341; MIPS32-NEXT:  # %bb.4: # %entry
4342; MIPS32-NEXT:    jr $ra
4343; MIPS32-NEXT:    nop
4344;
4345; MIPS32O0-LABEL: AtomicCmpSwap8:
4346; MIPS32O0:       # %bb.0: # %entry
4347; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
4348; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
4349; MIPS32O0-NEXT:    addiu $sp, $sp, -8
4350; MIPS32O0-NEXT:    addu $3, $2, $25
4351; MIPS32O0-NEXT:    move $1, $5
4352; MIPS32O0-NEXT:    move $2, $4
4353; MIPS32O0-NEXT:    lw $3, %got(y)($3)
4354; MIPS32O0-NEXT:    addiu $4, $zero, -4
4355; MIPS32O0-NEXT:    and $4, $3, $4
4356; MIPS32O0-NEXT:    andi $3, $3, 3
4357; MIPS32O0-NEXT:    sll $9, $3, 3
4358; MIPS32O0-NEXT:    ori $3, $zero, 255
4359; MIPS32O0-NEXT:    sllv $5, $3, $9
4360; MIPS32O0-NEXT:    nor $7, $zero, $5
4361; MIPS32O0-NEXT:    andi $2, $2, 255
4362; MIPS32O0-NEXT:    sllv $6, $2, $9
4363; MIPS32O0-NEXT:    andi $1, $1, 255
4364; MIPS32O0-NEXT:    sllv $8, $1, $9
4365; MIPS32O0-NEXT:  $BB12_1: # %entry
4366; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
4367; MIPS32O0-NEXT:    ll $2, 0($4)
4368; MIPS32O0-NEXT:    and $3, $2, $5
4369; MIPS32O0-NEXT:    bne $3, $6, $BB12_3
4370; MIPS32O0-NEXT:    nop
4371; MIPS32O0-NEXT:  # %bb.2: # %entry
4372; MIPS32O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4373; MIPS32O0-NEXT:    and $2, $2, $7
4374; MIPS32O0-NEXT:    or $2, $2, $8
4375; MIPS32O0-NEXT:    sc $2, 0($4)
4376; MIPS32O0-NEXT:    beqz $2, $BB12_1
4377; MIPS32O0-NEXT:    nop
4378; MIPS32O0-NEXT:  $BB12_3: # %entry
4379; MIPS32O0-NEXT:    srlv $1, $3, $9
4380; MIPS32O0-NEXT:    sll $1, $1, 24
4381; MIPS32O0-NEXT:    sra $1, $1, 24
4382; MIPS32O0-NEXT:  # %bb.4: # %entry
4383; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
4384; MIPS32O0-NEXT:  # %bb.5: # %entry
4385; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
4386; MIPS32O0-NEXT:    sll $1, $1, 24
4387; MIPS32O0-NEXT:    sra $2, $1, 24
4388; MIPS32O0-NEXT:    addiu $sp, $sp, 8
4389; MIPS32O0-NEXT:    jr $ra
4390; MIPS32O0-NEXT:    nop
4391;
4392; MIPS32R2-LABEL: AtomicCmpSwap8:
4393; MIPS32R2:       # %bb.0: # %entry
4394; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
4395; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4396; MIPS32R2-NEXT:    addu $1, $2, $25
4397; MIPS32R2-NEXT:    lw $1, %got(y)($1)
4398; MIPS32R2-NEXT:    addiu $2, $zero, -4
4399; MIPS32R2-NEXT:    and $3, $1, $2
4400; MIPS32R2-NEXT:    andi $1, $1, 3
4401; MIPS32R2-NEXT:    sll $1, $1, 3
4402; MIPS32R2-NEXT:    ori $2, $zero, 255
4403; MIPS32R2-NEXT:    sllv $6, $2, $1
4404; MIPS32R2-NEXT:    nor $7, $zero, $6
4405; MIPS32R2-NEXT:    andi $2, $4, 255
4406; MIPS32R2-NEXT:    sllv $4, $2, $1
4407; MIPS32R2-NEXT:    andi $2, $5, 255
4408; MIPS32R2-NEXT:    sllv $5, $2, $1
4409; MIPS32R2-NEXT:  $BB12_1: # %entry
4410; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
4411; MIPS32R2-NEXT:    ll $8, 0($3)
4412; MIPS32R2-NEXT:    and $9, $8, $6
4413; MIPS32R2-NEXT:    bne $9, $4, $BB12_3
4414; MIPS32R2-NEXT:    nop
4415; MIPS32R2-NEXT:  # %bb.2: # %entry
4416; MIPS32R2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4417; MIPS32R2-NEXT:    and $8, $8, $7
4418; MIPS32R2-NEXT:    or $8, $8, $5
4419; MIPS32R2-NEXT:    sc $8, 0($3)
4420; MIPS32R2-NEXT:    beqz $8, $BB12_1
4421; MIPS32R2-NEXT:    nop
4422; MIPS32R2-NEXT:  $BB12_3: # %entry
4423; MIPS32R2-NEXT:    srlv $2, $9, $1
4424; MIPS32R2-NEXT:    seb $2, $2
4425; MIPS32R2-NEXT:  # %bb.4: # %entry
4426; MIPS32R2-NEXT:    jr $ra
4427; MIPS32R2-NEXT:    nop
4428;
4429; MIPS32R6-LABEL: AtomicCmpSwap8:
4430; MIPS32R6:       # %bb.0: # %entry
4431; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
4432; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
4433; MIPS32R6-NEXT:    addu $1, $2, $25
4434; MIPS32R6-NEXT:    lw $1, %got(y)($1)
4435; MIPS32R6-NEXT:    addiu $2, $zero, -4
4436; MIPS32R6-NEXT:    and $3, $1, $2
4437; MIPS32R6-NEXT:    andi $1, $1, 3
4438; MIPS32R6-NEXT:    sll $1, $1, 3
4439; MIPS32R6-NEXT:    ori $2, $zero, 255
4440; MIPS32R6-NEXT:    sllv $6, $2, $1
4441; MIPS32R6-NEXT:    nor $7, $zero, $6
4442; MIPS32R6-NEXT:    andi $2, $4, 255
4443; MIPS32R6-NEXT:    sllv $4, $2, $1
4444; MIPS32R6-NEXT:    andi $2, $5, 255
4445; MIPS32R6-NEXT:    sllv $5, $2, $1
4446; MIPS32R6-NEXT:  $BB12_1: # %entry
4447; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
4448; MIPS32R6-NEXT:    ll $8, 0($3)
4449; MIPS32R6-NEXT:    and $9, $8, $6
4450; MIPS32R6-NEXT:    bnec $9, $4, $BB12_3
4451; MIPS32R6-NEXT:  # %bb.2: # %entry
4452; MIPS32R6-NEXT:    # in Loop: Header=BB12_1 Depth=1
4453; MIPS32R6-NEXT:    and $8, $8, $7
4454; MIPS32R6-NEXT:    or $8, $8, $5
4455; MIPS32R6-NEXT:    sc $8, 0($3)
4456; MIPS32R6-NEXT:    beqzc $8, $BB12_1
4457; MIPS32R6-NEXT:  $BB12_3: # %entry
4458; MIPS32R6-NEXT:    srlv $2, $9, $1
4459; MIPS32R6-NEXT:    seb $2, $2
4460; MIPS32R6-NEXT:  # %bb.4: # %entry
4461; MIPS32R6-NEXT:    jrc $ra
4462;
4463; MIPS32R6O0-LABEL: AtomicCmpSwap8:
4464; MIPS32R6O0:       # %bb.0: # %entry
4465; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
4466; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
4467; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
4468; MIPS32R6O0-NEXT:    addu $3, $2, $25
4469; MIPS32R6O0-NEXT:    move $1, $5
4470; MIPS32R6O0-NEXT:    move $2, $4
4471; MIPS32R6O0-NEXT:    # kill: def $a1 killed $at
4472; MIPS32R6O0-NEXT:    # kill: def $a0 killed $v0
4473; MIPS32R6O0-NEXT:    lw $3, %got(y)($3)
4474; MIPS32R6O0-NEXT:    addiu $4, $zero, -4
4475; MIPS32R6O0-NEXT:    and $4, $3, $4
4476; MIPS32R6O0-NEXT:    andi $3, $3, 3
4477; MIPS32R6O0-NEXT:    sll $9, $3, 3
4478; MIPS32R6O0-NEXT:    ori $3, $zero, 255
4479; MIPS32R6O0-NEXT:    sllv $5, $3, $9
4480; MIPS32R6O0-NEXT:    nor $7, $zero, $5
4481; MIPS32R6O0-NEXT:    andi $2, $2, 255
4482; MIPS32R6O0-NEXT:    sllv $6, $2, $9
4483; MIPS32R6O0-NEXT:    andi $1, $1, 255
4484; MIPS32R6O0-NEXT:    sllv $8, $1, $9
4485; MIPS32R6O0-NEXT:  $BB12_1: # %entry
4486; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4487; MIPS32R6O0-NEXT:    ll $2, 0($4)
4488; MIPS32R6O0-NEXT:    and $3, $2, $5
4489; MIPS32R6O0-NEXT:    bnec $3, $6, $BB12_3
4490; MIPS32R6O0-NEXT:  # %bb.2: # %entry
4491; MIPS32R6O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4492; MIPS32R6O0-NEXT:    and $2, $2, $7
4493; MIPS32R6O0-NEXT:    or $2, $2, $8
4494; MIPS32R6O0-NEXT:    sc $2, 0($4)
4495; MIPS32R6O0-NEXT:    beqzc $2, $BB12_1
4496; MIPS32R6O0-NEXT:  $BB12_3: # %entry
4497; MIPS32R6O0-NEXT:    srlv $1, $3, $9
4498; MIPS32R6O0-NEXT:    seb $1, $1
4499; MIPS32R6O0-NEXT:  # %bb.4: # %entry
4500; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
4501; MIPS32R6O0-NEXT:  # %bb.5: # %entry
4502; MIPS32R6O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
4503; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
4504; MIPS32R6O0-NEXT:    jrc $ra
4505;
4506; MIPS4-LABEL: AtomicCmpSwap8:
4507; MIPS4:       # %bb.0: # %entry
4508; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4509; MIPS4-NEXT:    daddu $1, $1, $25
4510; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4511; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
4512; MIPS4-NEXT:    daddiu $2, $zero, -4
4513; MIPS4-NEXT:    and $3, $1, $2
4514; MIPS4-NEXT:    andi $1, $1, 3
4515; MIPS4-NEXT:    sll $1, $1, 3
4516; MIPS4-NEXT:    ori $2, $zero, 255
4517; MIPS4-NEXT:    sllv $6, $2, $1
4518; MIPS4-NEXT:    nor $7, $zero, $6
4519; MIPS4-NEXT:    andi $2, $4, 255
4520; MIPS4-NEXT:    sllv $4, $2, $1
4521; MIPS4-NEXT:    andi $2, $5, 255
4522; MIPS4-NEXT:    sllv $5, $2, $1
4523; MIPS4-NEXT:  .LBB12_1: # %entry
4524; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
4525; MIPS4-NEXT:    ll $8, 0($3)
4526; MIPS4-NEXT:    and $9, $8, $6
4527; MIPS4-NEXT:    bne $9, $4, .LBB12_3
4528; MIPS4-NEXT:    nop
4529; MIPS4-NEXT:  # %bb.2: # %entry
4530; MIPS4-NEXT:    # in Loop: Header=BB12_1 Depth=1
4531; MIPS4-NEXT:    and $8, $8, $7
4532; MIPS4-NEXT:    or $8, $8, $5
4533; MIPS4-NEXT:    sc $8, 0($3)
4534; MIPS4-NEXT:    beqz $8, .LBB12_1
4535; MIPS4-NEXT:    nop
4536; MIPS4-NEXT:  .LBB12_3: # %entry
4537; MIPS4-NEXT:    srlv $2, $9, $1
4538; MIPS4-NEXT:    sll $2, $2, 24
4539; MIPS4-NEXT:    sra $2, $2, 24
4540; MIPS4-NEXT:  # %bb.4: # %entry
4541; MIPS4-NEXT:    jr $ra
4542; MIPS4-NEXT:    nop
4543;
4544; MIPS64-LABEL: AtomicCmpSwap8:
4545; MIPS64:       # %bb.0: # %entry
4546; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4547; MIPS64-NEXT:    daddu $1, $1, $25
4548; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4549; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
4550; MIPS64-NEXT:    daddiu $2, $zero, -4
4551; MIPS64-NEXT:    and $3, $1, $2
4552; MIPS64-NEXT:    andi $1, $1, 3
4553; MIPS64-NEXT:    sll $1, $1, 3
4554; MIPS64-NEXT:    ori $2, $zero, 255
4555; MIPS64-NEXT:    sllv $6, $2, $1
4556; MIPS64-NEXT:    nor $7, $zero, $6
4557; MIPS64-NEXT:    andi $2, $4, 255
4558; MIPS64-NEXT:    sllv $4, $2, $1
4559; MIPS64-NEXT:    andi $2, $5, 255
4560; MIPS64-NEXT:    sllv $5, $2, $1
4561; MIPS64-NEXT:  .LBB12_1: # %entry
4562; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
4563; MIPS64-NEXT:    ll $8, 0($3)
4564; MIPS64-NEXT:    and $9, $8, $6
4565; MIPS64-NEXT:    bne $9, $4, .LBB12_3
4566; MIPS64-NEXT:    nop
4567; MIPS64-NEXT:  # %bb.2: # %entry
4568; MIPS64-NEXT:    # in Loop: Header=BB12_1 Depth=1
4569; MIPS64-NEXT:    and $8, $8, $7
4570; MIPS64-NEXT:    or $8, $8, $5
4571; MIPS64-NEXT:    sc $8, 0($3)
4572; MIPS64-NEXT:    beqz $8, .LBB12_1
4573; MIPS64-NEXT:    nop
4574; MIPS64-NEXT:  .LBB12_3: # %entry
4575; MIPS64-NEXT:    srlv $2, $9, $1
4576; MIPS64-NEXT:    sll $2, $2, 24
4577; MIPS64-NEXT:    sra $2, $2, 24
4578; MIPS64-NEXT:  # %bb.4: # %entry
4579; MIPS64-NEXT:    jr $ra
4580; MIPS64-NEXT:    nop
4581;
4582; MIPS64R2-LABEL: AtomicCmpSwap8:
4583; MIPS64R2:       # %bb.0: # %entry
4584; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4585; MIPS64R2-NEXT:    daddu $1, $1, $25
4586; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4587; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
4588; MIPS64R2-NEXT:    daddiu $2, $zero, -4
4589; MIPS64R2-NEXT:    and $3, $1, $2
4590; MIPS64R2-NEXT:    andi $1, $1, 3
4591; MIPS64R2-NEXT:    sll $1, $1, 3
4592; MIPS64R2-NEXT:    ori $2, $zero, 255
4593; MIPS64R2-NEXT:    sllv $6, $2, $1
4594; MIPS64R2-NEXT:    nor $7, $zero, $6
4595; MIPS64R2-NEXT:    andi $2, $4, 255
4596; MIPS64R2-NEXT:    sllv $4, $2, $1
4597; MIPS64R2-NEXT:    andi $2, $5, 255
4598; MIPS64R2-NEXT:    sllv $5, $2, $1
4599; MIPS64R2-NEXT:  .LBB12_1: # %entry
4600; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
4601; MIPS64R2-NEXT:    ll $8, 0($3)
4602; MIPS64R2-NEXT:    and $9, $8, $6
4603; MIPS64R2-NEXT:    bne $9, $4, .LBB12_3
4604; MIPS64R2-NEXT:    nop
4605; MIPS64R2-NEXT:  # %bb.2: # %entry
4606; MIPS64R2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4607; MIPS64R2-NEXT:    and $8, $8, $7
4608; MIPS64R2-NEXT:    or $8, $8, $5
4609; MIPS64R2-NEXT:    sc $8, 0($3)
4610; MIPS64R2-NEXT:    beqz $8, .LBB12_1
4611; MIPS64R2-NEXT:    nop
4612; MIPS64R2-NEXT:  .LBB12_3: # %entry
4613; MIPS64R2-NEXT:    srlv $2, $9, $1
4614; MIPS64R2-NEXT:    seb $2, $2
4615; MIPS64R2-NEXT:  # %bb.4: # %entry
4616; MIPS64R2-NEXT:    jr $ra
4617; MIPS64R2-NEXT:    nop
4618;
4619; MIPS64R6-LABEL: AtomicCmpSwap8:
4620; MIPS64R6:       # %bb.0: # %entry
4621; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4622; MIPS64R6-NEXT:    daddu $1, $1, $25
4623; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4624; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
4625; MIPS64R6-NEXT:    daddiu $2, $zero, -4
4626; MIPS64R6-NEXT:    and $3, $1, $2
4627; MIPS64R6-NEXT:    andi $1, $1, 3
4628; MIPS64R6-NEXT:    sll $1, $1, 3
4629; MIPS64R6-NEXT:    ori $2, $zero, 255
4630; MIPS64R6-NEXT:    sllv $6, $2, $1
4631; MIPS64R6-NEXT:    nor $7, $zero, $6
4632; MIPS64R6-NEXT:    andi $2, $4, 255
4633; MIPS64R6-NEXT:    sllv $4, $2, $1
4634; MIPS64R6-NEXT:    andi $2, $5, 255
4635; MIPS64R6-NEXT:    sllv $5, $2, $1
4636; MIPS64R6-NEXT:  .LBB12_1: # %entry
4637; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
4638; MIPS64R6-NEXT:    ll $8, 0($3)
4639; MIPS64R6-NEXT:    and $9, $8, $6
4640; MIPS64R6-NEXT:    bnec $9, $4, .LBB12_3
4641; MIPS64R6-NEXT:  # %bb.2: # %entry
4642; MIPS64R6-NEXT:    # in Loop: Header=BB12_1 Depth=1
4643; MIPS64R6-NEXT:    and $8, $8, $7
4644; MIPS64R6-NEXT:    or $8, $8, $5
4645; MIPS64R6-NEXT:    sc $8, 0($3)
4646; MIPS64R6-NEXT:    beqzc $8, .LBB12_1
4647; MIPS64R6-NEXT:  .LBB12_3: # %entry
4648; MIPS64R6-NEXT:    srlv $2, $9, $1
4649; MIPS64R6-NEXT:    seb $2, $2
4650; MIPS64R6-NEXT:  # %bb.4: # %entry
4651; MIPS64R6-NEXT:    jrc $ra
4652;
4653; MIPS64R6O0-LABEL: AtomicCmpSwap8:
4654; MIPS64R6O0:       # %bb.0: # %entry
4655; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
4656; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4657; MIPS64R6O0-NEXT:    daddu $1, $1, $25
4658; MIPS64R6O0-NEXT:    daddiu $3, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4659; MIPS64R6O0-NEXT:    move $1, $5
4660; MIPS64R6O0-NEXT:    move $2, $4
4661; MIPS64R6O0-NEXT:    ld $3, %got_disp(y)($3)
4662; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
4663; MIPS64R6O0-NEXT:    and $4, $3, $4
4664; MIPS64R6O0-NEXT:    andi $3, $3, 3
4665; MIPS64R6O0-NEXT:    xori $3, $3, 3
4666; MIPS64R6O0-NEXT:    sll $9, $3, 3
4667; MIPS64R6O0-NEXT:    ori $3, $zero, 255
4668; MIPS64R6O0-NEXT:    sllv $5, $3, $9
4669; MIPS64R6O0-NEXT:    nor $7, $zero, $5
4670; MIPS64R6O0-NEXT:    andi $2, $2, 255
4671; MIPS64R6O0-NEXT:    sllv $6, $2, $9
4672; MIPS64R6O0-NEXT:    andi $1, $1, 255
4673; MIPS64R6O0-NEXT:    sllv $8, $1, $9
4674; MIPS64R6O0-NEXT:  .LBB12_1: # %entry
4675; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4676; MIPS64R6O0-NEXT:    ll $2, 0($4)
4677; MIPS64R6O0-NEXT:    and $3, $2, $5
4678; MIPS64R6O0-NEXT:    bnec $3, $6, .LBB12_3
4679; MIPS64R6O0-NEXT:  # %bb.2: # %entry
4680; MIPS64R6O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4681; MIPS64R6O0-NEXT:    and $2, $2, $7
4682; MIPS64R6O0-NEXT:    or $2, $2, $8
4683; MIPS64R6O0-NEXT:    sc $2, 0($4)
4684; MIPS64R6O0-NEXT:    beqzc $2, .LBB12_1
4685; MIPS64R6O0-NEXT:  .LBB12_3: # %entry
4686; MIPS64R6O0-NEXT:    srlv $1, $3, $9
4687; MIPS64R6O0-NEXT:    seb $1, $1
4688; MIPS64R6O0-NEXT:  # %bb.4: # %entry
4689; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
4690; MIPS64R6O0-NEXT:  # %bb.5: # %entry
4691; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
4692; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
4693; MIPS64R6O0-NEXT:    jrc $ra
4694;
4695; MM32-LABEL: AtomicCmpSwap8:
4696; MM32:       # %bb.0: # %entry
4697; MM32-NEXT:    lui $2, %hi(_gp_disp)
4698; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4699; MM32-NEXT:    addu $2, $2, $25
4700; MM32-NEXT:    lw $1, %got(y)($2)
4701; MM32-NEXT:    addiu $2, $zero, -4
4702; MM32-NEXT:    and $3, $1, $2
4703; MM32-NEXT:    andi $1, $1, 3
4704; MM32-NEXT:    sll $1, $1, 3
4705; MM32-NEXT:    ori $2, $zero, 255
4706; MM32-NEXT:    sllv $6, $2, $1
4707; MM32-NEXT:    nor $7, $zero, $6
4708; MM32-NEXT:    andi $2, $4, 255
4709; MM32-NEXT:    sllv $4, $2, $1
4710; MM32-NEXT:    andi $2, $5, 255
4711; MM32-NEXT:    sllv $5, $2, $1
4712; MM32-NEXT:  $BB12_1: # %entry
4713; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
4714; MM32-NEXT:    ll $8, 0($3)
4715; MM32-NEXT:    and $9, $8, $6
4716; MM32-NEXT:    bne $9, $4, $BB12_3
4717; MM32-NEXT:    nop
4718; MM32-NEXT:  # %bb.2: # %entry
4719; MM32-NEXT:    # in Loop: Header=BB12_1 Depth=1
4720; MM32-NEXT:    and $8, $8, $7
4721; MM32-NEXT:    or $8, $8, $5
4722; MM32-NEXT:    sc $8, 0($3)
4723; MM32-NEXT:    beqzc $8, $BB12_1
4724; MM32-NEXT:  $BB12_3: # %entry
4725; MM32-NEXT:    srlv $2, $9, $1
4726; MM32-NEXT:    seb $2, $2
4727; MM32-NEXT:  # %bb.4: # %entry
4728; MM32-NEXT:    jrc $ra
4729;
4730; O1-LABEL: AtomicCmpSwap8:
4731; O1:       # %bb.0: # %entry
4732; O1-NEXT:    lui $2, %hi(_gp_disp)
4733; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
4734; O1-NEXT:    addu $1, $2, $25
4735; O1-NEXT:    lw $1, %got(y)($1)
4736; O1-NEXT:    addiu $2, $zero, -4
4737; O1-NEXT:    and $3, $1, $2
4738; O1-NEXT:    andi $1, $1, 3
4739; O1-NEXT:    sll $1, $1, 3
4740; O1-NEXT:    ori $2, $zero, 255
4741; O1-NEXT:    sllv $6, $2, $1
4742; O1-NEXT:    nor $7, $zero, $6
4743; O1-NEXT:    andi $2, $4, 255
4744; O1-NEXT:    sllv $4, $2, $1
4745; O1-NEXT:    andi $2, $5, 255
4746; O1-NEXT:    sllv $5, $2, $1
4747; O1-NEXT:  $BB12_1: # %entry
4748; O1-NEXT:    # =>This Inner Loop Header: Depth=1
4749; O1-NEXT:    ll $8, 0($3)
4750; O1-NEXT:    and $9, $8, $6
4751; O1-NEXT:    bne $9, $4, $BB12_3
4752; O1-NEXT:    nop
4753; O1-NEXT:  # %bb.2: # %entry
4754; O1-NEXT:    # in Loop: Header=BB12_1 Depth=1
4755; O1-NEXT:    and $8, $8, $7
4756; O1-NEXT:    or $8, $8, $5
4757; O1-NEXT:    sc $8, 0($3)
4758; O1-NEXT:    beqz $8, $BB12_1
4759; O1-NEXT:    nop
4760; O1-NEXT:  $BB12_3: # %entry
4761; O1-NEXT:    srlv $2, $9, $1
4762; O1-NEXT:    sll $2, $2, 24
4763; O1-NEXT:    sra $2, $2, 24
4764; O1-NEXT:  # %bb.4: # %entry
4765; O1-NEXT:    jr $ra
4766; O1-NEXT:    nop
4767;
4768; O2-LABEL: AtomicCmpSwap8:
4769; O2:       # %bb.0: # %entry
4770; O2-NEXT:    lui $2, %hi(_gp_disp)
4771; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4772; O2-NEXT:    addu $1, $2, $25
4773; O2-NEXT:    lw $1, %got(y)($1)
4774; O2-NEXT:    addiu $2, $zero, -4
4775; O2-NEXT:    and $3, $1, $2
4776; O2-NEXT:    andi $1, $1, 3
4777; O2-NEXT:    sll $1, $1, 3
4778; O2-NEXT:    ori $2, $zero, 255
4779; O2-NEXT:    sllv $6, $2, $1
4780; O2-NEXT:    nor $7, $zero, $6
4781; O2-NEXT:    andi $2, $4, 255
4782; O2-NEXT:    sllv $4, $2, $1
4783; O2-NEXT:    andi $2, $5, 255
4784; O2-NEXT:    sllv $5, $2, $1
4785; O2-NEXT:  $BB12_1: # %entry
4786; O2-NEXT:    # =>This Inner Loop Header: Depth=1
4787; O2-NEXT:    ll $8, 0($3)
4788; O2-NEXT:    and $9, $8, $6
4789; O2-NEXT:    bne $9, $4, $BB12_3
4790; O2-NEXT:    nop
4791; O2-NEXT:  # %bb.2: # %entry
4792; O2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4793; O2-NEXT:    and $8, $8, $7
4794; O2-NEXT:    or $8, $8, $5
4795; O2-NEXT:    sc $8, 0($3)
4796; O2-NEXT:    beqz $8, $BB12_1
4797; O2-NEXT:    nop
4798; O2-NEXT:  $BB12_3: # %entry
4799; O2-NEXT:    srlv $2, $9, $1
4800; O2-NEXT:    sll $2, $2, 24
4801; O2-NEXT:    sra $2, $2, 24
4802; O2-NEXT:  # %bb.4: # %entry
4803; O2-NEXT:    jr $ra
4804; O2-NEXT:    nop
4805;
4806; O3-LABEL: AtomicCmpSwap8:
4807; O3:       # %bb.0: # %entry
4808; O3-NEXT:    lui $2, %hi(_gp_disp)
4809; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
4810; O3-NEXT:    addu $1, $2, $25
4811; O3-NEXT:    addiu $2, $zero, -4
4812; O3-NEXT:    lw $1, %got(y)($1)
4813; O3-NEXT:    and $3, $1, $2
4814; O3-NEXT:    andi $1, $1, 3
4815; O3-NEXT:    ori $2, $zero, 255
4816; O3-NEXT:    sll $1, $1, 3
4817; O3-NEXT:    sllv $6, $2, $1
4818; O3-NEXT:    andi $2, $4, 255
4819; O3-NEXT:    sllv $4, $2, $1
4820; O3-NEXT:    andi $2, $5, 255
4821; O3-NEXT:    nor $7, $zero, $6
4822; O3-NEXT:    sllv $5, $2, $1
4823; O3-NEXT:  $BB12_1: # %entry
4824; O3-NEXT:    # =>This Inner Loop Header: Depth=1
4825; O3-NEXT:    ll $8, 0($3)
4826; O3-NEXT:    and $9, $8, $6
4827; O3-NEXT:    bne $9, $4, $BB12_3
4828; O3-NEXT:    nop
4829; O3-NEXT:  # %bb.2: # %entry
4830; O3-NEXT:    # in Loop: Header=BB12_1 Depth=1
4831; O3-NEXT:    and $8, $8, $7
4832; O3-NEXT:    or $8, $8, $5
4833; O3-NEXT:    sc $8, 0($3)
4834; O3-NEXT:    beqz $8, $BB12_1
4835; O3-NEXT:    nop
4836; O3-NEXT:  $BB12_3: # %entry
4837; O3-NEXT:    srlv $2, $9, $1
4838; O3-NEXT:    sll $2, $2, 24
4839; O3-NEXT:    sra $2, $2, 24
4840; O3-NEXT:  # %bb.4: # %entry
4841; O3-NEXT:    jr $ra
4842; O3-NEXT:    nop
4843;
4844; MIPS32EB-LABEL: AtomicCmpSwap8:
4845; MIPS32EB:       # %bb.0: # %entry
4846; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
4847; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
4848; MIPS32EB-NEXT:    addu $1, $2, $25
4849; MIPS32EB-NEXT:    lw $1, %got(y)($1)
4850; MIPS32EB-NEXT:    addiu $2, $zero, -4
4851; MIPS32EB-NEXT:    and $3, $1, $2
4852; MIPS32EB-NEXT:    andi $1, $1, 3
4853; MIPS32EB-NEXT:    xori $1, $1, 3
4854; MIPS32EB-NEXT:    sll $1, $1, 3
4855; MIPS32EB-NEXT:    ori $2, $zero, 255
4856; MIPS32EB-NEXT:    sllv $6, $2, $1
4857; MIPS32EB-NEXT:    nor $7, $zero, $6
4858; MIPS32EB-NEXT:    andi $2, $4, 255
4859; MIPS32EB-NEXT:    sllv $4, $2, $1
4860; MIPS32EB-NEXT:    andi $2, $5, 255
4861; MIPS32EB-NEXT:    sllv $5, $2, $1
4862; MIPS32EB-NEXT:  $BB12_1: # %entry
4863; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
4864; MIPS32EB-NEXT:    ll $8, 0($3)
4865; MIPS32EB-NEXT:    and $9, $8, $6
4866; MIPS32EB-NEXT:    bne $9, $4, $BB12_3
4867; MIPS32EB-NEXT:    nop
4868; MIPS32EB-NEXT:  # %bb.2: # %entry
4869; MIPS32EB-NEXT:    # in Loop: Header=BB12_1 Depth=1
4870; MIPS32EB-NEXT:    and $8, $8, $7
4871; MIPS32EB-NEXT:    or $8, $8, $5
4872; MIPS32EB-NEXT:    sc $8, 0($3)
4873; MIPS32EB-NEXT:    beqz $8, $BB12_1
4874; MIPS32EB-NEXT:    nop
4875; MIPS32EB-NEXT:  $BB12_3: # %entry
4876; MIPS32EB-NEXT:    srlv $2, $9, $1
4877; MIPS32EB-NEXT:    sll $2, $2, 24
4878; MIPS32EB-NEXT:    sra $2, $2, 24
4879; MIPS32EB-NEXT:  # %bb.4: # %entry
4880; MIPS32EB-NEXT:    jr $ra
4881; MIPS32EB-NEXT:    nop
4882entry:
4883  %pair0 = cmpxchg i8* @y, i8 %oldval, i8 %newval monotonic monotonic
4884  %0 = extractvalue { i8, i1 } %pair0, 0
4885  ret i8 %0
4886}
4887
4888define i1 @AtomicCmpSwapRes8(i8* %ptr, i8 signext %oldval, i8 signext %newval) nounwind {
4889; MIPS32-LABEL: AtomicCmpSwapRes8:
4890; MIPS32:       # %bb.0: # %entry
4891; MIPS32-NEXT:    addiu $1, $zero, -4
4892; MIPS32-NEXT:    and $2, $4, $1
4893; MIPS32-NEXT:    andi $1, $4, 3
4894; MIPS32-NEXT:    sll $3, $1, 3
4895; MIPS32-NEXT:    ori $1, $zero, 255
4896; MIPS32-NEXT:    sllv $4, $1, $3
4897; MIPS32-NEXT:    nor $7, $zero, $4
4898; MIPS32-NEXT:    andi $1, $5, 255
4899; MIPS32-NEXT:    sllv $8, $1, $3
4900; MIPS32-NEXT:    andi $1, $6, 255
4901; MIPS32-NEXT:    sllv $6, $1, $3
4902; MIPS32-NEXT:  $BB13_1: # %entry
4903; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
4904; MIPS32-NEXT:    ll $9, 0($2)
4905; MIPS32-NEXT:    and $10, $9, $4
4906; MIPS32-NEXT:    bne $10, $8, $BB13_3
4907; MIPS32-NEXT:    nop
4908; MIPS32-NEXT:  # %bb.2: # %entry
4909; MIPS32-NEXT:    # in Loop: Header=BB13_1 Depth=1
4910; MIPS32-NEXT:    and $9, $9, $7
4911; MIPS32-NEXT:    or $9, $9, $6
4912; MIPS32-NEXT:    sc $9, 0($2)
4913; MIPS32-NEXT:    beqz $9, $BB13_1
4914; MIPS32-NEXT:    nop
4915; MIPS32-NEXT:  $BB13_3: # %entry
4916; MIPS32-NEXT:    srlv $1, $10, $3
4917; MIPS32-NEXT:    sll $1, $1, 24
4918; MIPS32-NEXT:    sra $1, $1, 24
4919; MIPS32-NEXT:  # %bb.4: # %entry
4920; MIPS32-NEXT:    xor $1, $1, $5
4921; MIPS32-NEXT:    jr $ra
4922; MIPS32-NEXT:    sltiu $2, $1, 1
4923;
4924; MIPS32O0-LABEL: AtomicCmpSwapRes8:
4925; MIPS32O0:       # %bb.0: # %entry
4926; MIPS32O0-NEXT:    addiu $sp, $sp, -8
4927; MIPS32O0-NEXT:    move $1, $6
4928; MIPS32O0-NEXT:    move $2, $5
4929; MIPS32O0-NEXT:    move $3, $4
4930; MIPS32O0-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
4931; MIPS32O0-NEXT:    addiu $4, $zero, -4
4932; MIPS32O0-NEXT:    and $4, $3, $4
4933; MIPS32O0-NEXT:    andi $3, $3, 3
4934; MIPS32O0-NEXT:    sll $9, $3, 3
4935; MIPS32O0-NEXT:    ori $3, $zero, 255
4936; MIPS32O0-NEXT:    sllv $5, $3, $9
4937; MIPS32O0-NEXT:    nor $7, $zero, $5
4938; MIPS32O0-NEXT:    andi $2, $2, 255
4939; MIPS32O0-NEXT:    sllv $6, $2, $9
4940; MIPS32O0-NEXT:    andi $1, $1, 255
4941; MIPS32O0-NEXT:    sllv $8, $1, $9
4942; MIPS32O0-NEXT:  $BB13_1: # %entry
4943; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
4944; MIPS32O0-NEXT:    ll $2, 0($4)
4945; MIPS32O0-NEXT:    and $3, $2, $5
4946; MIPS32O0-NEXT:    bne $3, $6, $BB13_3
4947; MIPS32O0-NEXT:    nop
4948; MIPS32O0-NEXT:  # %bb.2: # %entry
4949; MIPS32O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
4950; MIPS32O0-NEXT:    and $2, $2, $7
4951; MIPS32O0-NEXT:    or $2, $2, $8
4952; MIPS32O0-NEXT:    sc $2, 0($4)
4953; MIPS32O0-NEXT:    beqz $2, $BB13_1
4954; MIPS32O0-NEXT:    nop
4955; MIPS32O0-NEXT:  $BB13_3: # %entry
4956; MIPS32O0-NEXT:    srlv $1, $3, $9
4957; MIPS32O0-NEXT:    sll $1, $1, 24
4958; MIPS32O0-NEXT:    sra $1, $1, 24
4959; MIPS32O0-NEXT:  # %bb.4: # %entry
4960; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
4961; MIPS32O0-NEXT:  # %bb.5: # %entry
4962; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
4963; MIPS32O0-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
4964; MIPS32O0-NEXT:    sll $2, $2, 24
4965; MIPS32O0-NEXT:    sra $2, $2, 24
4966; MIPS32O0-NEXT:    xor $1, $1, $2
4967; MIPS32O0-NEXT:    sltiu $2, $1, 1
4968; MIPS32O0-NEXT:    addiu $sp, $sp, 8
4969; MIPS32O0-NEXT:    jr $ra
4970; MIPS32O0-NEXT:    nop
4971;
4972; MIPS32R2-LABEL: AtomicCmpSwapRes8:
4973; MIPS32R2:       # %bb.0: # %entry
4974; MIPS32R2-NEXT:    addiu $1, $zero, -4
4975; MIPS32R2-NEXT:    and $2, $4, $1
4976; MIPS32R2-NEXT:    andi $1, $4, 3
4977; MIPS32R2-NEXT:    sll $3, $1, 3
4978; MIPS32R2-NEXT:    ori $1, $zero, 255
4979; MIPS32R2-NEXT:    sllv $4, $1, $3
4980; MIPS32R2-NEXT:    nor $7, $zero, $4
4981; MIPS32R2-NEXT:    andi $1, $5, 255
4982; MIPS32R2-NEXT:    sllv $8, $1, $3
4983; MIPS32R2-NEXT:    andi $1, $6, 255
4984; MIPS32R2-NEXT:    sllv $6, $1, $3
4985; MIPS32R2-NEXT:  $BB13_1: # %entry
4986; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
4987; MIPS32R2-NEXT:    ll $9, 0($2)
4988; MIPS32R2-NEXT:    and $10, $9, $4
4989; MIPS32R2-NEXT:    bne $10, $8, $BB13_3
4990; MIPS32R2-NEXT:    nop
4991; MIPS32R2-NEXT:  # %bb.2: # %entry
4992; MIPS32R2-NEXT:    # in Loop: Header=BB13_1 Depth=1
4993; MIPS32R2-NEXT:    and $9, $9, $7
4994; MIPS32R2-NEXT:    or $9, $9, $6
4995; MIPS32R2-NEXT:    sc $9, 0($2)
4996; MIPS32R2-NEXT:    beqz $9, $BB13_1
4997; MIPS32R2-NEXT:    nop
4998; MIPS32R2-NEXT:  $BB13_3: # %entry
4999; MIPS32R2-NEXT:    srlv $1, $10, $3
5000; MIPS32R2-NEXT:    seb $1, $1
5001; MIPS32R2-NEXT:  # %bb.4: # %entry
5002; MIPS32R2-NEXT:    xor $1, $1, $5
5003; MIPS32R2-NEXT:    jr $ra
5004; MIPS32R2-NEXT:    sltiu $2, $1, 1
5005;
5006; MIPS32R6-LABEL: AtomicCmpSwapRes8:
5007; MIPS32R6:       # %bb.0: # %entry
5008; MIPS32R6-NEXT:    addiu $1, $zero, -4
5009; MIPS32R6-NEXT:    and $2, $4, $1
5010; MIPS32R6-NEXT:    andi $1, $4, 3
5011; MIPS32R6-NEXT:    sll $3, $1, 3
5012; MIPS32R6-NEXT:    ori $1, $zero, 255
5013; MIPS32R6-NEXT:    sllv $4, $1, $3
5014; MIPS32R6-NEXT:    nor $7, $zero, $4
5015; MIPS32R6-NEXT:    andi $1, $5, 255
5016; MIPS32R6-NEXT:    sllv $8, $1, $3
5017; MIPS32R6-NEXT:    andi $1, $6, 255
5018; MIPS32R6-NEXT:    sllv $6, $1, $3
5019; MIPS32R6-NEXT:  $BB13_1: # %entry
5020; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
5021; MIPS32R6-NEXT:    ll $9, 0($2)
5022; MIPS32R6-NEXT:    and $10, $9, $4
5023; MIPS32R6-NEXT:    bnec $10, $8, $BB13_3
5024; MIPS32R6-NEXT:  # %bb.2: # %entry
5025; MIPS32R6-NEXT:    # in Loop: Header=BB13_1 Depth=1
5026; MIPS32R6-NEXT:    and $9, $9, $7
5027; MIPS32R6-NEXT:    or $9, $9, $6
5028; MIPS32R6-NEXT:    sc $9, 0($2)
5029; MIPS32R6-NEXT:    beqzc $9, $BB13_1
5030; MIPS32R6-NEXT:  $BB13_3: # %entry
5031; MIPS32R6-NEXT:    srlv $1, $10, $3
5032; MIPS32R6-NEXT:    seb $1, $1
5033; MIPS32R6-NEXT:  # %bb.4: # %entry
5034; MIPS32R6-NEXT:    xor $1, $1, $5
5035; MIPS32R6-NEXT:    jr $ra
5036; MIPS32R6-NEXT:    sltiu $2, $1, 1
5037;
5038; MIPS32R6O0-LABEL: AtomicCmpSwapRes8:
5039; MIPS32R6O0:       # %bb.0: # %entry
5040; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
5041; MIPS32R6O0-NEXT:    move $1, $6
5042; MIPS32R6O0-NEXT:    move $2, $5
5043; MIPS32R6O0-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
5044; MIPS32R6O0-NEXT:    move $3, $4
5045; MIPS32R6O0-NEXT:    # kill: def $a2 killed $at
5046; MIPS32R6O0-NEXT:    # kill: def $a1 killed $v0
5047; MIPS32R6O0-NEXT:    addiu $4, $zero, -4
5048; MIPS32R6O0-NEXT:    and $4, $3, $4
5049; MIPS32R6O0-NEXT:    andi $3, $3, 3
5050; MIPS32R6O0-NEXT:    sll $9, $3, 3
5051; MIPS32R6O0-NEXT:    ori $3, $zero, 255
5052; MIPS32R6O0-NEXT:    sllv $5, $3, $9
5053; MIPS32R6O0-NEXT:    nor $7, $zero, $5
5054; MIPS32R6O0-NEXT:    andi $2, $2, 255
5055; MIPS32R6O0-NEXT:    sllv $6, $2, $9
5056; MIPS32R6O0-NEXT:    andi $1, $1, 255
5057; MIPS32R6O0-NEXT:    sllv $8, $1, $9
5058; MIPS32R6O0-NEXT:  $BB13_1: # %entry
5059; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5060; MIPS32R6O0-NEXT:    ll $2, 0($4)
5061; MIPS32R6O0-NEXT:    and $3, $2, $5
5062; MIPS32R6O0-NEXT:    bnec $3, $6, $BB13_3
5063; MIPS32R6O0-NEXT:  # %bb.2: # %entry
5064; MIPS32R6O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
5065; MIPS32R6O0-NEXT:    and $2, $2, $7
5066; MIPS32R6O0-NEXT:    or $2, $2, $8
5067; MIPS32R6O0-NEXT:    sc $2, 0($4)
5068; MIPS32R6O0-NEXT:    beqzc $2, $BB13_1
5069; MIPS32R6O0-NEXT:  $BB13_3: # %entry
5070; MIPS32R6O0-NEXT:    srlv $1, $3, $9
5071; MIPS32R6O0-NEXT:    seb $1, $1
5072; MIPS32R6O0-NEXT:  # %bb.4: # %entry
5073; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
5074; MIPS32R6O0-NEXT:  # %bb.5: # %entry
5075; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5076; MIPS32R6O0-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
5077; MIPS32R6O0-NEXT:    xor $1, $1, $2
5078; MIPS32R6O0-NEXT:    sltiu $2, $1, 1
5079; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
5080; MIPS32R6O0-NEXT:    jrc $ra
5081;
5082; MIPS4-LABEL: AtomicCmpSwapRes8:
5083; MIPS4:       # %bb.0: # %entry
5084; MIPS4-NEXT:    daddiu $1, $zero, -4
5085; MIPS4-NEXT:    and $2, $4, $1
5086; MIPS4-NEXT:    andi $1, $4, 3
5087; MIPS4-NEXT:    sll $3, $1, 3
5088; MIPS4-NEXT:    ori $1, $zero, 255
5089; MIPS4-NEXT:    sllv $4, $1, $3
5090; MIPS4-NEXT:    nor $7, $zero, $4
5091; MIPS4-NEXT:    andi $1, $5, 255
5092; MIPS4-NEXT:    sllv $8, $1, $3
5093; MIPS4-NEXT:    andi $1, $6, 255
5094; MIPS4-NEXT:    sllv $6, $1, $3
5095; MIPS4-NEXT:  .LBB13_1: # %entry
5096; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
5097; MIPS4-NEXT:    ll $9, 0($2)
5098; MIPS4-NEXT:    and $10, $9, $4
5099; MIPS4-NEXT:    bne $10, $8, .LBB13_3
5100; MIPS4-NEXT:    nop
5101; MIPS4-NEXT:  # %bb.2: # %entry
5102; MIPS4-NEXT:    # in Loop: Header=BB13_1 Depth=1
5103; MIPS4-NEXT:    and $9, $9, $7
5104; MIPS4-NEXT:    or $9, $9, $6
5105; MIPS4-NEXT:    sc $9, 0($2)
5106; MIPS4-NEXT:    beqz $9, .LBB13_1
5107; MIPS4-NEXT:    nop
5108; MIPS4-NEXT:  .LBB13_3: # %entry
5109; MIPS4-NEXT:    srlv $1, $10, $3
5110; MIPS4-NEXT:    sll $1, $1, 24
5111; MIPS4-NEXT:    sra $1, $1, 24
5112; MIPS4-NEXT:  # %bb.4: # %entry
5113; MIPS4-NEXT:    xor $1, $1, $5
5114; MIPS4-NEXT:    jr $ra
5115; MIPS4-NEXT:    sltiu $2, $1, 1
5116;
5117; MIPS64-LABEL: AtomicCmpSwapRes8:
5118; MIPS64:       # %bb.0: # %entry
5119; MIPS64-NEXT:    daddiu $1, $zero, -4
5120; MIPS64-NEXT:    and $2, $4, $1
5121; MIPS64-NEXT:    andi $1, $4, 3
5122; MIPS64-NEXT:    sll $3, $1, 3
5123; MIPS64-NEXT:    ori $1, $zero, 255
5124; MIPS64-NEXT:    sllv $4, $1, $3
5125; MIPS64-NEXT:    nor $7, $zero, $4
5126; MIPS64-NEXT:    andi $1, $5, 255
5127; MIPS64-NEXT:    sllv $8, $1, $3
5128; MIPS64-NEXT:    andi $1, $6, 255
5129; MIPS64-NEXT:    sllv $6, $1, $3
5130; MIPS64-NEXT:  .LBB13_1: # %entry
5131; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
5132; MIPS64-NEXT:    ll $9, 0($2)
5133; MIPS64-NEXT:    and $10, $9, $4
5134; MIPS64-NEXT:    bne $10, $8, .LBB13_3
5135; MIPS64-NEXT:    nop
5136; MIPS64-NEXT:  # %bb.2: # %entry
5137; MIPS64-NEXT:    # in Loop: Header=BB13_1 Depth=1
5138; MIPS64-NEXT:    and $9, $9, $7
5139; MIPS64-NEXT:    or $9, $9, $6
5140; MIPS64-NEXT:    sc $9, 0($2)
5141; MIPS64-NEXT:    beqz $9, .LBB13_1
5142; MIPS64-NEXT:    nop
5143; MIPS64-NEXT:  .LBB13_3: # %entry
5144; MIPS64-NEXT:    srlv $1, $10, $3
5145; MIPS64-NEXT:    sll $1, $1, 24
5146; MIPS64-NEXT:    sra $1, $1, 24
5147; MIPS64-NEXT:  # %bb.4: # %entry
5148; MIPS64-NEXT:    xor $1, $1, $5
5149; MIPS64-NEXT:    jr $ra
5150; MIPS64-NEXT:    sltiu $2, $1, 1
5151;
5152; MIPS64R2-LABEL: AtomicCmpSwapRes8:
5153; MIPS64R2:       # %bb.0: # %entry
5154; MIPS64R2-NEXT:    daddiu $1, $zero, -4
5155; MIPS64R2-NEXT:    and $2, $4, $1
5156; MIPS64R2-NEXT:    andi $1, $4, 3
5157; MIPS64R2-NEXT:    sll $3, $1, 3
5158; MIPS64R2-NEXT:    ori $1, $zero, 255
5159; MIPS64R2-NEXT:    sllv $4, $1, $3
5160; MIPS64R2-NEXT:    nor $7, $zero, $4
5161; MIPS64R2-NEXT:    andi $1, $5, 255
5162; MIPS64R2-NEXT:    sllv $8, $1, $3
5163; MIPS64R2-NEXT:    andi $1, $6, 255
5164; MIPS64R2-NEXT:    sllv $6, $1, $3
5165; MIPS64R2-NEXT:  .LBB13_1: # %entry
5166; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
5167; MIPS64R2-NEXT:    ll $9, 0($2)
5168; MIPS64R2-NEXT:    and $10, $9, $4
5169; MIPS64R2-NEXT:    bne $10, $8, .LBB13_3
5170; MIPS64R2-NEXT:    nop
5171; MIPS64R2-NEXT:  # %bb.2: # %entry
5172; MIPS64R2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5173; MIPS64R2-NEXT:    and $9, $9, $7
5174; MIPS64R2-NEXT:    or $9, $9, $6
5175; MIPS64R2-NEXT:    sc $9, 0($2)
5176; MIPS64R2-NEXT:    beqz $9, .LBB13_1
5177; MIPS64R2-NEXT:    nop
5178; MIPS64R2-NEXT:  .LBB13_3: # %entry
5179; MIPS64R2-NEXT:    srlv $1, $10, $3
5180; MIPS64R2-NEXT:    seb $1, $1
5181; MIPS64R2-NEXT:  # %bb.4: # %entry
5182; MIPS64R2-NEXT:    xor $1, $1, $5
5183; MIPS64R2-NEXT:    jr $ra
5184; MIPS64R2-NEXT:    sltiu $2, $1, 1
5185;
5186; MIPS64R6-LABEL: AtomicCmpSwapRes8:
5187; MIPS64R6:       # %bb.0: # %entry
5188; MIPS64R6-NEXT:    daddiu $1, $zero, -4
5189; MIPS64R6-NEXT:    and $2, $4, $1
5190; MIPS64R6-NEXT:    andi $1, $4, 3
5191; MIPS64R6-NEXT:    sll $3, $1, 3
5192; MIPS64R6-NEXT:    ori $1, $zero, 255
5193; MIPS64R6-NEXT:    sllv $4, $1, $3
5194; MIPS64R6-NEXT:    nor $7, $zero, $4
5195; MIPS64R6-NEXT:    andi $1, $5, 255
5196; MIPS64R6-NEXT:    sllv $8, $1, $3
5197; MIPS64R6-NEXT:    andi $1, $6, 255
5198; MIPS64R6-NEXT:    sllv $6, $1, $3
5199; MIPS64R6-NEXT:  .LBB13_1: # %entry
5200; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
5201; MIPS64R6-NEXT:    ll $9, 0($2)
5202; MIPS64R6-NEXT:    and $10, $9, $4
5203; MIPS64R6-NEXT:    bnec $10, $8, .LBB13_3
5204; MIPS64R6-NEXT:  # %bb.2: # %entry
5205; MIPS64R6-NEXT:    # in Loop: Header=BB13_1 Depth=1
5206; MIPS64R6-NEXT:    and $9, $9, $7
5207; MIPS64R6-NEXT:    or $9, $9, $6
5208; MIPS64R6-NEXT:    sc $9, 0($2)
5209; MIPS64R6-NEXT:    beqzc $9, .LBB13_1
5210; MIPS64R6-NEXT:  .LBB13_3: # %entry
5211; MIPS64R6-NEXT:    srlv $1, $10, $3
5212; MIPS64R6-NEXT:    seb $1, $1
5213; MIPS64R6-NEXT:  # %bb.4: # %entry
5214; MIPS64R6-NEXT:    xor $1, $1, $5
5215; MIPS64R6-NEXT:    jr $ra
5216; MIPS64R6-NEXT:    sltiu $2, $1, 1
5217;
5218; MIPS64R6O0-LABEL: AtomicCmpSwapRes8:
5219; MIPS64R6O0:       # %bb.0: # %entry
5220; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
5221; MIPS64R6O0-NEXT:    move $3, $4
5222; MIPS64R6O0-NEXT:    move $1, $6
5223; MIPS64R6O0-NEXT:    move $2, $5
5224; MIPS64R6O0-NEXT:    sw $2, 8($sp) # 4-byte Folded Spill
5225; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
5226; MIPS64R6O0-NEXT:    and $4, $3, $4
5227; MIPS64R6O0-NEXT:    andi $3, $3, 3
5228; MIPS64R6O0-NEXT:    xori $3, $3, 3
5229; MIPS64R6O0-NEXT:    sll $9, $3, 3
5230; MIPS64R6O0-NEXT:    ori $3, $zero, 255
5231; MIPS64R6O0-NEXT:    sllv $5, $3, $9
5232; MIPS64R6O0-NEXT:    nor $7, $zero, $5
5233; MIPS64R6O0-NEXT:    andi $2, $2, 255
5234; MIPS64R6O0-NEXT:    sllv $6, $2, $9
5235; MIPS64R6O0-NEXT:    andi $1, $1, 255
5236; MIPS64R6O0-NEXT:    sllv $8, $1, $9
5237; MIPS64R6O0-NEXT:  .LBB13_1: # %entry
5238; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5239; MIPS64R6O0-NEXT:    ll $2, 0($4)
5240; MIPS64R6O0-NEXT:    and $3, $2, $5
5241; MIPS64R6O0-NEXT:    bnec $3, $6, .LBB13_3
5242; MIPS64R6O0-NEXT:  # %bb.2: # %entry
5243; MIPS64R6O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
5244; MIPS64R6O0-NEXT:    and $2, $2, $7
5245; MIPS64R6O0-NEXT:    or $2, $2, $8
5246; MIPS64R6O0-NEXT:    sc $2, 0($4)
5247; MIPS64R6O0-NEXT:    beqzc $2, .LBB13_1
5248; MIPS64R6O0-NEXT:  .LBB13_3: # %entry
5249; MIPS64R6O0-NEXT:    srlv $1, $3, $9
5250; MIPS64R6O0-NEXT:    seb $1, $1
5251; MIPS64R6O0-NEXT:  # %bb.4: # %entry
5252; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
5253; MIPS64R6O0-NEXT:  # %bb.5: # %entry
5254; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
5255; MIPS64R6O0-NEXT:    lw $2, 8($sp) # 4-byte Folded Reload
5256; MIPS64R6O0-NEXT:    xor $1, $1, $2
5257; MIPS64R6O0-NEXT:    sltiu $2, $1, 1
5258; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
5259; MIPS64R6O0-NEXT:    jrc $ra
5260;
5261; MM32-LABEL: AtomicCmpSwapRes8:
5262; MM32:       # %bb.0: # %entry
5263; MM32-NEXT:    addiu $1, $zero, -4
5264; MM32-NEXT:    and $2, $4, $1
5265; MM32-NEXT:    andi $1, $4, 3
5266; MM32-NEXT:    sll $3, $1, 3
5267; MM32-NEXT:    ori $1, $zero, 255
5268; MM32-NEXT:    sllv $4, $1, $3
5269; MM32-NEXT:    nor $7, $zero, $4
5270; MM32-NEXT:    andi $1, $5, 255
5271; MM32-NEXT:    sllv $8, $1, $3
5272; MM32-NEXT:    andi $1, $6, 255
5273; MM32-NEXT:    sllv $6, $1, $3
5274; MM32-NEXT:  $BB13_1: # %entry
5275; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
5276; MM32-NEXT:    ll $9, 0($2)
5277; MM32-NEXT:    and $10, $9, $4
5278; MM32-NEXT:    bne $10, $8, $BB13_3
5279; MM32-NEXT:    nop
5280; MM32-NEXT:  # %bb.2: # %entry
5281; MM32-NEXT:    # in Loop: Header=BB13_1 Depth=1
5282; MM32-NEXT:    and $9, $9, $7
5283; MM32-NEXT:    or $9, $9, $6
5284; MM32-NEXT:    sc $9, 0($2)
5285; MM32-NEXT:    beqzc $9, $BB13_1
5286; MM32-NEXT:  $BB13_3: # %entry
5287; MM32-NEXT:    srlv $1, $10, $3
5288; MM32-NEXT:    seb $1, $1
5289; MM32-NEXT:  # %bb.4: # %entry
5290; MM32-NEXT:    xor $1, $1, $5
5291; MM32-NEXT:    jr $ra
5292; MM32-NEXT:    sltiu $2, $1, 1
5293;
5294; O1-LABEL: AtomicCmpSwapRes8:
5295; O1:       # %bb.0: # %entry
5296; O1-NEXT:    addiu $1, $zero, -4
5297; O1-NEXT:    and $2, $4, $1
5298; O1-NEXT:    andi $1, $4, 3
5299; O1-NEXT:    sll $3, $1, 3
5300; O1-NEXT:    ori $1, $zero, 255
5301; O1-NEXT:    sllv $4, $1, $3
5302; O1-NEXT:    nor $7, $zero, $4
5303; O1-NEXT:    andi $1, $5, 255
5304; O1-NEXT:    sllv $8, $1, $3
5305; O1-NEXT:    andi $1, $6, 255
5306; O1-NEXT:    sllv $6, $1, $3
5307; O1-NEXT:  $BB13_1: # %entry
5308; O1-NEXT:    # =>This Inner Loop Header: Depth=1
5309; O1-NEXT:    ll $9, 0($2)
5310; O1-NEXT:    and $10, $9, $4
5311; O1-NEXT:    bne $10, $8, $BB13_3
5312; O1-NEXT:    nop
5313; O1-NEXT:  # %bb.2: # %entry
5314; O1-NEXT:    # in Loop: Header=BB13_1 Depth=1
5315; O1-NEXT:    and $9, $9, $7
5316; O1-NEXT:    or $9, $9, $6
5317; O1-NEXT:    sc $9, 0($2)
5318; O1-NEXT:    beqz $9, $BB13_1
5319; O1-NEXT:    nop
5320; O1-NEXT:  $BB13_3: # %entry
5321; O1-NEXT:    srlv $1, $10, $3
5322; O1-NEXT:    sll $1, $1, 24
5323; O1-NEXT:    sra $1, $1, 24
5324; O1-NEXT:  # %bb.4: # %entry
5325; O1-NEXT:    xor $1, $1, $5
5326; O1-NEXT:    jr $ra
5327; O1-NEXT:    sltiu $2, $1, 1
5328;
5329; O2-LABEL: AtomicCmpSwapRes8:
5330; O2:       # %bb.0: # %entry
5331; O2-NEXT:    addiu $1, $zero, -4
5332; O2-NEXT:    and $2, $4, $1
5333; O2-NEXT:    andi $1, $4, 3
5334; O2-NEXT:    sll $3, $1, 3
5335; O2-NEXT:    ori $1, $zero, 255
5336; O2-NEXT:    sllv $4, $1, $3
5337; O2-NEXT:    nor $7, $zero, $4
5338; O2-NEXT:    andi $1, $5, 255
5339; O2-NEXT:    sllv $8, $1, $3
5340; O2-NEXT:    andi $1, $6, 255
5341; O2-NEXT:    sllv $6, $1, $3
5342; O2-NEXT:  $BB13_1: # %entry
5343; O2-NEXT:    # =>This Inner Loop Header: Depth=1
5344; O2-NEXT:    ll $9, 0($2)
5345; O2-NEXT:    and $10, $9, $4
5346; O2-NEXT:    bne $10, $8, $BB13_3
5347; O2-NEXT:    nop
5348; O2-NEXT:  # %bb.2: # %entry
5349; O2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5350; O2-NEXT:    and $9, $9, $7
5351; O2-NEXT:    or $9, $9, $6
5352; O2-NEXT:    sc $9, 0($2)
5353; O2-NEXT:    beqz $9, $BB13_1
5354; O2-NEXT:    nop
5355; O2-NEXT:  $BB13_3: # %entry
5356; O2-NEXT:    srlv $1, $10, $3
5357; O2-NEXT:    sll $1, $1, 24
5358; O2-NEXT:    sra $1, $1, 24
5359; O2-NEXT:  # %bb.4: # %entry
5360; O2-NEXT:    xor $1, $1, $5
5361; O2-NEXT:    jr $ra
5362; O2-NEXT:    sltiu $2, $1, 1
5363;
5364; O3-LABEL: AtomicCmpSwapRes8:
5365; O3:       # %bb.0: # %entry
5366; O3-NEXT:    addiu $1, $zero, -4
5367; O3-NEXT:    and $2, $4, $1
5368; O3-NEXT:    andi $1, $4, 3
5369; O3-NEXT:    sll $3, $1, 3
5370; O3-NEXT:    ori $1, $zero, 255
5371; O3-NEXT:    sllv $4, $1, $3
5372; O3-NEXT:    andi $1, $5, 255
5373; O3-NEXT:    sllv $8, $1, $3
5374; O3-NEXT:    andi $1, $6, 255
5375; O3-NEXT:    nor $7, $zero, $4
5376; O3-NEXT:    sllv $6, $1, $3
5377; O3-NEXT:  $BB13_1: # %entry
5378; O3-NEXT:    # =>This Inner Loop Header: Depth=1
5379; O3-NEXT:    ll $9, 0($2)
5380; O3-NEXT:    and $10, $9, $4
5381; O3-NEXT:    bne $10, $8, $BB13_3
5382; O3-NEXT:    nop
5383; O3-NEXT:  # %bb.2: # %entry
5384; O3-NEXT:    # in Loop: Header=BB13_1 Depth=1
5385; O3-NEXT:    and $9, $9, $7
5386; O3-NEXT:    or $9, $9, $6
5387; O3-NEXT:    sc $9, 0($2)
5388; O3-NEXT:    beqz $9, $BB13_1
5389; O3-NEXT:    nop
5390; O3-NEXT:  $BB13_3: # %entry
5391; O3-NEXT:    srlv $1, $10, $3
5392; O3-NEXT:    sll $1, $1, 24
5393; O3-NEXT:    sra $1, $1, 24
5394; O3-NEXT:  # %bb.4: # %entry
5395; O3-NEXT:    xor $1, $1, $5
5396; O3-NEXT:    jr $ra
5397; O3-NEXT:    sltiu $2, $1, 1
5398;
5399; MIPS32EB-LABEL: AtomicCmpSwapRes8:
5400; MIPS32EB:       # %bb.0: # %entry
5401; MIPS32EB-NEXT:    addiu $1, $zero, -4
5402; MIPS32EB-NEXT:    and $2, $4, $1
5403; MIPS32EB-NEXT:    andi $1, $4, 3
5404; MIPS32EB-NEXT:    xori $1, $1, 3
5405; MIPS32EB-NEXT:    sll $3, $1, 3
5406; MIPS32EB-NEXT:    ori $1, $zero, 255
5407; MIPS32EB-NEXT:    sllv $4, $1, $3
5408; MIPS32EB-NEXT:    nor $7, $zero, $4
5409; MIPS32EB-NEXT:    andi $1, $5, 255
5410; MIPS32EB-NEXT:    sllv $8, $1, $3
5411; MIPS32EB-NEXT:    andi $1, $6, 255
5412; MIPS32EB-NEXT:    sllv $6, $1, $3
5413; MIPS32EB-NEXT:  $BB13_1: # %entry
5414; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
5415; MIPS32EB-NEXT:    ll $9, 0($2)
5416; MIPS32EB-NEXT:    and $10, $9, $4
5417; MIPS32EB-NEXT:    bne $10, $8, $BB13_3
5418; MIPS32EB-NEXT:    nop
5419; MIPS32EB-NEXT:  # %bb.2: # %entry
5420; MIPS32EB-NEXT:    # in Loop: Header=BB13_1 Depth=1
5421; MIPS32EB-NEXT:    and $9, $9, $7
5422; MIPS32EB-NEXT:    or $9, $9, $6
5423; MIPS32EB-NEXT:    sc $9, 0($2)
5424; MIPS32EB-NEXT:    beqz $9, $BB13_1
5425; MIPS32EB-NEXT:    nop
5426; MIPS32EB-NEXT:  $BB13_3: # %entry
5427; MIPS32EB-NEXT:    srlv $1, $10, $3
5428; MIPS32EB-NEXT:    sll $1, $1, 24
5429; MIPS32EB-NEXT:    sra $1, $1, 24
5430; MIPS32EB-NEXT:  # %bb.4: # %entry
5431; MIPS32EB-NEXT:    xor $1, $1, $5
5432; MIPS32EB-NEXT:    jr $ra
5433; MIPS32EB-NEXT:    sltiu $2, $1, 1
5434entry:
5435  %0 = cmpxchg i8* %ptr, i8 %oldval, i8 %newval monotonic monotonic
5436  %1 = extractvalue { i8, i1 } %0, 1
5437  ret i1 %1
5438; FIXME: -march=mips produces a redundant sign extension here...
5439; FIXME: ...Leading to this split check.
5440
5441}
5442
5443; Check one i16 so that we cover the seh sign extend
5444@z = common global i16 0, align 1
5445
5446define signext i16 @AtomicLoadAdd16(i16 signext %incr) nounwind {
5447; MIPS32-LABEL: AtomicLoadAdd16:
5448; MIPS32:       # %bb.0: # %entry
5449; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
5450; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
5451; MIPS32-NEXT:    addu $1, $2, $25
5452; MIPS32-NEXT:    lw $1, %got(z)($1)
5453; MIPS32-NEXT:    addiu $2, $zero, -4
5454; MIPS32-NEXT:    and $2, $1, $2
5455; MIPS32-NEXT:    andi $1, $1, 3
5456; MIPS32-NEXT:    sll $3, $1, 3
5457; MIPS32-NEXT:    ori $1, $zero, 65535
5458; MIPS32-NEXT:    sllv $5, $1, $3
5459; MIPS32-NEXT:    nor $6, $zero, $5
5460; MIPS32-NEXT:    sllv $4, $4, $3
5461; MIPS32-NEXT:  $BB14_1: # %entry
5462; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
5463; MIPS32-NEXT:    ll $7, 0($2)
5464; MIPS32-NEXT:    addu $8, $7, $4
5465; MIPS32-NEXT:    and $8, $8, $5
5466; MIPS32-NEXT:    and $9, $7, $6
5467; MIPS32-NEXT:    or $9, $9, $8
5468; MIPS32-NEXT:    sc $9, 0($2)
5469; MIPS32-NEXT:    beqz $9, $BB14_1
5470; MIPS32-NEXT:    nop
5471; MIPS32-NEXT:  # %bb.2: # %entry
5472; MIPS32-NEXT:    and $1, $7, $5
5473; MIPS32-NEXT:    srlv $1, $1, $3
5474; MIPS32-NEXT:    sll $1, $1, 16
5475; MIPS32-NEXT:    sra $1, $1, 16
5476; MIPS32-NEXT:  # %bb.3: # %entry
5477; MIPS32-NEXT:    sll $1, $1, 16
5478; MIPS32-NEXT:    jr $ra
5479; MIPS32-NEXT:    sra $2, $1, 16
5480;
5481; MIPS32O0-LABEL: AtomicLoadAdd16:
5482; MIPS32O0:       # %bb.0: # %entry
5483; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
5484; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
5485; MIPS32O0-NEXT:    addiu $sp, $sp, -8
5486; MIPS32O0-NEXT:    addu $1, $2, $25
5487; MIPS32O0-NEXT:    lw $1, %got(z)($1)
5488; MIPS32O0-NEXT:    addiu $2, $zero, -4
5489; MIPS32O0-NEXT:    and $5, $1, $2
5490; MIPS32O0-NEXT:    andi $1, $1, 3
5491; MIPS32O0-NEXT:    sll $9, $1, 3
5492; MIPS32O0-NEXT:    ori $1, $zero, 65535
5493; MIPS32O0-NEXT:    sllv $7, $1, $9
5494; MIPS32O0-NEXT:    nor $8, $zero, $7
5495; MIPS32O0-NEXT:    sllv $6, $4, $9
5496; MIPS32O0-NEXT:  $BB14_1: # %entry
5497; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
5498; MIPS32O0-NEXT:    ll $2, 0($5)
5499; MIPS32O0-NEXT:    addu $3, $2, $6
5500; MIPS32O0-NEXT:    and $3, $3, $7
5501; MIPS32O0-NEXT:    and $4, $2, $8
5502; MIPS32O0-NEXT:    or $4, $4, $3
5503; MIPS32O0-NEXT:    sc $4, 0($5)
5504; MIPS32O0-NEXT:    beqz $4, $BB14_1
5505; MIPS32O0-NEXT:    nop
5506; MIPS32O0-NEXT:  # %bb.2: # %entry
5507; MIPS32O0-NEXT:    and $1, $2, $7
5508; MIPS32O0-NEXT:    srlv $1, $1, $9
5509; MIPS32O0-NEXT:    sll $1, $1, 16
5510; MIPS32O0-NEXT:    sra $1, $1, 16
5511; MIPS32O0-NEXT:  # %bb.3: # %entry
5512; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
5513; MIPS32O0-NEXT:  # %bb.4: # %entry
5514; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5515; MIPS32O0-NEXT:    sll $1, $1, 16
5516; MIPS32O0-NEXT:    sra $2, $1, 16
5517; MIPS32O0-NEXT:    addiu $sp, $sp, 8
5518; MIPS32O0-NEXT:    jr $ra
5519; MIPS32O0-NEXT:    nop
5520;
5521; MIPS32R2-LABEL: AtomicLoadAdd16:
5522; MIPS32R2:       # %bb.0: # %entry
5523; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
5524; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
5525; MIPS32R2-NEXT:    addu $1, $2, $25
5526; MIPS32R2-NEXT:    lw $1, %got(z)($1)
5527; MIPS32R2-NEXT:    addiu $2, $zero, -4
5528; MIPS32R2-NEXT:    and $2, $1, $2
5529; MIPS32R2-NEXT:    andi $1, $1, 3
5530; MIPS32R2-NEXT:    sll $3, $1, 3
5531; MIPS32R2-NEXT:    ori $1, $zero, 65535
5532; MIPS32R2-NEXT:    sllv $5, $1, $3
5533; MIPS32R2-NEXT:    nor $6, $zero, $5
5534; MIPS32R2-NEXT:    sllv $4, $4, $3
5535; MIPS32R2-NEXT:  $BB14_1: # %entry
5536; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
5537; MIPS32R2-NEXT:    ll $7, 0($2)
5538; MIPS32R2-NEXT:    addu $8, $7, $4
5539; MIPS32R2-NEXT:    and $8, $8, $5
5540; MIPS32R2-NEXT:    and $9, $7, $6
5541; MIPS32R2-NEXT:    or $9, $9, $8
5542; MIPS32R2-NEXT:    sc $9, 0($2)
5543; MIPS32R2-NEXT:    beqz $9, $BB14_1
5544; MIPS32R2-NEXT:    nop
5545; MIPS32R2-NEXT:  # %bb.2: # %entry
5546; MIPS32R2-NEXT:    and $1, $7, $5
5547; MIPS32R2-NEXT:    srlv $1, $1, $3
5548; MIPS32R2-NEXT:    seh $1, $1
5549; MIPS32R2-NEXT:  # %bb.3: # %entry
5550; MIPS32R2-NEXT:    jr $ra
5551; MIPS32R2-NEXT:    seh $2, $1
5552;
5553; MIPS32R6-LABEL: AtomicLoadAdd16:
5554; MIPS32R6:       # %bb.0: # %entry
5555; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
5556; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
5557; MIPS32R6-NEXT:    addu $1, $2, $25
5558; MIPS32R6-NEXT:    lw $1, %got(z)($1)
5559; MIPS32R6-NEXT:    addiu $2, $zero, -4
5560; MIPS32R6-NEXT:    and $2, $1, $2
5561; MIPS32R6-NEXT:    andi $1, $1, 3
5562; MIPS32R6-NEXT:    sll $3, $1, 3
5563; MIPS32R6-NEXT:    ori $1, $zero, 65535
5564; MIPS32R6-NEXT:    sllv $5, $1, $3
5565; MIPS32R6-NEXT:    nor $6, $zero, $5
5566; MIPS32R6-NEXT:    sllv $4, $4, $3
5567; MIPS32R6-NEXT:  $BB14_1: # %entry
5568; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
5569; MIPS32R6-NEXT:    ll $7, 0($2)
5570; MIPS32R6-NEXT:    addu $8, $7, $4
5571; MIPS32R6-NEXT:    and $8, $8, $5
5572; MIPS32R6-NEXT:    and $9, $7, $6
5573; MIPS32R6-NEXT:    or $9, $9, $8
5574; MIPS32R6-NEXT:    sc $9, 0($2)
5575; MIPS32R6-NEXT:    beqzc $9, $BB14_1
5576; MIPS32R6-NEXT:  # %bb.2: # %entry
5577; MIPS32R6-NEXT:    and $1, $7, $5
5578; MIPS32R6-NEXT:    srlv $1, $1, $3
5579; MIPS32R6-NEXT:    seh $1, $1
5580; MIPS32R6-NEXT:  # %bb.3: # %entry
5581; MIPS32R6-NEXT:    jr $ra
5582; MIPS32R6-NEXT:    seh $2, $1
5583;
5584; MIPS32R6O0-LABEL: AtomicLoadAdd16:
5585; MIPS32R6O0:       # %bb.0: # %entry
5586; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
5587; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
5588; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
5589; MIPS32R6O0-NEXT:    addu $1, $2, $25
5590; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a0
5591; MIPS32R6O0-NEXT:    lw $1, %got(z)($1)
5592; MIPS32R6O0-NEXT:    addiu $2, $zero, -4
5593; MIPS32R6O0-NEXT:    and $5, $1, $2
5594; MIPS32R6O0-NEXT:    andi $1, $1, 3
5595; MIPS32R6O0-NEXT:    sll $9, $1, 3
5596; MIPS32R6O0-NEXT:    ori $1, $zero, 65535
5597; MIPS32R6O0-NEXT:    sllv $7, $1, $9
5598; MIPS32R6O0-NEXT:    nor $8, $zero, $7
5599; MIPS32R6O0-NEXT:    sllv $6, $4, $9
5600; MIPS32R6O0-NEXT:  $BB14_1: # %entry
5601; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5602; MIPS32R6O0-NEXT:    ll $2, 0($5)
5603; MIPS32R6O0-NEXT:    addu $3, $2, $6
5604; MIPS32R6O0-NEXT:    and $3, $3, $7
5605; MIPS32R6O0-NEXT:    and $4, $2, $8
5606; MIPS32R6O0-NEXT:    or $4, $4, $3
5607; MIPS32R6O0-NEXT:    sc $4, 0($5)
5608; MIPS32R6O0-NEXT:    beqzc $4, $BB14_1
5609; MIPS32R6O0-NEXT:  # %bb.2: # %entry
5610; MIPS32R6O0-NEXT:    and $1, $2, $7
5611; MIPS32R6O0-NEXT:    srlv $1, $1, $9
5612; MIPS32R6O0-NEXT:    seh $1, $1
5613; MIPS32R6O0-NEXT:  # %bb.3: # %entry
5614; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
5615; MIPS32R6O0-NEXT:  # %bb.4: # %entry
5616; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5617; MIPS32R6O0-NEXT:    seh $2, $1
5618; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
5619; MIPS32R6O0-NEXT:    jrc $ra
5620;
5621; MIPS4-LABEL: AtomicLoadAdd16:
5622; MIPS4:       # %bb.0: # %entry
5623; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5624; MIPS4-NEXT:    daddu $1, $1, $25
5625; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5626; MIPS4-NEXT:    ld $1, %got_disp(z)($1)
5627; MIPS4-NEXT:    daddiu $2, $zero, -4
5628; MIPS4-NEXT:    and $2, $1, $2
5629; MIPS4-NEXT:    andi $1, $1, 3
5630; MIPS4-NEXT:    sll $3, $1, 3
5631; MIPS4-NEXT:    ori $1, $zero, 65535
5632; MIPS4-NEXT:    sllv $5, $1, $3
5633; MIPS4-NEXT:    nor $6, $zero, $5
5634; MIPS4-NEXT:    sllv $4, $4, $3
5635; MIPS4-NEXT:  .LBB14_1: # %entry
5636; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
5637; MIPS4-NEXT:    ll $7, 0($2)
5638; MIPS4-NEXT:    addu $8, $7, $4
5639; MIPS4-NEXT:    and $8, $8, $5
5640; MIPS4-NEXT:    and $9, $7, $6
5641; MIPS4-NEXT:    or $9, $9, $8
5642; MIPS4-NEXT:    sc $9, 0($2)
5643; MIPS4-NEXT:    beqz $9, .LBB14_1
5644; MIPS4-NEXT:    nop
5645; MIPS4-NEXT:  # %bb.2: # %entry
5646; MIPS4-NEXT:    and $1, $7, $5
5647; MIPS4-NEXT:    srlv $1, $1, $3
5648; MIPS4-NEXT:    sll $1, $1, 16
5649; MIPS4-NEXT:    sra $1, $1, 16
5650; MIPS4-NEXT:  # %bb.3: # %entry
5651; MIPS4-NEXT:    sll $1, $1, 16
5652; MIPS4-NEXT:    jr $ra
5653; MIPS4-NEXT:    sra $2, $1, 16
5654;
5655; MIPS64-LABEL: AtomicLoadAdd16:
5656; MIPS64:       # %bb.0: # %entry
5657; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5658; MIPS64-NEXT:    daddu $1, $1, $25
5659; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5660; MIPS64-NEXT:    ld $1, %got_disp(z)($1)
5661; MIPS64-NEXT:    daddiu $2, $zero, -4
5662; MIPS64-NEXT:    and $2, $1, $2
5663; MIPS64-NEXT:    andi $1, $1, 3
5664; MIPS64-NEXT:    sll $3, $1, 3
5665; MIPS64-NEXT:    ori $1, $zero, 65535
5666; MIPS64-NEXT:    sllv $5, $1, $3
5667; MIPS64-NEXT:    nor $6, $zero, $5
5668; MIPS64-NEXT:    sllv $4, $4, $3
5669; MIPS64-NEXT:  .LBB14_1: # %entry
5670; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
5671; MIPS64-NEXT:    ll $7, 0($2)
5672; MIPS64-NEXT:    addu $8, $7, $4
5673; MIPS64-NEXT:    and $8, $8, $5
5674; MIPS64-NEXT:    and $9, $7, $6
5675; MIPS64-NEXT:    or $9, $9, $8
5676; MIPS64-NEXT:    sc $9, 0($2)
5677; MIPS64-NEXT:    beqz $9, .LBB14_1
5678; MIPS64-NEXT:    nop
5679; MIPS64-NEXT:  # %bb.2: # %entry
5680; MIPS64-NEXT:    and $1, $7, $5
5681; MIPS64-NEXT:    srlv $1, $1, $3
5682; MIPS64-NEXT:    sll $1, $1, 16
5683; MIPS64-NEXT:    sra $1, $1, 16
5684; MIPS64-NEXT:  # %bb.3: # %entry
5685; MIPS64-NEXT:    sll $1, $1, 16
5686; MIPS64-NEXT:    jr $ra
5687; MIPS64-NEXT:    sra $2, $1, 16
5688;
5689; MIPS64R2-LABEL: AtomicLoadAdd16:
5690; MIPS64R2:       # %bb.0: # %entry
5691; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5692; MIPS64R2-NEXT:    daddu $1, $1, $25
5693; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5694; MIPS64R2-NEXT:    ld $1, %got_disp(z)($1)
5695; MIPS64R2-NEXT:    daddiu $2, $zero, -4
5696; MIPS64R2-NEXT:    and $2, $1, $2
5697; MIPS64R2-NEXT:    andi $1, $1, 3
5698; MIPS64R2-NEXT:    sll $3, $1, 3
5699; MIPS64R2-NEXT:    ori $1, $zero, 65535
5700; MIPS64R2-NEXT:    sllv $5, $1, $3
5701; MIPS64R2-NEXT:    nor $6, $zero, $5
5702; MIPS64R2-NEXT:    sllv $4, $4, $3
5703; MIPS64R2-NEXT:  .LBB14_1: # %entry
5704; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
5705; MIPS64R2-NEXT:    ll $7, 0($2)
5706; MIPS64R2-NEXT:    addu $8, $7, $4
5707; MIPS64R2-NEXT:    and $8, $8, $5
5708; MIPS64R2-NEXT:    and $9, $7, $6
5709; MIPS64R2-NEXT:    or $9, $9, $8
5710; MIPS64R2-NEXT:    sc $9, 0($2)
5711; MIPS64R2-NEXT:    beqz $9, .LBB14_1
5712; MIPS64R2-NEXT:    nop
5713; MIPS64R2-NEXT:  # %bb.2: # %entry
5714; MIPS64R2-NEXT:    and $1, $7, $5
5715; MIPS64R2-NEXT:    srlv $1, $1, $3
5716; MIPS64R2-NEXT:    seh $1, $1
5717; MIPS64R2-NEXT:  # %bb.3: # %entry
5718; MIPS64R2-NEXT:    jr $ra
5719; MIPS64R2-NEXT:    seh $2, $1
5720;
5721; MIPS64R6-LABEL: AtomicLoadAdd16:
5722; MIPS64R6:       # %bb.0: # %entry
5723; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5724; MIPS64R6-NEXT:    daddu $1, $1, $25
5725; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5726; MIPS64R6-NEXT:    ld $1, %got_disp(z)($1)
5727; MIPS64R6-NEXT:    daddiu $2, $zero, -4
5728; MIPS64R6-NEXT:    and $2, $1, $2
5729; MIPS64R6-NEXT:    andi $1, $1, 3
5730; MIPS64R6-NEXT:    sll $3, $1, 3
5731; MIPS64R6-NEXT:    ori $1, $zero, 65535
5732; MIPS64R6-NEXT:    sllv $5, $1, $3
5733; MIPS64R6-NEXT:    nor $6, $zero, $5
5734; MIPS64R6-NEXT:    sllv $4, $4, $3
5735; MIPS64R6-NEXT:  .LBB14_1: # %entry
5736; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
5737; MIPS64R6-NEXT:    ll $7, 0($2)
5738; MIPS64R6-NEXT:    addu $8, $7, $4
5739; MIPS64R6-NEXT:    and $8, $8, $5
5740; MIPS64R6-NEXT:    and $9, $7, $6
5741; MIPS64R6-NEXT:    or $9, $9, $8
5742; MIPS64R6-NEXT:    sc $9, 0($2)
5743; MIPS64R6-NEXT:    beqzc $9, .LBB14_1
5744; MIPS64R6-NEXT:  # %bb.2: # %entry
5745; MIPS64R6-NEXT:    and $1, $7, $5
5746; MIPS64R6-NEXT:    srlv $1, $1, $3
5747; MIPS64R6-NEXT:    seh $1, $1
5748; MIPS64R6-NEXT:  # %bb.3: # %entry
5749; MIPS64R6-NEXT:    jr $ra
5750; MIPS64R6-NEXT:    seh $2, $1
5751;
5752; MIPS64R6O0-LABEL: AtomicLoadAdd16:
5753; MIPS64R6O0:       # %bb.0: # %entry
5754; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
5755; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5756; MIPS64R6O0-NEXT:    daddu $1, $1, $25
5757; MIPS64R6O0-NEXT:    daddiu $2, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5758; MIPS64R6O0-NEXT:    move $1, $4
5759; MIPS64R6O0-NEXT:    ld $2, %got_disp(z)($2)
5760; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
5761; MIPS64R6O0-NEXT:    and $5, $2, $3
5762; MIPS64R6O0-NEXT:    andi $2, $2, 3
5763; MIPS64R6O0-NEXT:    xori $2, $2, 2
5764; MIPS64R6O0-NEXT:    sll $9, $2, 3
5765; MIPS64R6O0-NEXT:    ori $2, $zero, 65535
5766; MIPS64R6O0-NEXT:    sllv $7, $2, $9
5767; MIPS64R6O0-NEXT:    nor $8, $zero, $7
5768; MIPS64R6O0-NEXT:    sllv $6, $1, $9
5769; MIPS64R6O0-NEXT:  .LBB14_1: # %entry
5770; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5771; MIPS64R6O0-NEXT:    ll $2, 0($5)
5772; MIPS64R6O0-NEXT:    addu $3, $2, $6
5773; MIPS64R6O0-NEXT:    and $3, $3, $7
5774; MIPS64R6O0-NEXT:    and $4, $2, $8
5775; MIPS64R6O0-NEXT:    or $4, $4, $3
5776; MIPS64R6O0-NEXT:    sc $4, 0($5)
5777; MIPS64R6O0-NEXT:    beqzc $4, .LBB14_1
5778; MIPS64R6O0-NEXT:  # %bb.2: # %entry
5779; MIPS64R6O0-NEXT:    and $1, $2, $7
5780; MIPS64R6O0-NEXT:    srlv $1, $1, $9
5781; MIPS64R6O0-NEXT:    seh $1, $1
5782; MIPS64R6O0-NEXT:  # %bb.3: # %entry
5783; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
5784; MIPS64R6O0-NEXT:  # %bb.4: # %entry
5785; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
5786; MIPS64R6O0-NEXT:    seh $2, $1
5787; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
5788; MIPS64R6O0-NEXT:    jrc $ra
5789;
5790; MM32-LABEL: AtomicLoadAdd16:
5791; MM32:       # %bb.0: # %entry
5792; MM32-NEXT:    lui $2, %hi(_gp_disp)
5793; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
5794; MM32-NEXT:    addu $2, $2, $25
5795; MM32-NEXT:    lw $1, %got(z)($2)
5796; MM32-NEXT:    addiu $2, $zero, -4
5797; MM32-NEXT:    and $2, $1, $2
5798; MM32-NEXT:    andi $1, $1, 3
5799; MM32-NEXT:    sll $3, $1, 3
5800; MM32-NEXT:    ori $1, $zero, 65535
5801; MM32-NEXT:    sllv $5, $1, $3
5802; MM32-NEXT:    nor $6, $zero, $5
5803; MM32-NEXT:    sllv $4, $4, $3
5804; MM32-NEXT:  $BB14_1: # %entry
5805; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
5806; MM32-NEXT:    ll $7, 0($2)
5807; MM32-NEXT:    addu $8, $7, $4
5808; MM32-NEXT:    and $8, $8, $5
5809; MM32-NEXT:    and $9, $7, $6
5810; MM32-NEXT:    or $9, $9, $8
5811; MM32-NEXT:    sc $9, 0($2)
5812; MM32-NEXT:    beqzc $9, $BB14_1
5813; MM32-NEXT:  # %bb.2: # %entry
5814; MM32-NEXT:    and $1, $7, $5
5815; MM32-NEXT:    srlv $1, $1, $3
5816; MM32-NEXT:    seh $1, $1
5817; MM32-NEXT:  # %bb.3: # %entry
5818; MM32-NEXT:    jr $ra
5819; MM32-NEXT:    seh $2, $1
5820;
5821; O1-LABEL: AtomicLoadAdd16:
5822; O1:       # %bb.0: # %entry
5823; O1-NEXT:    lui $2, %hi(_gp_disp)
5824; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
5825; O1-NEXT:    addu $1, $2, $25
5826; O1-NEXT:    lw $1, %got(z)($1)
5827; O1-NEXT:    addiu $2, $zero, -4
5828; O1-NEXT:    and $2, $1, $2
5829; O1-NEXT:    andi $1, $1, 3
5830; O1-NEXT:    sll $3, $1, 3
5831; O1-NEXT:    ori $1, $zero, 65535
5832; O1-NEXT:    sllv $5, $1, $3
5833; O1-NEXT:    nor $6, $zero, $5
5834; O1-NEXT:    sllv $4, $4, $3
5835; O1-NEXT:  $BB14_1: # %entry
5836; O1-NEXT:    # =>This Inner Loop Header: Depth=1
5837; O1-NEXT:    ll $7, 0($2)
5838; O1-NEXT:    addu $8, $7, $4
5839; O1-NEXT:    and $8, $8, $5
5840; O1-NEXT:    and $9, $7, $6
5841; O1-NEXT:    or $9, $9, $8
5842; O1-NEXT:    sc $9, 0($2)
5843; O1-NEXT:    beqz $9, $BB14_1
5844; O1-NEXT:    nop
5845; O1-NEXT:  # %bb.2: # %entry
5846; O1-NEXT:    and $1, $7, $5
5847; O1-NEXT:    srlv $1, $1, $3
5848; O1-NEXT:    sll $1, $1, 16
5849; O1-NEXT:    sra $1, $1, 16
5850; O1-NEXT:  # %bb.3: # %entry
5851; O1-NEXT:    sll $1, $1, 16
5852; O1-NEXT:    jr $ra
5853; O1-NEXT:    sra $2, $1, 16
5854;
5855; O2-LABEL: AtomicLoadAdd16:
5856; O2:       # %bb.0: # %entry
5857; O2-NEXT:    lui $2, %hi(_gp_disp)
5858; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
5859; O2-NEXT:    addu $1, $2, $25
5860; O2-NEXT:    lw $1, %got(z)($1)
5861; O2-NEXT:    addiu $2, $zero, -4
5862; O2-NEXT:    and $2, $1, $2
5863; O2-NEXT:    andi $1, $1, 3
5864; O2-NEXT:    sll $3, $1, 3
5865; O2-NEXT:    ori $1, $zero, 65535
5866; O2-NEXT:    sllv $5, $1, $3
5867; O2-NEXT:    nor $6, $zero, $5
5868; O2-NEXT:    sllv $4, $4, $3
5869; O2-NEXT:  $BB14_1: # %entry
5870; O2-NEXT:    # =>This Inner Loop Header: Depth=1
5871; O2-NEXT:    ll $7, 0($2)
5872; O2-NEXT:    addu $8, $7, $4
5873; O2-NEXT:    and $8, $8, $5
5874; O2-NEXT:    and $9, $7, $6
5875; O2-NEXT:    or $9, $9, $8
5876; O2-NEXT:    sc $9, 0($2)
5877; O2-NEXT:    beqz $9, $BB14_1
5878; O2-NEXT:    nop
5879; O2-NEXT:  # %bb.2: # %entry
5880; O2-NEXT:    and $1, $7, $5
5881; O2-NEXT:    srlv $1, $1, $3
5882; O2-NEXT:    sll $1, $1, 16
5883; O2-NEXT:    sra $1, $1, 16
5884; O2-NEXT:  # %bb.3: # %entry
5885; O2-NEXT:    sll $1, $1, 16
5886; O2-NEXT:    jr $ra
5887; O2-NEXT:    sra $2, $1, 16
5888;
5889; O3-LABEL: AtomicLoadAdd16:
5890; O3:       # %bb.0: # %entry
5891; O3-NEXT:    lui $2, %hi(_gp_disp)
5892; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
5893; O3-NEXT:    addu $1, $2, $25
5894; O3-NEXT:    addiu $2, $zero, -4
5895; O3-NEXT:    lw $1, %got(z)($1)
5896; O3-NEXT:    and $2, $1, $2
5897; O3-NEXT:    andi $1, $1, 3
5898; O3-NEXT:    sll $3, $1, 3
5899; O3-NEXT:    ori $1, $zero, 65535
5900; O3-NEXT:    sllv $5, $1, $3
5901; O3-NEXT:    sllv $4, $4, $3
5902; O3-NEXT:    nor $6, $zero, $5
5903; O3-NEXT:  $BB14_1: # %entry
5904; O3-NEXT:    # =>This Inner Loop Header: Depth=1
5905; O3-NEXT:    ll $7, 0($2)
5906; O3-NEXT:    addu $8, $7, $4
5907; O3-NEXT:    and $8, $8, $5
5908; O3-NEXT:    and $9, $7, $6
5909; O3-NEXT:    or $9, $9, $8
5910; O3-NEXT:    sc $9, 0($2)
5911; O3-NEXT:    beqz $9, $BB14_1
5912; O3-NEXT:    nop
5913; O3-NEXT:  # %bb.2: # %entry
5914; O3-NEXT:    and $1, $7, $5
5915; O3-NEXT:    srlv $1, $1, $3
5916; O3-NEXT:    sll $1, $1, 16
5917; O3-NEXT:    sra $1, $1, 16
5918; O3-NEXT:  # %bb.3: # %entry
5919; O3-NEXT:    sll $1, $1, 16
5920; O3-NEXT:    jr $ra
5921; O3-NEXT:    sra $2, $1, 16
5922;
5923; MIPS32EB-LABEL: AtomicLoadAdd16:
5924; MIPS32EB:       # %bb.0: # %entry
5925; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
5926; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
5927; MIPS32EB-NEXT:    addu $1, $2, $25
5928; MIPS32EB-NEXT:    lw $1, %got(z)($1)
5929; MIPS32EB-NEXT:    addiu $2, $zero, -4
5930; MIPS32EB-NEXT:    and $2, $1, $2
5931; MIPS32EB-NEXT:    andi $1, $1, 3
5932; MIPS32EB-NEXT:    xori $1, $1, 2
5933; MIPS32EB-NEXT:    sll $3, $1, 3
5934; MIPS32EB-NEXT:    ori $1, $zero, 65535
5935; MIPS32EB-NEXT:    sllv $5, $1, $3
5936; MIPS32EB-NEXT:    nor $6, $zero, $5
5937; MIPS32EB-NEXT:    sllv $4, $4, $3
5938; MIPS32EB-NEXT:  $BB14_1: # %entry
5939; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
5940; MIPS32EB-NEXT:    ll $7, 0($2)
5941; MIPS32EB-NEXT:    addu $8, $7, $4
5942; MIPS32EB-NEXT:    and $8, $8, $5
5943; MIPS32EB-NEXT:    and $9, $7, $6
5944; MIPS32EB-NEXT:    or $9, $9, $8
5945; MIPS32EB-NEXT:    sc $9, 0($2)
5946; MIPS32EB-NEXT:    beqz $9, $BB14_1
5947; MIPS32EB-NEXT:    nop
5948; MIPS32EB-NEXT:  # %bb.2: # %entry
5949; MIPS32EB-NEXT:    and $1, $7, $5
5950; MIPS32EB-NEXT:    srlv $1, $1, $3
5951; MIPS32EB-NEXT:    sll $1, $1, 16
5952; MIPS32EB-NEXT:    sra $1, $1, 16
5953; MIPS32EB-NEXT:  # %bb.3: # %entry
5954; MIPS32EB-NEXT:    sll $1, $1, 16
5955; MIPS32EB-NEXT:    jr $ra
5956; MIPS32EB-NEXT:    sra $2, $1, 16
5957entry:
5958  %0 = atomicrmw add i16* @z, i16 %incr monotonic
5959  ret i16 %0
5960
5961}
5962
5963; Test that the i16 return value from cmpxchg is recognised as signed,
5964; so that setCC doesn't end up comparing an unsigned value to a signed
5965; value.
5966; The rest of the functions here are testing the atomic expansion, so
5967; we just match the end of the function.
5968define {i16, i1} @foo(i16* %addr, i16 %l, i16 %r, i16 %new) {
5969; MIPS32-LABEL: foo:
5970; MIPS32:       # %bb.0:
5971; MIPS32-NEXT:    addu $1, $5, $6
5972; MIPS32-NEXT:    sync
5973; MIPS32-NEXT:    addiu $2, $zero, -4
5974; MIPS32-NEXT:    and $3, $4, $2
5975; MIPS32-NEXT:    andi $2, $4, 3
5976; MIPS32-NEXT:    sll $4, $2, 3
5977; MIPS32-NEXT:    ori $2, $zero, 65535
5978; MIPS32-NEXT:    sllv $5, $2, $4
5979; MIPS32-NEXT:    nor $6, $zero, $5
5980; MIPS32-NEXT:    andi $2, $1, 65535
5981; MIPS32-NEXT:    sllv $8, $2, $4
5982; MIPS32-NEXT:    andi $2, $7, 65535
5983; MIPS32-NEXT:    sllv $7, $2, $4
5984; MIPS32-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
5985; MIPS32-NEXT:    ll $9, 0($3)
5986; MIPS32-NEXT:    and $10, $9, $5
5987; MIPS32-NEXT:    bne $10, $8, $BB15_3
5988; MIPS32-NEXT:    nop
5989; MIPS32-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
5990; MIPS32-NEXT:    and $9, $9, $6
5991; MIPS32-NEXT:    or $9, $9, $7
5992; MIPS32-NEXT:    sc $9, 0($3)
5993; MIPS32-NEXT:    beqz $9, $BB15_1
5994; MIPS32-NEXT:    nop
5995; MIPS32-NEXT:  $BB15_3:
5996; MIPS32-NEXT:    srlv $2, $10, $4
5997; MIPS32-NEXT:    sll $2, $2, 16
5998; MIPS32-NEXT:    sra $2, $2, 16
5999; MIPS32-NEXT:  # %bb.4:
6000; MIPS32-NEXT:    sll $1, $1, 16
6001; MIPS32-NEXT:    sra $1, $1, 16
6002; MIPS32-NEXT:    xor $1, $2, $1
6003; MIPS32-NEXT:    sltiu $3, $1, 1
6004; MIPS32-NEXT:    sync
6005; MIPS32-NEXT:    jr $ra
6006; MIPS32-NEXT:    nop
6007;
6008; MIPS32O0-LABEL: foo:
6009; MIPS32O0:       # %bb.0:
6010; MIPS32O0-NEXT:    addiu $sp, $sp, -8
6011; MIPS32O0-NEXT:    .cfi_def_cfa_offset 8
6012; MIPS32O0-NEXT:    move $1, $7
6013; MIPS32O0-NEXT:    move $3, $4
6014; MIPS32O0-NEXT:    addu $2, $5, $6
6015; MIPS32O0-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
6016; MIPS32O0-NEXT:    sync
6017; MIPS32O0-NEXT:    addiu $4, $zero, -4
6018; MIPS32O0-NEXT:    and $4, $3, $4
6019; MIPS32O0-NEXT:    andi $3, $3, 3
6020; MIPS32O0-NEXT:    sll $9, $3, 3
6021; MIPS32O0-NEXT:    ori $3, $zero, 65535
6022; MIPS32O0-NEXT:    sllv $5, $3, $9
6023; MIPS32O0-NEXT:    nor $7, $zero, $5
6024; MIPS32O0-NEXT:    andi $2, $2, 65535
6025; MIPS32O0-NEXT:    sllv $6, $2, $9
6026; MIPS32O0-NEXT:    andi $1, $1, 65535
6027; MIPS32O0-NEXT:    sllv $8, $1, $9
6028; MIPS32O0-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6029; MIPS32O0-NEXT:    ll $2, 0($4)
6030; MIPS32O0-NEXT:    and $3, $2, $5
6031; MIPS32O0-NEXT:    bne $3, $6, $BB15_3
6032; MIPS32O0-NEXT:    nop
6033; MIPS32O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6034; MIPS32O0-NEXT:    and $2, $2, $7
6035; MIPS32O0-NEXT:    or $2, $2, $8
6036; MIPS32O0-NEXT:    sc $2, 0($4)
6037; MIPS32O0-NEXT:    beqz $2, $BB15_1
6038; MIPS32O0-NEXT:    nop
6039; MIPS32O0-NEXT:  $BB15_3:
6040; MIPS32O0-NEXT:    srlv $1, $3, $9
6041; MIPS32O0-NEXT:    sll $1, $1, 16
6042; MIPS32O0-NEXT:    sra $1, $1, 16
6043; MIPS32O0-NEXT:  # %bb.4:
6044; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
6045; MIPS32O0-NEXT:  # %bb.5:
6046; MIPS32O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
6047; MIPS32O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
6048; MIPS32O0-NEXT:    sll $1, $1, 16
6049; MIPS32O0-NEXT:    sra $1, $1, 16
6050; MIPS32O0-NEXT:    xor $1, $2, $1
6051; MIPS32O0-NEXT:    sltiu $3, $1, 1
6052; MIPS32O0-NEXT:    sync
6053; MIPS32O0-NEXT:    addiu $sp, $sp, 8
6054; MIPS32O0-NEXT:    jr $ra
6055; MIPS32O0-NEXT:    nop
6056;
6057; MIPS32R2-LABEL: foo:
6058; MIPS32R2:       # %bb.0:
6059; MIPS32R2-NEXT:    addu $1, $5, $6
6060; MIPS32R2-NEXT:    sync
6061; MIPS32R2-NEXT:    addiu $2, $zero, -4
6062; MIPS32R2-NEXT:    and $3, $4, $2
6063; MIPS32R2-NEXT:    andi $2, $4, 3
6064; MIPS32R2-NEXT:    sll $4, $2, 3
6065; MIPS32R2-NEXT:    ori $2, $zero, 65535
6066; MIPS32R2-NEXT:    sllv $5, $2, $4
6067; MIPS32R2-NEXT:    nor $6, $zero, $5
6068; MIPS32R2-NEXT:    andi $2, $1, 65535
6069; MIPS32R2-NEXT:    sllv $8, $2, $4
6070; MIPS32R2-NEXT:    andi $2, $7, 65535
6071; MIPS32R2-NEXT:    sllv $7, $2, $4
6072; MIPS32R2-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6073; MIPS32R2-NEXT:    ll $9, 0($3)
6074; MIPS32R2-NEXT:    and $10, $9, $5
6075; MIPS32R2-NEXT:    bne $10, $8, $BB15_3
6076; MIPS32R2-NEXT:    nop
6077; MIPS32R2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6078; MIPS32R2-NEXT:    and $9, $9, $6
6079; MIPS32R2-NEXT:    or $9, $9, $7
6080; MIPS32R2-NEXT:    sc $9, 0($3)
6081; MIPS32R2-NEXT:    beqz $9, $BB15_1
6082; MIPS32R2-NEXT:    nop
6083; MIPS32R2-NEXT:  $BB15_3:
6084; MIPS32R2-NEXT:    srlv $2, $10, $4
6085; MIPS32R2-NEXT:    seh $2, $2
6086; MIPS32R2-NEXT:  # %bb.4:
6087; MIPS32R2-NEXT:    seh $1, $1
6088; MIPS32R2-NEXT:    xor $1, $2, $1
6089; MIPS32R2-NEXT:    sltiu $3, $1, 1
6090; MIPS32R2-NEXT:    sync
6091; MIPS32R2-NEXT:    jr $ra
6092; MIPS32R2-NEXT:    nop
6093;
6094; MIPS32R6-LABEL: foo:
6095; MIPS32R6:       # %bb.0:
6096; MIPS32R6-NEXT:    addu $1, $5, $6
6097; MIPS32R6-NEXT:    sync
6098; MIPS32R6-NEXT:    addiu $2, $zero, -4
6099; MIPS32R6-NEXT:    and $3, $4, $2
6100; MIPS32R6-NEXT:    andi $2, $4, 3
6101; MIPS32R6-NEXT:    sll $4, $2, 3
6102; MIPS32R6-NEXT:    ori $2, $zero, 65535
6103; MIPS32R6-NEXT:    sllv $5, $2, $4
6104; MIPS32R6-NEXT:    nor $6, $zero, $5
6105; MIPS32R6-NEXT:    andi $2, $1, 65535
6106; MIPS32R6-NEXT:    sllv $8, $2, $4
6107; MIPS32R6-NEXT:    andi $2, $7, 65535
6108; MIPS32R6-NEXT:    sllv $7, $2, $4
6109; MIPS32R6-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6110; MIPS32R6-NEXT:    ll $9, 0($3)
6111; MIPS32R6-NEXT:    and $10, $9, $5
6112; MIPS32R6-NEXT:    bnec $10, $8, $BB15_3
6113; MIPS32R6-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6114; MIPS32R6-NEXT:    and $9, $9, $6
6115; MIPS32R6-NEXT:    or $9, $9, $7
6116; MIPS32R6-NEXT:    sc $9, 0($3)
6117; MIPS32R6-NEXT:    beqzc $9, $BB15_1
6118; MIPS32R6-NEXT:  $BB15_3:
6119; MIPS32R6-NEXT:    srlv $2, $10, $4
6120; MIPS32R6-NEXT:    seh $2, $2
6121; MIPS32R6-NEXT:  # %bb.4:
6122; MIPS32R6-NEXT:    seh $1, $1
6123; MIPS32R6-NEXT:    xor $1, $2, $1
6124; MIPS32R6-NEXT:    sltiu $3, $1, 1
6125; MIPS32R6-NEXT:    sync
6126; MIPS32R6-NEXT:    jrc $ra
6127;
6128; MIPS32R6O0-LABEL: foo:
6129; MIPS32R6O0:       # %bb.0:
6130; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
6131; MIPS32R6O0-NEXT:    .cfi_def_cfa_offset 8
6132; MIPS32R6O0-NEXT:    move $1, $7
6133; MIPS32R6O0-NEXT:    move $3, $4
6134; MIPS32R6O0-NEXT:    # kill: def $a3 killed $at
6135; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a2
6136; MIPS32R6O0-NEXT:    # kill: def $v0 killed $a1
6137; MIPS32R6O0-NEXT:    addu $2, $5, $6
6138; MIPS32R6O0-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
6139; MIPS32R6O0-NEXT:    sync
6140; MIPS32R6O0-NEXT:    addiu $4, $zero, -4
6141; MIPS32R6O0-NEXT:    and $4, $3, $4
6142; MIPS32R6O0-NEXT:    andi $3, $3, 3
6143; MIPS32R6O0-NEXT:    sll $9, $3, 3
6144; MIPS32R6O0-NEXT:    ori $3, $zero, 65535
6145; MIPS32R6O0-NEXT:    sllv $5, $3, $9
6146; MIPS32R6O0-NEXT:    nor $7, $zero, $5
6147; MIPS32R6O0-NEXT:    andi $2, $2, 65535
6148; MIPS32R6O0-NEXT:    sllv $6, $2, $9
6149; MIPS32R6O0-NEXT:    andi $1, $1, 65535
6150; MIPS32R6O0-NEXT:    sllv $8, $1, $9
6151; MIPS32R6O0-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6152; MIPS32R6O0-NEXT:    ll $2, 0($4)
6153; MIPS32R6O0-NEXT:    and $3, $2, $5
6154; MIPS32R6O0-NEXT:    bnec $3, $6, $BB15_3
6155; MIPS32R6O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6156; MIPS32R6O0-NEXT:    and $2, $2, $7
6157; MIPS32R6O0-NEXT:    or $2, $2, $8
6158; MIPS32R6O0-NEXT:    sc $2, 0($4)
6159; MIPS32R6O0-NEXT:    beqzc $2, $BB15_1
6160; MIPS32R6O0-NEXT:  $BB15_3:
6161; MIPS32R6O0-NEXT:    srlv $1, $3, $9
6162; MIPS32R6O0-NEXT:    seh $1, $1
6163; MIPS32R6O0-NEXT:  # %bb.4:
6164; MIPS32R6O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
6165; MIPS32R6O0-NEXT:  # %bb.5:
6166; MIPS32R6O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
6167; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
6168; MIPS32R6O0-NEXT:    seh $1, $1
6169; MIPS32R6O0-NEXT:    xor $1, $2, $1
6170; MIPS32R6O0-NEXT:    sltiu $3, $1, 1
6171; MIPS32R6O0-NEXT:    sync
6172; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
6173; MIPS32R6O0-NEXT:    jrc $ra
6174;
6175; MIPS4-LABEL: foo:
6176; MIPS4:       # %bb.0:
6177; MIPS4-NEXT:    sll $1, $6, 0
6178; MIPS4-NEXT:    sll $2, $5, 0
6179; MIPS4-NEXT:    addu $1, $2, $1
6180; MIPS4-NEXT:    sync
6181; MIPS4-NEXT:    sll $2, $7, 0
6182; MIPS4-NEXT:    daddiu $3, $zero, -4
6183; MIPS4-NEXT:    and $3, $4, $3
6184; MIPS4-NEXT:    andi $4, $4, 3
6185; MIPS4-NEXT:    sll $4, $4, 3
6186; MIPS4-NEXT:    ori $5, $zero, 65535
6187; MIPS4-NEXT:    sllv $5, $5, $4
6188; MIPS4-NEXT:    nor $6, $zero, $5
6189; MIPS4-NEXT:    andi $7, $1, 65535
6190; MIPS4-NEXT:    sllv $7, $7, $4
6191; MIPS4-NEXT:    andi $2, $2, 65535
6192; MIPS4-NEXT:    sllv $8, $2, $4
6193; MIPS4-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6194; MIPS4-NEXT:    ll $9, 0($3)
6195; MIPS4-NEXT:    and $10, $9, $5
6196; MIPS4-NEXT:    bne $10, $7, .LBB15_3
6197; MIPS4-NEXT:    nop
6198; MIPS4-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6199; MIPS4-NEXT:    and $9, $9, $6
6200; MIPS4-NEXT:    or $9, $9, $8
6201; MIPS4-NEXT:    sc $9, 0($3)
6202; MIPS4-NEXT:    beqz $9, .LBB15_1
6203; MIPS4-NEXT:    nop
6204; MIPS4-NEXT:  .LBB15_3:
6205; MIPS4-NEXT:    srlv $2, $10, $4
6206; MIPS4-NEXT:    sll $2, $2, 16
6207; MIPS4-NEXT:    sra $2, $2, 16
6208; MIPS4-NEXT:  # %bb.4:
6209; MIPS4-NEXT:    sll $1, $1, 16
6210; MIPS4-NEXT:    sra $1, $1, 16
6211; MIPS4-NEXT:    xor $1, $2, $1
6212; MIPS4-NEXT:    sltiu $3, $1, 1
6213; MIPS4-NEXT:    sync
6214; MIPS4-NEXT:    jr $ra
6215; MIPS4-NEXT:    nop
6216;
6217; MIPS64-LABEL: foo:
6218; MIPS64:       # %bb.0:
6219; MIPS64-NEXT:    sll $1, $6, 0
6220; MIPS64-NEXT:    sll $2, $5, 0
6221; MIPS64-NEXT:    addu $1, $2, $1
6222; MIPS64-NEXT:    sync
6223; MIPS64-NEXT:    sll $2, $7, 0
6224; MIPS64-NEXT:    daddiu $3, $zero, -4
6225; MIPS64-NEXT:    and $3, $4, $3
6226; MIPS64-NEXT:    andi $4, $4, 3
6227; MIPS64-NEXT:    sll $4, $4, 3
6228; MIPS64-NEXT:    ori $5, $zero, 65535
6229; MIPS64-NEXT:    sllv $5, $5, $4
6230; MIPS64-NEXT:    nor $6, $zero, $5
6231; MIPS64-NEXT:    andi $7, $1, 65535
6232; MIPS64-NEXT:    sllv $7, $7, $4
6233; MIPS64-NEXT:    andi $2, $2, 65535
6234; MIPS64-NEXT:    sllv $8, $2, $4
6235; MIPS64-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6236; MIPS64-NEXT:    ll $9, 0($3)
6237; MIPS64-NEXT:    and $10, $9, $5
6238; MIPS64-NEXT:    bne $10, $7, .LBB15_3
6239; MIPS64-NEXT:    nop
6240; MIPS64-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6241; MIPS64-NEXT:    and $9, $9, $6
6242; MIPS64-NEXT:    or $9, $9, $8
6243; MIPS64-NEXT:    sc $9, 0($3)
6244; MIPS64-NEXT:    beqz $9, .LBB15_1
6245; MIPS64-NEXT:    nop
6246; MIPS64-NEXT:  .LBB15_3:
6247; MIPS64-NEXT:    srlv $2, $10, $4
6248; MIPS64-NEXT:    sll $2, $2, 16
6249; MIPS64-NEXT:    sra $2, $2, 16
6250; MIPS64-NEXT:  # %bb.4:
6251; MIPS64-NEXT:    sll $1, $1, 16
6252; MIPS64-NEXT:    sra $1, $1, 16
6253; MIPS64-NEXT:    xor $1, $2, $1
6254; MIPS64-NEXT:    sltiu $3, $1, 1
6255; MIPS64-NEXT:    sync
6256; MIPS64-NEXT:    jr $ra
6257; MIPS64-NEXT:    nop
6258;
6259; MIPS64R2-LABEL: foo:
6260; MIPS64R2:       # %bb.0:
6261; MIPS64R2-NEXT:    sll $1, $6, 0
6262; MIPS64R2-NEXT:    sll $2, $5, 0
6263; MIPS64R2-NEXT:    addu $1, $2, $1
6264; MIPS64R2-NEXT:    sync
6265; MIPS64R2-NEXT:    sll $2, $7, 0
6266; MIPS64R2-NEXT:    daddiu $3, $zero, -4
6267; MIPS64R2-NEXT:    and $3, $4, $3
6268; MIPS64R2-NEXT:    andi $4, $4, 3
6269; MIPS64R2-NEXT:    sll $4, $4, 3
6270; MIPS64R2-NEXT:    ori $5, $zero, 65535
6271; MIPS64R2-NEXT:    sllv $5, $5, $4
6272; MIPS64R2-NEXT:    nor $6, $zero, $5
6273; MIPS64R2-NEXT:    andi $7, $1, 65535
6274; MIPS64R2-NEXT:    sllv $7, $7, $4
6275; MIPS64R2-NEXT:    andi $2, $2, 65535
6276; MIPS64R2-NEXT:    sllv $8, $2, $4
6277; MIPS64R2-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6278; MIPS64R2-NEXT:    ll $9, 0($3)
6279; MIPS64R2-NEXT:    and $10, $9, $5
6280; MIPS64R2-NEXT:    bne $10, $7, .LBB15_3
6281; MIPS64R2-NEXT:    nop
6282; MIPS64R2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6283; MIPS64R2-NEXT:    and $9, $9, $6
6284; MIPS64R2-NEXT:    or $9, $9, $8
6285; MIPS64R2-NEXT:    sc $9, 0($3)
6286; MIPS64R2-NEXT:    beqz $9, .LBB15_1
6287; MIPS64R2-NEXT:    nop
6288; MIPS64R2-NEXT:  .LBB15_3:
6289; MIPS64R2-NEXT:    srlv $2, $10, $4
6290; MIPS64R2-NEXT:    seh $2, $2
6291; MIPS64R2-NEXT:  # %bb.4:
6292; MIPS64R2-NEXT:    seh $1, $1
6293; MIPS64R2-NEXT:    xor $1, $2, $1
6294; MIPS64R2-NEXT:    sltiu $3, $1, 1
6295; MIPS64R2-NEXT:    sync
6296; MIPS64R2-NEXT:    jr $ra
6297; MIPS64R2-NEXT:    nop
6298;
6299; MIPS64R6-LABEL: foo:
6300; MIPS64R6:       # %bb.0:
6301; MIPS64R6-NEXT:    sll $1, $6, 0
6302; MIPS64R6-NEXT:    sll $2, $5, 0
6303; MIPS64R6-NEXT:    addu $1, $2, $1
6304; MIPS64R6-NEXT:    sync
6305; MIPS64R6-NEXT:    sll $2, $7, 0
6306; MIPS64R6-NEXT:    daddiu $3, $zero, -4
6307; MIPS64R6-NEXT:    and $3, $4, $3
6308; MIPS64R6-NEXT:    andi $4, $4, 3
6309; MIPS64R6-NEXT:    sll $4, $4, 3
6310; MIPS64R6-NEXT:    ori $5, $zero, 65535
6311; MIPS64R6-NEXT:    sllv $5, $5, $4
6312; MIPS64R6-NEXT:    nor $6, $zero, $5
6313; MIPS64R6-NEXT:    andi $7, $1, 65535
6314; MIPS64R6-NEXT:    sllv $7, $7, $4
6315; MIPS64R6-NEXT:    andi $2, $2, 65535
6316; MIPS64R6-NEXT:    sllv $8, $2, $4
6317; MIPS64R6-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6318; MIPS64R6-NEXT:    ll $9, 0($3)
6319; MIPS64R6-NEXT:    and $10, $9, $5
6320; MIPS64R6-NEXT:    bnec $10, $7, .LBB15_3
6321; MIPS64R6-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6322; MIPS64R6-NEXT:    and $9, $9, $6
6323; MIPS64R6-NEXT:    or $9, $9, $8
6324; MIPS64R6-NEXT:    sc $9, 0($3)
6325; MIPS64R6-NEXT:    beqzc $9, .LBB15_1
6326; MIPS64R6-NEXT:  .LBB15_3:
6327; MIPS64R6-NEXT:    srlv $2, $10, $4
6328; MIPS64R6-NEXT:    seh $2, $2
6329; MIPS64R6-NEXT:  # %bb.4:
6330; MIPS64R6-NEXT:    seh $1, $1
6331; MIPS64R6-NEXT:    xor $1, $2, $1
6332; MIPS64R6-NEXT:    sltiu $3, $1, 1
6333; MIPS64R6-NEXT:    sync
6334; MIPS64R6-NEXT:    jrc $ra
6335;
6336; MIPS64R6O0-LABEL: foo:
6337; MIPS64R6O0:       # %bb.0:
6338; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
6339; MIPS64R6O0-NEXT:    .cfi_def_cfa_offset 16
6340; MIPS64R6O0-NEXT:    move $3, $4
6341; MIPS64R6O0-NEXT:    move $1, $7
6342; MIPS64R6O0-NEXT:    sll $1, $1, 0
6343; MIPS64R6O0-NEXT:    move $2, $6
6344; MIPS64R6O0-NEXT:    sll $4, $2, 0
6345; MIPS64R6O0-NEXT:    move $2, $5
6346; MIPS64R6O0-NEXT:    sll $2, $2, 0
6347; MIPS64R6O0-NEXT:    addu $2, $2, $4
6348; MIPS64R6O0-NEXT:    sw $2, 8($sp) # 4-byte Folded Spill
6349; MIPS64R6O0-NEXT:    sync
6350; MIPS64R6O0-NEXT:    daddiu $4, $zero, -4
6351; MIPS64R6O0-NEXT:    and $4, $3, $4
6352; MIPS64R6O0-NEXT:    andi $3, $3, 3
6353; MIPS64R6O0-NEXT:    xori $3, $3, 2
6354; MIPS64R6O0-NEXT:    sll $9, $3, 3
6355; MIPS64R6O0-NEXT:    ori $3, $zero, 65535
6356; MIPS64R6O0-NEXT:    sllv $5, $3, $9
6357; MIPS64R6O0-NEXT:    nor $7, $zero, $5
6358; MIPS64R6O0-NEXT:    andi $2, $2, 65535
6359; MIPS64R6O0-NEXT:    sllv $6, $2, $9
6360; MIPS64R6O0-NEXT:    andi $1, $1, 65535
6361; MIPS64R6O0-NEXT:    sllv $8, $1, $9
6362; MIPS64R6O0-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6363; MIPS64R6O0-NEXT:    ll $2, 0($4)
6364; MIPS64R6O0-NEXT:    and $3, $2, $5
6365; MIPS64R6O0-NEXT:    bnec $3, $6, .LBB15_3
6366; MIPS64R6O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6367; MIPS64R6O0-NEXT:    and $2, $2, $7
6368; MIPS64R6O0-NEXT:    or $2, $2, $8
6369; MIPS64R6O0-NEXT:    sc $2, 0($4)
6370; MIPS64R6O0-NEXT:    beqzc $2, .LBB15_1
6371; MIPS64R6O0-NEXT:  .LBB15_3:
6372; MIPS64R6O0-NEXT:    srlv $1, $3, $9
6373; MIPS64R6O0-NEXT:    seh $1, $1
6374; MIPS64R6O0-NEXT:  # %bb.4:
6375; MIPS64R6O0-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
6376; MIPS64R6O0-NEXT:  # %bb.5:
6377; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
6378; MIPS64R6O0-NEXT:    lw $1, 8($sp) # 4-byte Folded Reload
6379; MIPS64R6O0-NEXT:    seh $1, $1
6380; MIPS64R6O0-NEXT:    xor $1, $2, $1
6381; MIPS64R6O0-NEXT:    sltiu $3, $1, 1
6382; MIPS64R6O0-NEXT:    sync
6383; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
6384; MIPS64R6O0-NEXT:    jrc $ra
6385;
6386; MM32-LABEL: foo:
6387; MM32:       # %bb.0:
6388; MM32-NEXT:    addu16 $3, $5, $6
6389; MM32-NEXT:    sync
6390; MM32-NEXT:    addiu $1, $zero, -4
6391; MM32-NEXT:    and $1, $4, $1
6392; MM32-NEXT:    andi $2, $4, 3
6393; MM32-NEXT:    sll $4, $2, 3
6394; MM32-NEXT:    ori $2, $zero, 65535
6395; MM32-NEXT:    sllv $5, $2, $4
6396; MM32-NEXT:    nor $6, $zero, $5
6397; MM32-NEXT:    andi $2, $3, 65535
6398; MM32-NEXT:    sllv $8, $2, $4
6399; MM32-NEXT:    andi $2, $7, 65535
6400; MM32-NEXT:    sllv $7, $2, $4
6401; MM32-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6402; MM32-NEXT:    ll $9, 0($1)
6403; MM32-NEXT:    and $10, $9, $5
6404; MM32-NEXT:    bne $10, $8, $BB15_3
6405; MM32-NEXT:    nop
6406; MM32-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6407; MM32-NEXT:    and $9, $9, $6
6408; MM32-NEXT:    or $9, $9, $7
6409; MM32-NEXT:    sc $9, 0($1)
6410; MM32-NEXT:    beqzc $9, $BB15_1
6411; MM32-NEXT:  $BB15_3:
6412; MM32-NEXT:    srlv $2, $10, $4
6413; MM32-NEXT:    seh $2, $2
6414; MM32-NEXT:  # %bb.4:
6415; MM32-NEXT:    seh $1, $3
6416; MM32-NEXT:    xor $1, $2, $1
6417; MM32-NEXT:    sltiu $3, $1, 1
6418; MM32-NEXT:    sync
6419; MM32-NEXT:    jrc $ra
6420;
6421; O1-LABEL: foo:
6422; O1:       # %bb.0:
6423; O1-NEXT:    addu $1, $5, $6
6424; O1-NEXT:    sync
6425; O1-NEXT:    addiu $2, $zero, -4
6426; O1-NEXT:    and $3, $4, $2
6427; O1-NEXT:    andi $2, $4, 3
6428; O1-NEXT:    sll $4, $2, 3
6429; O1-NEXT:    ori $2, $zero, 65535
6430; O1-NEXT:    sllv $5, $2, $4
6431; O1-NEXT:    nor $6, $zero, $5
6432; O1-NEXT:    andi $2, $1, 65535
6433; O1-NEXT:    sllv $8, $2, $4
6434; O1-NEXT:    andi $2, $7, 65535
6435; O1-NEXT:    sllv $7, $2, $4
6436; O1-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6437; O1-NEXT:    ll $9, 0($3)
6438; O1-NEXT:    and $10, $9, $5
6439; O1-NEXT:    bne $10, $8, $BB15_3
6440; O1-NEXT:    nop
6441; O1-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6442; O1-NEXT:    and $9, $9, $6
6443; O1-NEXT:    or $9, $9, $7
6444; O1-NEXT:    sc $9, 0($3)
6445; O1-NEXT:    beqz $9, $BB15_1
6446; O1-NEXT:    nop
6447; O1-NEXT:  $BB15_3:
6448; O1-NEXT:    srlv $2, $10, $4
6449; O1-NEXT:    sll $2, $2, 16
6450; O1-NEXT:    sra $2, $2, 16
6451; O1-NEXT:  # %bb.4:
6452; O1-NEXT:    sll $1, $1, 16
6453; O1-NEXT:    sra $1, $1, 16
6454; O1-NEXT:    xor $1, $2, $1
6455; O1-NEXT:    sltiu $3, $1, 1
6456; O1-NEXT:    sync
6457; O1-NEXT:    jr $ra
6458; O1-NEXT:    nop
6459;
6460; O2-LABEL: foo:
6461; O2:       # %bb.0:
6462; O2-NEXT:    addu $1, $5, $6
6463; O2-NEXT:    sync
6464; O2-NEXT:    addiu $2, $zero, -4
6465; O2-NEXT:    and $3, $4, $2
6466; O2-NEXT:    andi $2, $4, 3
6467; O2-NEXT:    sll $4, $2, 3
6468; O2-NEXT:    ori $2, $zero, 65535
6469; O2-NEXT:    sllv $5, $2, $4
6470; O2-NEXT:    nor $6, $zero, $5
6471; O2-NEXT:    andi $2, $1, 65535
6472; O2-NEXT:    sllv $8, $2, $4
6473; O2-NEXT:    andi $2, $7, 65535
6474; O2-NEXT:    sllv $7, $2, $4
6475; O2-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6476; O2-NEXT:    ll $9, 0($3)
6477; O2-NEXT:    and $10, $9, $5
6478; O2-NEXT:    bne $10, $8, $BB15_3
6479; O2-NEXT:    nop
6480; O2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6481; O2-NEXT:    and $9, $9, $6
6482; O2-NEXT:    or $9, $9, $7
6483; O2-NEXT:    sc $9, 0($3)
6484; O2-NEXT:    beqz $9, $BB15_1
6485; O2-NEXT:    nop
6486; O2-NEXT:  $BB15_3:
6487; O2-NEXT:    srlv $2, $10, $4
6488; O2-NEXT:    sll $2, $2, 16
6489; O2-NEXT:    sra $2, $2, 16
6490; O2-NEXT:  # %bb.4:
6491; O2-NEXT:    sll $1, $1, 16
6492; O2-NEXT:    sra $1, $1, 16
6493; O2-NEXT:    xor $1, $2, $1
6494; O2-NEXT:    sltiu $3, $1, 1
6495; O2-NEXT:    sync
6496; O2-NEXT:    jr $ra
6497; O2-NEXT:    nop
6498;
6499; O3-LABEL: foo:
6500; O3:       # %bb.0:
6501; O3-NEXT:    addiu $2, $zero, -4
6502; O3-NEXT:    addu $1, $5, $6
6503; O3-NEXT:    sync
6504; O3-NEXT:    and $3, $4, $2
6505; O3-NEXT:    andi $2, $4, 3
6506; O3-NEXT:    sll $4, $2, 3
6507; O3-NEXT:    ori $2, $zero, 65535
6508; O3-NEXT:    sllv $5, $2, $4
6509; O3-NEXT:    andi $2, $1, 65535
6510; O3-NEXT:    sll $1, $1, 16
6511; O3-NEXT:    sllv $8, $2, $4
6512; O3-NEXT:    andi $2, $7, 65535
6513; O3-NEXT:    nor $6, $zero, $5
6514; O3-NEXT:    sra $1, $1, 16
6515; O3-NEXT:    sllv $7, $2, $4
6516; O3-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6517; O3-NEXT:    ll $9, 0($3)
6518; O3-NEXT:    and $10, $9, $5
6519; O3-NEXT:    bne $10, $8, $BB15_3
6520; O3-NEXT:    nop
6521; O3-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6522; O3-NEXT:    and $9, $9, $6
6523; O3-NEXT:    or $9, $9, $7
6524; O3-NEXT:    sc $9, 0($3)
6525; O3-NEXT:    beqz $9, $BB15_1
6526; O3-NEXT:    nop
6527; O3-NEXT:  $BB15_3:
6528; O3-NEXT:    srlv $2, $10, $4
6529; O3-NEXT:    sll $2, $2, 16
6530; O3-NEXT:    sra $2, $2, 16
6531; O3-NEXT:  # %bb.4:
6532; O3-NEXT:    sync
6533; O3-NEXT:    xor $1, $2, $1
6534; O3-NEXT:    jr $ra
6535; O3-NEXT:    sltiu $3, $1, 1
6536;
6537; MIPS32EB-LABEL: foo:
6538; MIPS32EB:       # %bb.0:
6539; MIPS32EB-NEXT:    addu $1, $5, $6
6540; MIPS32EB-NEXT:    sync
6541; MIPS32EB-NEXT:    addiu $2, $zero, -4
6542; MIPS32EB-NEXT:    and $3, $4, $2
6543; MIPS32EB-NEXT:    andi $2, $4, 3
6544; MIPS32EB-NEXT:    xori $2, $2, 2
6545; MIPS32EB-NEXT:    sll $4, $2, 3
6546; MIPS32EB-NEXT:    ori $2, $zero, 65535
6547; MIPS32EB-NEXT:    sllv $5, $2, $4
6548; MIPS32EB-NEXT:    nor $6, $zero, $5
6549; MIPS32EB-NEXT:    andi $2, $1, 65535
6550; MIPS32EB-NEXT:    sllv $8, $2, $4
6551; MIPS32EB-NEXT:    andi $2, $7, 65535
6552; MIPS32EB-NEXT:    sllv $7, $2, $4
6553; MIPS32EB-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6554; MIPS32EB-NEXT:    ll $9, 0($3)
6555; MIPS32EB-NEXT:    and $10, $9, $5
6556; MIPS32EB-NEXT:    bne $10, $8, $BB15_3
6557; MIPS32EB-NEXT:    nop
6558; MIPS32EB-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6559; MIPS32EB-NEXT:    and $9, $9, $6
6560; MIPS32EB-NEXT:    or $9, $9, $7
6561; MIPS32EB-NEXT:    sc $9, 0($3)
6562; MIPS32EB-NEXT:    beqz $9, $BB15_1
6563; MIPS32EB-NEXT:    nop
6564; MIPS32EB-NEXT:  $BB15_3:
6565; MIPS32EB-NEXT:    srlv $2, $10, $4
6566; MIPS32EB-NEXT:    sll $2, $2, 16
6567; MIPS32EB-NEXT:    sra $2, $2, 16
6568; MIPS32EB-NEXT:  # %bb.4:
6569; MIPS32EB-NEXT:    sll $1, $1, 16
6570; MIPS32EB-NEXT:    sra $1, $1, 16
6571; MIPS32EB-NEXT:    xor $1, $2, $1
6572; MIPS32EB-NEXT:    sltiu $3, $1, 1
6573; MIPS32EB-NEXT:    sync
6574; MIPS32EB-NEXT:    jr $ra
6575; MIPS32EB-NEXT:    nop
6576  %desired = add i16 %l, %r
6577  %res = cmpxchg i16* %addr, i16 %desired, i16 %new seq_cst seq_cst
6578  ret {i16, i1} %res
6579}
6580
6581@countsint = common global i32 0, align 4
6582
6583define i32 @CheckSync(i32 signext %v) nounwind noinline {
6584; MIPS32-LABEL: CheckSync:
6585; MIPS32:       # %bb.0: # %entry
6586; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
6587; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6588; MIPS32-NEXT:    addu $1, $2, $25
6589; MIPS32-NEXT:    sync
6590; MIPS32-NEXT:    lw $1, %got(countsint)($1)
6591; MIPS32-NEXT:  $BB16_1: # %entry
6592; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
6593; MIPS32-NEXT:    ll $2, 0($1)
6594; MIPS32-NEXT:    addu $3, $2, $4
6595; MIPS32-NEXT:    sc $3, 0($1)
6596; MIPS32-NEXT:    beqz $3, $BB16_1
6597; MIPS32-NEXT:    nop
6598; MIPS32-NEXT:  # %bb.2: # %entry
6599; MIPS32-NEXT:    sync
6600; MIPS32-NEXT:    jr $ra
6601; MIPS32-NEXT:    nop
6602;
6603; MIPS32O0-LABEL: CheckSync:
6604; MIPS32O0:       # %bb.0: # %entry
6605; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
6606; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6607; MIPS32O0-NEXT:    addu $1, $2, $25
6608; MIPS32O0-NEXT:    sync
6609; MIPS32O0-NEXT:    lw $3, %got(countsint)($1)
6610; MIPS32O0-NEXT:  $BB16_1: # %entry
6611; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
6612; MIPS32O0-NEXT:    ll $2, 0($3)
6613; MIPS32O0-NEXT:    addu $1, $2, $4
6614; MIPS32O0-NEXT:    sc $1, 0($3)
6615; MIPS32O0-NEXT:    beqz $1, $BB16_1
6616; MIPS32O0-NEXT:    nop
6617; MIPS32O0-NEXT:  # %bb.2: # %entry
6618; MIPS32O0-NEXT:    sync
6619; MIPS32O0-NEXT:    jr $ra
6620; MIPS32O0-NEXT:    nop
6621;
6622; MIPS32R2-LABEL: CheckSync:
6623; MIPS32R2:       # %bb.0: # %entry
6624; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
6625; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6626; MIPS32R2-NEXT:    addu $1, $2, $25
6627; MIPS32R2-NEXT:    sync
6628; MIPS32R2-NEXT:    lw $1, %got(countsint)($1)
6629; MIPS32R2-NEXT:  $BB16_1: # %entry
6630; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
6631; MIPS32R2-NEXT:    ll $2, 0($1)
6632; MIPS32R2-NEXT:    addu $3, $2, $4
6633; MIPS32R2-NEXT:    sc $3, 0($1)
6634; MIPS32R2-NEXT:    beqz $3, $BB16_1
6635; MIPS32R2-NEXT:    nop
6636; MIPS32R2-NEXT:  # %bb.2: # %entry
6637; MIPS32R2-NEXT:    sync
6638; MIPS32R2-NEXT:    jr $ra
6639; MIPS32R2-NEXT:    nop
6640;
6641; MIPS32R6-LABEL: CheckSync:
6642; MIPS32R6:       # %bb.0: # %entry
6643; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
6644; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
6645; MIPS32R6-NEXT:    addu $1, $2, $25
6646; MIPS32R6-NEXT:    sync
6647; MIPS32R6-NEXT:    lw $1, %got(countsint)($1)
6648; MIPS32R6-NEXT:  $BB16_1: # %entry
6649; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
6650; MIPS32R6-NEXT:    ll $2, 0($1)
6651; MIPS32R6-NEXT:    addu $3, $2, $4
6652; MIPS32R6-NEXT:    sc $3, 0($1)
6653; MIPS32R6-NEXT:    beqzc $3, $BB16_1
6654; MIPS32R6-NEXT:  # %bb.2: # %entry
6655; MIPS32R6-NEXT:    sync
6656; MIPS32R6-NEXT:    jrc $ra
6657;
6658; MIPS32R6O0-LABEL: CheckSync:
6659; MIPS32R6O0:       # %bb.0: # %entry
6660; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
6661; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6662; MIPS32R6O0-NEXT:    addu $1, $2, $25
6663; MIPS32R6O0-NEXT:    sync
6664; MIPS32R6O0-NEXT:    lw $3, %got(countsint)($1)
6665; MIPS32R6O0-NEXT:  $BB16_1: # %entry
6666; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
6667; MIPS32R6O0-NEXT:    ll $2, 0($3)
6668; MIPS32R6O0-NEXT:    addu $1, $2, $4
6669; MIPS32R6O0-NEXT:    sc $1, 0($3)
6670; MIPS32R6O0-NEXT:    beqzc $1, $BB16_1
6671; MIPS32R6O0-NEXT:  # %bb.2: # %entry
6672; MIPS32R6O0-NEXT:    sync
6673; MIPS32R6O0-NEXT:    jrc $ra
6674;
6675; MIPS4-LABEL: CheckSync:
6676; MIPS4:       # %bb.0: # %entry
6677; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6678; MIPS4-NEXT:    daddu $1, $1, $25
6679; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6680; MIPS4-NEXT:    sync
6681; MIPS4-NEXT:    ld $1, %got_disp(countsint)($1)
6682; MIPS4-NEXT:  .LBB16_1: # %entry
6683; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
6684; MIPS4-NEXT:    ll $2, 0($1)
6685; MIPS4-NEXT:    addu $3, $2, $4
6686; MIPS4-NEXT:    sc $3, 0($1)
6687; MIPS4-NEXT:    beqz $3, .LBB16_1
6688; MIPS4-NEXT:    nop
6689; MIPS4-NEXT:  # %bb.2: # %entry
6690; MIPS4-NEXT:    sync
6691; MIPS4-NEXT:    jr $ra
6692; MIPS4-NEXT:    nop
6693;
6694; MIPS64-LABEL: CheckSync:
6695; MIPS64:       # %bb.0: # %entry
6696; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6697; MIPS64-NEXT:    daddu $1, $1, $25
6698; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6699; MIPS64-NEXT:    sync
6700; MIPS64-NEXT:    ld $1, %got_disp(countsint)($1)
6701; MIPS64-NEXT:  .LBB16_1: # %entry
6702; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
6703; MIPS64-NEXT:    ll $2, 0($1)
6704; MIPS64-NEXT:    addu $3, $2, $4
6705; MIPS64-NEXT:    sc $3, 0($1)
6706; MIPS64-NEXT:    beqz $3, .LBB16_1
6707; MIPS64-NEXT:    nop
6708; MIPS64-NEXT:  # %bb.2: # %entry
6709; MIPS64-NEXT:    sync
6710; MIPS64-NEXT:    jr $ra
6711; MIPS64-NEXT:    nop
6712;
6713; MIPS64R2-LABEL: CheckSync:
6714; MIPS64R2:       # %bb.0: # %entry
6715; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6716; MIPS64R2-NEXT:    daddu $1, $1, $25
6717; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6718; MIPS64R2-NEXT:    sync
6719; MIPS64R2-NEXT:    ld $1, %got_disp(countsint)($1)
6720; MIPS64R2-NEXT:  .LBB16_1: # %entry
6721; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
6722; MIPS64R2-NEXT:    ll $2, 0($1)
6723; MIPS64R2-NEXT:    addu $3, $2, $4
6724; MIPS64R2-NEXT:    sc $3, 0($1)
6725; MIPS64R2-NEXT:    beqz $3, .LBB16_1
6726; MIPS64R2-NEXT:    nop
6727; MIPS64R2-NEXT:  # %bb.2: # %entry
6728; MIPS64R2-NEXT:    sync
6729; MIPS64R2-NEXT:    jr $ra
6730; MIPS64R2-NEXT:    nop
6731;
6732; MIPS64R6-LABEL: CheckSync:
6733; MIPS64R6:       # %bb.0: # %entry
6734; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6735; MIPS64R6-NEXT:    daddu $1, $1, $25
6736; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6737; MIPS64R6-NEXT:    sync
6738; MIPS64R6-NEXT:    ld $1, %got_disp(countsint)($1)
6739; MIPS64R6-NEXT:  .LBB16_1: # %entry
6740; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
6741; MIPS64R6-NEXT:    ll $2, 0($1)
6742; MIPS64R6-NEXT:    addu $3, $2, $4
6743; MIPS64R6-NEXT:    sc $3, 0($1)
6744; MIPS64R6-NEXT:    beqzc $3, .LBB16_1
6745; MIPS64R6-NEXT:  # %bb.2: # %entry
6746; MIPS64R6-NEXT:    sync
6747; MIPS64R6-NEXT:    jrc $ra
6748;
6749; MIPS64R6O0-LABEL: CheckSync:
6750; MIPS64R6O0:       # %bb.0: # %entry
6751; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6752; MIPS64R6O0-NEXT:    daddu $1, $1, $25
6753; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6754; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
6755; MIPS64R6O0-NEXT:    sync
6756; MIPS64R6O0-NEXT:    ld $3, %got_disp(countsint)($1)
6757; MIPS64R6O0-NEXT:  .LBB16_1: # %entry
6758; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
6759; MIPS64R6O0-NEXT:    ll $2, 0($3)
6760; MIPS64R6O0-NEXT:    addu $1, $2, $4
6761; MIPS64R6O0-NEXT:    sc $1, 0($3)
6762; MIPS64R6O0-NEXT:    beqzc $1, .LBB16_1
6763; MIPS64R6O0-NEXT:  # %bb.2: # %entry
6764; MIPS64R6O0-NEXT:    sync
6765; MIPS64R6O0-NEXT:    jrc $ra
6766;
6767; MM32-LABEL: CheckSync:
6768; MM32:       # %bb.0: # %entry
6769; MM32-NEXT:    lui $2, %hi(_gp_disp)
6770; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6771; MM32-NEXT:    addu $2, $2, $25
6772; MM32-NEXT:    sync
6773; MM32-NEXT:    lw $1, %got(countsint)($2)
6774; MM32-NEXT:  $BB16_1: # %entry
6775; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
6776; MM32-NEXT:    ll $2, 0($1)
6777; MM32-NEXT:    addu16 $3, $2, $4
6778; MM32-NEXT:    sc $3, 0($1)
6779; MM32-NEXT:    beqzc $3, $BB16_1
6780; MM32-NEXT:  # %bb.2: # %entry
6781; MM32-NEXT:    sync
6782; MM32-NEXT:    jrc $ra
6783;
6784; O1-LABEL: CheckSync:
6785; O1:       # %bb.0: # %entry
6786; O1-NEXT:    lui $2, %hi(_gp_disp)
6787; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
6788; O1-NEXT:    addu $1, $2, $25
6789; O1-NEXT:    sync
6790; O1-NEXT:    lw $1, %got(countsint)($1)
6791; O1-NEXT:  $BB16_1: # %entry
6792; O1-NEXT:    # =>This Inner Loop Header: Depth=1
6793; O1-NEXT:    ll $2, 0($1)
6794; O1-NEXT:    addu $3, $2, $4
6795; O1-NEXT:    sc $3, 0($1)
6796; O1-NEXT:    beqz $3, $BB16_1
6797; O1-NEXT:    nop
6798; O1-NEXT:  # %bb.2: # %entry
6799; O1-NEXT:    sync
6800; O1-NEXT:    jr $ra
6801; O1-NEXT:    nop
6802;
6803; O2-LABEL: CheckSync:
6804; O2:       # %bb.0: # %entry
6805; O2-NEXT:    lui $2, %hi(_gp_disp)
6806; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6807; O2-NEXT:    addu $1, $2, $25
6808; O2-NEXT:    sync
6809; O2-NEXT:    lw $1, %got(countsint)($1)
6810; O2-NEXT:  $BB16_1: # %entry
6811; O2-NEXT:    # =>This Inner Loop Header: Depth=1
6812; O2-NEXT:    ll $2, 0($1)
6813; O2-NEXT:    addu $3, $2, $4
6814; O2-NEXT:    sc $3, 0($1)
6815; O2-NEXT:    beqz $3, $BB16_1
6816; O2-NEXT:    nop
6817; O2-NEXT:  # %bb.2: # %entry
6818; O2-NEXT:    sync
6819; O2-NEXT:    jr $ra
6820; O2-NEXT:    nop
6821;
6822; O3-LABEL: CheckSync:
6823; O3:       # %bb.0: # %entry
6824; O3-NEXT:    lui $2, %hi(_gp_disp)
6825; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
6826; O3-NEXT:    addu $1, $2, $25
6827; O3-NEXT:    sync
6828; O3-NEXT:    lw $1, %got(countsint)($1)
6829; O3-NEXT:  $BB16_1: # %entry
6830; O3-NEXT:    # =>This Inner Loop Header: Depth=1
6831; O3-NEXT:    ll $2, 0($1)
6832; O3-NEXT:    addu $3, $2, $4
6833; O3-NEXT:    sc $3, 0($1)
6834; O3-NEXT:    beqz $3, $BB16_1
6835; O3-NEXT:    nop
6836; O3-NEXT:  # %bb.2: # %entry
6837; O3-NEXT:    sync
6838; O3-NEXT:    jr $ra
6839; O3-NEXT:    nop
6840;
6841; MIPS32EB-LABEL: CheckSync:
6842; MIPS32EB:       # %bb.0: # %entry
6843; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
6844; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
6845; MIPS32EB-NEXT:    addu $1, $2, $25
6846; MIPS32EB-NEXT:    sync
6847; MIPS32EB-NEXT:    lw $1, %got(countsint)($1)
6848; MIPS32EB-NEXT:  $BB16_1: # %entry
6849; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
6850; MIPS32EB-NEXT:    ll $2, 0($1)
6851; MIPS32EB-NEXT:    addu $3, $2, $4
6852; MIPS32EB-NEXT:    sc $3, 0($1)
6853; MIPS32EB-NEXT:    beqz $3, $BB16_1
6854; MIPS32EB-NEXT:    nop
6855; MIPS32EB-NEXT:  # %bb.2: # %entry
6856; MIPS32EB-NEXT:    sync
6857; MIPS32EB-NEXT:    jr $ra
6858; MIPS32EB-NEXT:    nop
6859entry:
6860  %0 = atomicrmw add i32* @countsint, i32 %v seq_cst
6861  ret i32 %0
6862}
6863
6864; make sure that this assertion in
6865; TwoAddressInstructionPass::TryInstructionTransform does not fail:
6866;
6867; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) &&
6868;
6869; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an
6870; operand of an atomic instruction with register $zero.
6871@a = external global i32
6872
6873define i32 @zeroreg() nounwind {
6874; MIPS32-LABEL: zeroreg:
6875; MIPS32:       # %bb.0: # %entry
6876; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
6877; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6878; MIPS32-NEXT:    addu $1, $2, $25
6879; MIPS32-NEXT:    sync
6880; MIPS32-NEXT:    addiu $2, $zero, 0
6881; MIPS32-NEXT:    addiu $3, $zero, 1
6882; MIPS32-NEXT:    lw $1, %got(a)($1)
6883; MIPS32-NEXT:  $BB17_1: # %entry
6884; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
6885; MIPS32-NEXT:    ll $4, 0($1)
6886; MIPS32-NEXT:    bne $4, $3, $BB17_3
6887; MIPS32-NEXT:    nop
6888; MIPS32-NEXT:  # %bb.2: # %entry
6889; MIPS32-NEXT:    # in Loop: Header=BB17_1 Depth=1
6890; MIPS32-NEXT:    move $5, $2
6891; MIPS32-NEXT:    sc $5, 0($1)
6892; MIPS32-NEXT:    beqz $5, $BB17_1
6893; MIPS32-NEXT:    nop
6894; MIPS32-NEXT:  $BB17_3: # %entry
6895; MIPS32-NEXT:    xor $1, $4, $3
6896; MIPS32-NEXT:    sltiu $2, $1, 1
6897; MIPS32-NEXT:    sync
6898; MIPS32-NEXT:    jr $ra
6899; MIPS32-NEXT:    nop
6900;
6901; MIPS32O0-LABEL: zeroreg:
6902; MIPS32O0:       # %bb.0: # %entry
6903; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
6904; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6905; MIPS32O0-NEXT:    addu $1, $2, $25
6906; MIPS32O0-NEXT:    sync
6907; MIPS32O0-NEXT:    lw $4, %got(a)($1)
6908; MIPS32O0-NEXT:    addiu $6, $zero, 0
6909; MIPS32O0-NEXT:    addiu $2, $zero, 1
6910; MIPS32O0-NEXT:    move $5, $2
6911; MIPS32O0-NEXT:  $BB17_1: # %entry
6912; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
6913; MIPS32O0-NEXT:    ll $1, 0($4)
6914; MIPS32O0-NEXT:    bne $1, $5, $BB17_3
6915; MIPS32O0-NEXT:    nop
6916; MIPS32O0-NEXT:  # %bb.2: # %entry
6917; MIPS32O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
6918; MIPS32O0-NEXT:    move $3, $6
6919; MIPS32O0-NEXT:    sc $3, 0($4)
6920; MIPS32O0-NEXT:    beqz $3, $BB17_1
6921; MIPS32O0-NEXT:    nop
6922; MIPS32O0-NEXT:  $BB17_3: # %entry
6923; MIPS32O0-NEXT:    xor $2, $1, $2
6924; MIPS32O0-NEXT:    sltiu $2, $2, 1
6925; MIPS32O0-NEXT:    sync
6926; MIPS32O0-NEXT:    addiu $2, $zero, 1
6927; MIPS32O0-NEXT:    xor $1, $1, $2
6928; MIPS32O0-NEXT:    sltiu $1, $1, 1
6929; MIPS32O0-NEXT:    andi $2, $1, 1
6930; MIPS32O0-NEXT:    jr $ra
6931; MIPS32O0-NEXT:    nop
6932;
6933; MIPS32R2-LABEL: zeroreg:
6934; MIPS32R2:       # %bb.0: # %entry
6935; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
6936; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6937; MIPS32R2-NEXT:    addu $1, $2, $25
6938; MIPS32R2-NEXT:    sync
6939; MIPS32R2-NEXT:    addiu $2, $zero, 0
6940; MIPS32R2-NEXT:    addiu $3, $zero, 1
6941; MIPS32R2-NEXT:    lw $1, %got(a)($1)
6942; MIPS32R2-NEXT:  $BB17_1: # %entry
6943; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
6944; MIPS32R2-NEXT:    ll $4, 0($1)
6945; MIPS32R2-NEXT:    bne $4, $3, $BB17_3
6946; MIPS32R2-NEXT:    nop
6947; MIPS32R2-NEXT:  # %bb.2: # %entry
6948; MIPS32R2-NEXT:    # in Loop: Header=BB17_1 Depth=1
6949; MIPS32R2-NEXT:    move $5, $2
6950; MIPS32R2-NEXT:    sc $5, 0($1)
6951; MIPS32R2-NEXT:    beqz $5, $BB17_1
6952; MIPS32R2-NEXT:    nop
6953; MIPS32R2-NEXT:  $BB17_3: # %entry
6954; MIPS32R2-NEXT:    xor $1, $4, $3
6955; MIPS32R2-NEXT:    sltiu $2, $1, 1
6956; MIPS32R2-NEXT:    sync
6957; MIPS32R2-NEXT:    jr $ra
6958; MIPS32R2-NEXT:    nop
6959;
6960; MIPS32R6-LABEL: zeroreg:
6961; MIPS32R6:       # %bb.0: # %entry
6962; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
6963; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
6964; MIPS32R6-NEXT:    addu $1, $2, $25
6965; MIPS32R6-NEXT:    sync
6966; MIPS32R6-NEXT:    addiu $2, $zero, 0
6967; MIPS32R6-NEXT:    addiu $3, $zero, 1
6968; MIPS32R6-NEXT:    lw $1, %got(a)($1)
6969; MIPS32R6-NEXT:  $BB17_1: # %entry
6970; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
6971; MIPS32R6-NEXT:    ll $4, 0($1)
6972; MIPS32R6-NEXT:    bnec $4, $3, $BB17_3
6973; MIPS32R6-NEXT:  # %bb.2: # %entry
6974; MIPS32R6-NEXT:    # in Loop: Header=BB17_1 Depth=1
6975; MIPS32R6-NEXT:    move $5, $2
6976; MIPS32R6-NEXT:    sc $5, 0($1)
6977; MIPS32R6-NEXT:    beqzc $5, $BB17_1
6978; MIPS32R6-NEXT:  $BB17_3: # %entry
6979; MIPS32R6-NEXT:    xor $1, $4, $3
6980; MIPS32R6-NEXT:    sltiu $2, $1, 1
6981; MIPS32R6-NEXT:    sync
6982; MIPS32R6-NEXT:    jrc $ra
6983;
6984; MIPS32R6O0-LABEL: zeroreg:
6985; MIPS32R6O0:       # %bb.0: # %entry
6986; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
6987; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6988; MIPS32R6O0-NEXT:    addu $1, $2, $25
6989; MIPS32R6O0-NEXT:    sync
6990; MIPS32R6O0-NEXT:    lw $4, %got(a)($1)
6991; MIPS32R6O0-NEXT:    addiu $6, $zero, 0
6992; MIPS32R6O0-NEXT:    addiu $2, $zero, 1
6993; MIPS32R6O0-NEXT:    move $5, $2
6994; MIPS32R6O0-NEXT:  $BB17_1: # %entry
6995; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
6996; MIPS32R6O0-NEXT:    ll $1, 0($4)
6997; MIPS32R6O0-NEXT:    bnec $1, $5, $BB17_3
6998; MIPS32R6O0-NEXT:  # %bb.2: # %entry
6999; MIPS32R6O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
7000; MIPS32R6O0-NEXT:    move $3, $6
7001; MIPS32R6O0-NEXT:    sc $3, 0($4)
7002; MIPS32R6O0-NEXT:    beqzc $3, $BB17_1
7003; MIPS32R6O0-NEXT:  $BB17_3: # %entry
7004; MIPS32R6O0-NEXT:    xor $1, $1, $2
7005; MIPS32R6O0-NEXT:    sltiu $2, $1, 1
7006; MIPS32R6O0-NEXT:    sync
7007; MIPS32R6O0-NEXT:    jrc $ra
7008;
7009; MIPS4-LABEL: zeroreg:
7010; MIPS4:       # %bb.0: # %entry
7011; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7012; MIPS4-NEXT:    daddu $1, $1, $25
7013; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7014; MIPS4-NEXT:    sync
7015; MIPS4-NEXT:    addiu $2, $zero, 0
7016; MIPS4-NEXT:    addiu $3, $zero, 1
7017; MIPS4-NEXT:    ld $1, %got_disp(a)($1)
7018; MIPS4-NEXT:  .LBB17_1: # %entry
7019; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
7020; MIPS4-NEXT:    ll $4, 0($1)
7021; MIPS4-NEXT:    bne $4, $3, .LBB17_3
7022; MIPS4-NEXT:    nop
7023; MIPS4-NEXT:  # %bb.2: # %entry
7024; MIPS4-NEXT:    # in Loop: Header=BB17_1 Depth=1
7025; MIPS4-NEXT:    move $5, $2
7026; MIPS4-NEXT:    sc $5, 0($1)
7027; MIPS4-NEXT:    beqz $5, .LBB17_1
7028; MIPS4-NEXT:    nop
7029; MIPS4-NEXT:  .LBB17_3: # %entry
7030; MIPS4-NEXT:    xor $1, $4, $3
7031; MIPS4-NEXT:    sltiu $2, $1, 1
7032; MIPS4-NEXT:    sync
7033; MIPS4-NEXT:    jr $ra
7034; MIPS4-NEXT:    nop
7035;
7036; MIPS64-LABEL: zeroreg:
7037; MIPS64:       # %bb.0: # %entry
7038; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7039; MIPS64-NEXT:    daddu $1, $1, $25
7040; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7041; MIPS64-NEXT:    sync
7042; MIPS64-NEXT:    addiu $2, $zero, 0
7043; MIPS64-NEXT:    addiu $3, $zero, 1
7044; MIPS64-NEXT:    ld $1, %got_disp(a)($1)
7045; MIPS64-NEXT:  .LBB17_1: # %entry
7046; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
7047; MIPS64-NEXT:    ll $4, 0($1)
7048; MIPS64-NEXT:    bne $4, $3, .LBB17_3
7049; MIPS64-NEXT:    nop
7050; MIPS64-NEXT:  # %bb.2: # %entry
7051; MIPS64-NEXT:    # in Loop: Header=BB17_1 Depth=1
7052; MIPS64-NEXT:    move $5, $2
7053; MIPS64-NEXT:    sc $5, 0($1)
7054; MIPS64-NEXT:    beqz $5, .LBB17_1
7055; MIPS64-NEXT:    nop
7056; MIPS64-NEXT:  .LBB17_3: # %entry
7057; MIPS64-NEXT:    xor $1, $4, $3
7058; MIPS64-NEXT:    sltiu $2, $1, 1
7059; MIPS64-NEXT:    sync
7060; MIPS64-NEXT:    jr $ra
7061; MIPS64-NEXT:    nop
7062;
7063; MIPS64R2-LABEL: zeroreg:
7064; MIPS64R2:       # %bb.0: # %entry
7065; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7066; MIPS64R2-NEXT:    daddu $1, $1, $25
7067; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7068; MIPS64R2-NEXT:    sync
7069; MIPS64R2-NEXT:    addiu $2, $zero, 0
7070; MIPS64R2-NEXT:    addiu $3, $zero, 1
7071; MIPS64R2-NEXT:    ld $1, %got_disp(a)($1)
7072; MIPS64R2-NEXT:  .LBB17_1: # %entry
7073; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
7074; MIPS64R2-NEXT:    ll $4, 0($1)
7075; MIPS64R2-NEXT:    bne $4, $3, .LBB17_3
7076; MIPS64R2-NEXT:    nop
7077; MIPS64R2-NEXT:  # %bb.2: # %entry
7078; MIPS64R2-NEXT:    # in Loop: Header=BB17_1 Depth=1
7079; MIPS64R2-NEXT:    move $5, $2
7080; MIPS64R2-NEXT:    sc $5, 0($1)
7081; MIPS64R2-NEXT:    beqz $5, .LBB17_1
7082; MIPS64R2-NEXT:    nop
7083; MIPS64R2-NEXT:  .LBB17_3: # %entry
7084; MIPS64R2-NEXT:    xor $1, $4, $3
7085; MIPS64R2-NEXT:    sltiu $2, $1, 1
7086; MIPS64R2-NEXT:    sync
7087; MIPS64R2-NEXT:    jr $ra
7088; MIPS64R2-NEXT:    nop
7089;
7090; MIPS64R6-LABEL: zeroreg:
7091; MIPS64R6:       # %bb.0: # %entry
7092; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7093; MIPS64R6-NEXT:    daddu $1, $1, $25
7094; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7095; MIPS64R6-NEXT:    sync
7096; MIPS64R6-NEXT:    addiu $2, $zero, 0
7097; MIPS64R6-NEXT:    addiu $3, $zero, 1
7098; MIPS64R6-NEXT:    ld $1, %got_disp(a)($1)
7099; MIPS64R6-NEXT:  .LBB17_1: # %entry
7100; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
7101; MIPS64R6-NEXT:    ll $4, 0($1)
7102; MIPS64R6-NEXT:    bnec $4, $3, .LBB17_3
7103; MIPS64R6-NEXT:  # %bb.2: # %entry
7104; MIPS64R6-NEXT:    # in Loop: Header=BB17_1 Depth=1
7105; MIPS64R6-NEXT:    move $5, $2
7106; MIPS64R6-NEXT:    sc $5, 0($1)
7107; MIPS64R6-NEXT:    beqzc $5, .LBB17_1
7108; MIPS64R6-NEXT:  .LBB17_3: # %entry
7109; MIPS64R6-NEXT:    xor $1, $4, $3
7110; MIPS64R6-NEXT:    sltiu $2, $1, 1
7111; MIPS64R6-NEXT:    sync
7112; MIPS64R6-NEXT:    jrc $ra
7113;
7114; MIPS64R6O0-LABEL: zeroreg:
7115; MIPS64R6O0:       # %bb.0: # %entry
7116; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7117; MIPS64R6O0-NEXT:    daddu $1, $1, $25
7118; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7119; MIPS64R6O0-NEXT:    sync
7120; MIPS64R6O0-NEXT:    ld $4, %got_disp(a)($1)
7121; MIPS64R6O0-NEXT:    addiu $6, $zero, 0
7122; MIPS64R6O0-NEXT:    addiu $2, $zero, 1
7123; MIPS64R6O0-NEXT:    move $5, $2
7124; MIPS64R6O0-NEXT:  .LBB17_1: # %entry
7125; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7126; MIPS64R6O0-NEXT:    ll $1, 0($4)
7127; MIPS64R6O0-NEXT:    bnec $1, $5, .LBB17_3
7128; MIPS64R6O0-NEXT:  # %bb.2: # %entry
7129; MIPS64R6O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
7130; MIPS64R6O0-NEXT:    move $3, $6
7131; MIPS64R6O0-NEXT:    sc $3, 0($4)
7132; MIPS64R6O0-NEXT:    beqzc $3, .LBB17_1
7133; MIPS64R6O0-NEXT:  .LBB17_3: # %entry
7134; MIPS64R6O0-NEXT:    xor $1, $1, $2
7135; MIPS64R6O0-NEXT:    sltiu $2, $1, 1
7136; MIPS64R6O0-NEXT:    sync
7137; MIPS64R6O0-NEXT:    jrc $ra
7138;
7139; MM32-LABEL: zeroreg:
7140; MM32:       # %bb.0: # %entry
7141; MM32-NEXT:    lui $2, %hi(_gp_disp)
7142; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7143; MM32-NEXT:    addu $2, $2, $25
7144; MM32-NEXT:    sync
7145; MM32-NEXT:    li16 $3, 0
7146; MM32-NEXT:    li16 $4, 1
7147; MM32-NEXT:    lw $1, %got(a)($2)
7148; MM32-NEXT:  $BB17_1: # %entry
7149; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
7150; MM32-NEXT:    ll $2, 0($1)
7151; MM32-NEXT:    bne $2, $4, $BB17_3
7152; MM32-NEXT:    nop
7153; MM32-NEXT:  # %bb.2: # %entry
7154; MM32-NEXT:    # in Loop: Header=BB17_1 Depth=1
7155; MM32-NEXT:    move $5, $3
7156; MM32-NEXT:    sc $5, 0($1)
7157; MM32-NEXT:    beqzc $5, $BB17_1
7158; MM32-NEXT:  $BB17_3: # %entry
7159; MM32-NEXT:    xor $1, $2, $4
7160; MM32-NEXT:    sltiu $2, $1, 1
7161; MM32-NEXT:    sync
7162; MM32-NEXT:    jrc $ra
7163;
7164; O1-LABEL: zeroreg:
7165; O1:       # %bb.0: # %entry
7166; O1-NEXT:    lui $2, %hi(_gp_disp)
7167; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
7168; O1-NEXT:    addu $1, $2, $25
7169; O1-NEXT:    sync
7170; O1-NEXT:    addiu $2, $zero, 0
7171; O1-NEXT:    addiu $3, $zero, 1
7172; O1-NEXT:    lw $1, %got(a)($1)
7173; O1-NEXT:  $BB17_1: # %entry
7174; O1-NEXT:    # =>This Inner Loop Header: Depth=1
7175; O1-NEXT:    ll $4, 0($1)
7176; O1-NEXT:    bne $4, $3, $BB17_3
7177; O1-NEXT:    nop
7178; O1-NEXT:  # %bb.2: # %entry
7179; O1-NEXT:    # in Loop: Header=BB17_1 Depth=1
7180; O1-NEXT:    move $5, $2
7181; O1-NEXT:    sc $5, 0($1)
7182; O1-NEXT:    beqz $5, $BB17_1
7183; O1-NEXT:    nop
7184; O1-NEXT:  $BB17_3: # %entry
7185; O1-NEXT:    xor $1, $4, $3
7186; O1-NEXT:    sltiu $2, $1, 1
7187; O1-NEXT:    sync
7188; O1-NEXT:    jr $ra
7189; O1-NEXT:    nop
7190;
7191; O2-LABEL: zeroreg:
7192; O2:       # %bb.0: # %entry
7193; O2-NEXT:    lui $2, %hi(_gp_disp)
7194; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7195; O2-NEXT:    addu $1, $2, $25
7196; O2-NEXT:    sync
7197; O2-NEXT:    addiu $2, $zero, 0
7198; O2-NEXT:    addiu $3, $zero, 1
7199; O2-NEXT:    lw $1, %got(a)($1)
7200; O2-NEXT:  $BB17_1: # %entry
7201; O2-NEXT:    # =>This Inner Loop Header: Depth=1
7202; O2-NEXT:    ll $4, 0($1)
7203; O2-NEXT:    bne $4, $3, $BB17_3
7204; O2-NEXT:    nop
7205; O2-NEXT:  # %bb.2: # %entry
7206; O2-NEXT:    # in Loop: Header=BB17_1 Depth=1
7207; O2-NEXT:    move $5, $2
7208; O2-NEXT:    sc $5, 0($1)
7209; O2-NEXT:    beqz $5, $BB17_1
7210; O2-NEXT:    nop
7211; O2-NEXT:  $BB17_3: # %entry
7212; O2-NEXT:    xor $1, $4, $3
7213; O2-NEXT:    sltiu $2, $1, 1
7214; O2-NEXT:    sync
7215; O2-NEXT:    jr $ra
7216; O2-NEXT:    nop
7217;
7218; O3-LABEL: zeroreg:
7219; O3:       # %bb.0: # %entry
7220; O3-NEXT:    lui $2, %hi(_gp_disp)
7221; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
7222; O3-NEXT:    addu $1, $2, $25
7223; O3-NEXT:    addiu $2, $zero, 0
7224; O3-NEXT:    addiu $3, $zero, 1
7225; O3-NEXT:    sync
7226; O3-NEXT:    lw $1, %got(a)($1)
7227; O3-NEXT:  $BB17_1: # %entry
7228; O3-NEXT:    # =>This Inner Loop Header: Depth=1
7229; O3-NEXT:    ll $4, 0($1)
7230; O3-NEXT:    bne $4, $3, $BB17_3
7231; O3-NEXT:    nop
7232; O3-NEXT:  # %bb.2: # %entry
7233; O3-NEXT:    # in Loop: Header=BB17_1 Depth=1
7234; O3-NEXT:    move $5, $2
7235; O3-NEXT:    sc $5, 0($1)
7236; O3-NEXT:    beqz $5, $BB17_1
7237; O3-NEXT:    nop
7238; O3-NEXT:  $BB17_3: # %entry
7239; O3-NEXT:    sync
7240; O3-NEXT:    xor $1, $4, $3
7241; O3-NEXT:    jr $ra
7242; O3-NEXT:    sltiu $2, $1, 1
7243;
7244; MIPS32EB-LABEL: zeroreg:
7245; MIPS32EB:       # %bb.0: # %entry
7246; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
7247; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
7248; MIPS32EB-NEXT:    addu $1, $2, $25
7249; MIPS32EB-NEXT:    sync
7250; MIPS32EB-NEXT:    addiu $2, $zero, 0
7251; MIPS32EB-NEXT:    addiu $3, $zero, 1
7252; MIPS32EB-NEXT:    lw $1, %got(a)($1)
7253; MIPS32EB-NEXT:  $BB17_1: # %entry
7254; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
7255; MIPS32EB-NEXT:    ll $4, 0($1)
7256; MIPS32EB-NEXT:    bne $4, $3, $BB17_3
7257; MIPS32EB-NEXT:    nop
7258; MIPS32EB-NEXT:  # %bb.2: # %entry
7259; MIPS32EB-NEXT:    # in Loop: Header=BB17_1 Depth=1
7260; MIPS32EB-NEXT:    move $5, $2
7261; MIPS32EB-NEXT:    sc $5, 0($1)
7262; MIPS32EB-NEXT:    beqz $5, $BB17_1
7263; MIPS32EB-NEXT:    nop
7264; MIPS32EB-NEXT:  $BB17_3: # %entry
7265; MIPS32EB-NEXT:    xor $1, $4, $3
7266; MIPS32EB-NEXT:    sltiu $2, $1, 1
7267; MIPS32EB-NEXT:    sync
7268; MIPS32EB-NEXT:    jr $ra
7269; MIPS32EB-NEXT:    nop
7270entry:
7271  %pair0 = cmpxchg i32* @a, i32 1, i32 0 seq_cst seq_cst
7272  %0 = extractvalue { i32, i1 } %pair0, 0
7273  %1 = icmp eq i32 %0, 1
7274  %conv = zext i1 %1 to i32
7275  ret i32 %conv
7276}
7277
7278; Check that MIPS32R6 has the correct offset range.
7279; FIXME: At the moment, we don't seem to do addr+offset for any atomic load/store.
7280define i32 @AtomicLoadAdd32_OffGt9Bit(i32 signext %incr) nounwind {
7281; MIPS32-LABEL: AtomicLoadAdd32_OffGt9Bit:
7282; MIPS32:       # %bb.0: # %entry
7283; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
7284; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7285; MIPS32-NEXT:    addu $1, $2, $25
7286; MIPS32-NEXT:    lw $1, %got(x)($1)
7287; MIPS32-NEXT:    addiu $1, $1, 1024
7288; MIPS32-NEXT:  $BB18_1: # %entry
7289; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
7290; MIPS32-NEXT:    ll $2, 0($1)
7291; MIPS32-NEXT:    addu $3, $2, $4
7292; MIPS32-NEXT:    sc $3, 0($1)
7293; MIPS32-NEXT:    beqz $3, $BB18_1
7294; MIPS32-NEXT:    nop
7295; MIPS32-NEXT:  # %bb.2: # %entry
7296; MIPS32-NEXT:    jr $ra
7297; MIPS32-NEXT:    nop
7298;
7299; MIPS32O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7300; MIPS32O0:       # %bb.0: # %entry
7301; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
7302; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7303; MIPS32O0-NEXT:    addu $1, $2, $25
7304; MIPS32O0-NEXT:    lw $1, %got(x)($1)
7305; MIPS32O0-NEXT:    addiu $3, $1, 1024
7306; MIPS32O0-NEXT:  $BB18_1: # %entry
7307; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
7308; MIPS32O0-NEXT:    ll $2, 0($3)
7309; MIPS32O0-NEXT:    addu $1, $2, $4
7310; MIPS32O0-NEXT:    sc $1, 0($3)
7311; MIPS32O0-NEXT:    beqz $1, $BB18_1
7312; MIPS32O0-NEXT:    nop
7313; MIPS32O0-NEXT:  # %bb.2: # %entry
7314; MIPS32O0-NEXT:    jr $ra
7315; MIPS32O0-NEXT:    nop
7316;
7317; MIPS32R2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7318; MIPS32R2:       # %bb.0: # %entry
7319; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
7320; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7321; MIPS32R2-NEXT:    addu $1, $2, $25
7322; MIPS32R2-NEXT:    lw $1, %got(x)($1)
7323; MIPS32R2-NEXT:    addiu $1, $1, 1024
7324; MIPS32R2-NEXT:  $BB18_1: # %entry
7325; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
7326; MIPS32R2-NEXT:    ll $2, 0($1)
7327; MIPS32R2-NEXT:    addu $3, $2, $4
7328; MIPS32R2-NEXT:    sc $3, 0($1)
7329; MIPS32R2-NEXT:    beqz $3, $BB18_1
7330; MIPS32R2-NEXT:    nop
7331; MIPS32R2-NEXT:  # %bb.2: # %entry
7332; MIPS32R2-NEXT:    jr $ra
7333; MIPS32R2-NEXT:    nop
7334;
7335; MIPS32R6-LABEL: AtomicLoadAdd32_OffGt9Bit:
7336; MIPS32R6:       # %bb.0: # %entry
7337; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
7338; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
7339; MIPS32R6-NEXT:    addu $1, $2, $25
7340; MIPS32R6-NEXT:    lw $1, %got(x)($1)
7341; MIPS32R6-NEXT:    addiu $1, $1, 1024
7342; MIPS32R6-NEXT:  $BB18_1: # %entry
7343; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
7344; MIPS32R6-NEXT:    ll $2, 0($1)
7345; MIPS32R6-NEXT:    addu $3, $2, $4
7346; MIPS32R6-NEXT:    sc $3, 0($1)
7347; MIPS32R6-NEXT:    beqzc $3, $BB18_1
7348; MIPS32R6-NEXT:    nop
7349; MIPS32R6-NEXT:  # %bb.2: # %entry
7350; MIPS32R6-NEXT:    jrc $ra
7351;
7352; MIPS32R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7353; MIPS32R6O0:       # %bb.0: # %entry
7354; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
7355; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7356; MIPS32R6O0-NEXT:    addu $1, $2, $25
7357; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
7358; MIPS32R6O0-NEXT:    addiu $3, $1, 1024
7359; MIPS32R6O0-NEXT:  $BB18_1: # %entry
7360; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7361; MIPS32R6O0-NEXT:    ll $2, 0($3)
7362; MIPS32R6O0-NEXT:    addu $1, $2, $4
7363; MIPS32R6O0-NEXT:    sc $1, 0($3)
7364; MIPS32R6O0-NEXT:    beqzc $1, $BB18_1
7365; MIPS32R6O0-NEXT:    nop
7366; MIPS32R6O0-NEXT:  # %bb.2: # %entry
7367; MIPS32R6O0-NEXT:    jrc $ra
7368;
7369; MIPS4-LABEL: AtomicLoadAdd32_OffGt9Bit:
7370; MIPS4:       # %bb.0: # %entry
7371; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7372; MIPS4-NEXT:    daddu $1, $1, $25
7373; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7374; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
7375; MIPS4-NEXT:    daddiu $1, $1, 1024
7376; MIPS4-NEXT:  .LBB18_1: # %entry
7377; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
7378; MIPS4-NEXT:    ll $2, 0($1)
7379; MIPS4-NEXT:    addu $3, $2, $4
7380; MIPS4-NEXT:    sc $3, 0($1)
7381; MIPS4-NEXT:    beqz $3, .LBB18_1
7382; MIPS4-NEXT:    nop
7383; MIPS4-NEXT:  # %bb.2: # %entry
7384; MIPS4-NEXT:    jr $ra
7385; MIPS4-NEXT:    nop
7386;
7387; MIPS64-LABEL: AtomicLoadAdd32_OffGt9Bit:
7388; MIPS64:       # %bb.0: # %entry
7389; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7390; MIPS64-NEXT:    daddu $1, $1, $25
7391; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7392; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
7393; MIPS64-NEXT:    daddiu $1, $1, 1024
7394; MIPS64-NEXT:  .LBB18_1: # %entry
7395; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
7396; MIPS64-NEXT:    ll $2, 0($1)
7397; MIPS64-NEXT:    addu $3, $2, $4
7398; MIPS64-NEXT:    sc $3, 0($1)
7399; MIPS64-NEXT:    beqz $3, .LBB18_1
7400; MIPS64-NEXT:    nop
7401; MIPS64-NEXT:  # %bb.2: # %entry
7402; MIPS64-NEXT:    jr $ra
7403; MIPS64-NEXT:    nop
7404;
7405; MIPS64R2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7406; MIPS64R2:       # %bb.0: # %entry
7407; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7408; MIPS64R2-NEXT:    daddu $1, $1, $25
7409; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7410; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
7411; MIPS64R2-NEXT:    daddiu $1, $1, 1024
7412; MIPS64R2-NEXT:  .LBB18_1: # %entry
7413; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
7414; MIPS64R2-NEXT:    ll $2, 0($1)
7415; MIPS64R2-NEXT:    addu $3, $2, $4
7416; MIPS64R2-NEXT:    sc $3, 0($1)
7417; MIPS64R2-NEXT:    beqz $3, .LBB18_1
7418; MIPS64R2-NEXT:    nop
7419; MIPS64R2-NEXT:  # %bb.2: # %entry
7420; MIPS64R2-NEXT:    jr $ra
7421; MIPS64R2-NEXT:    nop
7422;
7423; MIPS64R6-LABEL: AtomicLoadAdd32_OffGt9Bit:
7424; MIPS64R6:       # %bb.0: # %entry
7425; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7426; MIPS64R6-NEXT:    daddu $1, $1, $25
7427; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7428; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
7429; MIPS64R6-NEXT:    daddiu $1, $1, 1024
7430; MIPS64R6-NEXT:  .LBB18_1: # %entry
7431; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
7432; MIPS64R6-NEXT:    ll $2, 0($1)
7433; MIPS64R6-NEXT:    addu $3, $2, $4
7434; MIPS64R6-NEXT:    sc $3, 0($1)
7435; MIPS64R6-NEXT:    beqzc $3, .LBB18_1
7436; MIPS64R6-NEXT:    nop
7437; MIPS64R6-NEXT:  # %bb.2: # %entry
7438; MIPS64R6-NEXT:    jrc $ra
7439;
7440; MIPS64R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7441; MIPS64R6O0:       # %bb.0: # %entry
7442; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7443; MIPS64R6O0-NEXT:    daddu $1, $1, $25
7444; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7445; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
7446; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
7447; MIPS64R6O0-NEXT:    daddiu $3, $1, 1024
7448; MIPS64R6O0-NEXT:  .LBB18_1: # %entry
7449; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7450; MIPS64R6O0-NEXT:    ll $2, 0($3)
7451; MIPS64R6O0-NEXT:    addu $1, $2, $4
7452; MIPS64R6O0-NEXT:    sc $1, 0($3)
7453; MIPS64R6O0-NEXT:    beqzc $1, .LBB18_1
7454; MIPS64R6O0-NEXT:    nop
7455; MIPS64R6O0-NEXT:  # %bb.2: # %entry
7456; MIPS64R6O0-NEXT:    jrc $ra
7457;
7458; MM32-LABEL: AtomicLoadAdd32_OffGt9Bit:
7459; MM32:       # %bb.0: # %entry
7460; MM32-NEXT:    lui $2, %hi(_gp_disp)
7461; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7462; MM32-NEXT:    addu $2, $2, $25
7463; MM32-NEXT:    lw $1, %got(x)($2)
7464; MM32-NEXT:    addiu $1, $1, 1024
7465; MM32-NEXT:  $BB18_1: # %entry
7466; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
7467; MM32-NEXT:    ll $2, 0($1)
7468; MM32-NEXT:    addu16 $3, $2, $4
7469; MM32-NEXT:    sc $3, 0($1)
7470; MM32-NEXT:    beqzc $3, $BB18_1
7471; MM32-NEXT:  # %bb.2: # %entry
7472; MM32-NEXT:    jrc $ra
7473;
7474; O1-LABEL: AtomicLoadAdd32_OffGt9Bit:
7475; O1:       # %bb.0: # %entry
7476; O1-NEXT:    lui $2, %hi(_gp_disp)
7477; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
7478; O1-NEXT:    addu $1, $2, $25
7479; O1-NEXT:    lw $1, %got(x)($1)
7480; O1-NEXT:    addiu $1, $1, 1024
7481; O1-NEXT:  $BB18_1: # %entry
7482; O1-NEXT:    # =>This Inner Loop Header: Depth=1
7483; O1-NEXT:    ll $2, 0($1)
7484; O1-NEXT:    addu $3, $2, $4
7485; O1-NEXT:    sc $3, 0($1)
7486; O1-NEXT:    beqz $3, $BB18_1
7487; O1-NEXT:    nop
7488; O1-NEXT:  # %bb.2: # %entry
7489; O1-NEXT:    jr $ra
7490; O1-NEXT:    nop
7491;
7492; O2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7493; O2:       # %bb.0: # %entry
7494; O2-NEXT:    lui $2, %hi(_gp_disp)
7495; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7496; O2-NEXT:    addu $1, $2, $25
7497; O2-NEXT:    lw $1, %got(x)($1)
7498; O2-NEXT:    addiu $1, $1, 1024
7499; O2-NEXT:  $BB18_1: # %entry
7500; O2-NEXT:    # =>This Inner Loop Header: Depth=1
7501; O2-NEXT:    ll $2, 0($1)
7502; O2-NEXT:    addu $3, $2, $4
7503; O2-NEXT:    sc $3, 0($1)
7504; O2-NEXT:    beqz $3, $BB18_1
7505; O2-NEXT:    nop
7506; O2-NEXT:  # %bb.2: # %entry
7507; O2-NEXT:    jr $ra
7508; O2-NEXT:    nop
7509;
7510; O3-LABEL: AtomicLoadAdd32_OffGt9Bit:
7511; O3:       # %bb.0: # %entry
7512; O3-NEXT:    lui $2, %hi(_gp_disp)
7513; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
7514; O3-NEXT:    addu $1, $2, $25
7515; O3-NEXT:    lw $1, %got(x)($1)
7516; O3-NEXT:    addiu $1, $1, 1024
7517; O3-NEXT:  $BB18_1: # %entry
7518; O3-NEXT:    # =>This Inner Loop Header: Depth=1
7519; O3-NEXT:    ll $2, 0($1)
7520; O3-NEXT:    addu $3, $2, $4
7521; O3-NEXT:    sc $3, 0($1)
7522; O3-NEXT:    beqz $3, $BB18_1
7523; O3-NEXT:    nop
7524; O3-NEXT:  # %bb.2: # %entry
7525; O3-NEXT:    jr $ra
7526; O3-NEXT:    nop
7527;
7528; MIPS32EB-LABEL: AtomicLoadAdd32_OffGt9Bit:
7529; MIPS32EB:       # %bb.0: # %entry
7530; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
7531; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
7532; MIPS32EB-NEXT:    addu $1, $2, $25
7533; MIPS32EB-NEXT:    lw $1, %got(x)($1)
7534; MIPS32EB-NEXT:    addiu $1, $1, 1024
7535; MIPS32EB-NEXT:  $BB18_1: # %entry
7536; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
7537; MIPS32EB-NEXT:    ll $2, 0($1)
7538; MIPS32EB-NEXT:    addu $3, $2, $4
7539; MIPS32EB-NEXT:    sc $3, 0($1)
7540; MIPS32EB-NEXT:    beqz $3, $BB18_1
7541; MIPS32EB-NEXT:    nop
7542; MIPS32EB-NEXT:  # %bb.2: # %entry
7543; MIPS32EB-NEXT:    jr $ra
7544; MIPS32EB-NEXT:    nop
7545entry:
7546  %0 = atomicrmw add i32* getelementptr(i32, i32* @x, i32 256), i32 %incr monotonic
7547  ret i32 %0
7548
7549}
7550