1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | \
3; RUN:   FileCheck %s -check-prefix=MIPS32
4; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O0 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | \
5; RUN:   FileCheck %s -check-prefix=MIPS32O0
6; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32r2 -relocation-model=pic -verify-machineinstrs < %s | \
7; RUN:   FileCheck %s -check-prefix=MIPS32R2
8; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32r6 -relocation-model=pic -verify-machineinstrs < %s | \
9; RUN:   FileCheck %s -check-prefix=MIPS32R6
10; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O0 --disable-machine-licm -mcpu=mips32r6 -relocation-model=pic -verify-machineinstrs < %s | \
11; RUN:   FileCheck %s -check-prefix=MIPS32R6O0
12; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips4 -relocation-model=pic -verify-machineinstrs < %s | \
13; RUN:   FileCheck %s -check-prefix=MIPS4
14; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | \
15; RUN:   FileCheck %s -check-prefix=MIPS64
16; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r2 -relocation-model=pic -verify-machineinstrs < %s | \
17; RUN:   FileCheck %s -check-prefix=MIPS64R2
18; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs < %s | \
19; RUN:   FileCheck %s -check-prefix=MIPS64R6
20; RUN: llc -mtriple=mips64-unknown-linux-gnu -O0 -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs -verify-machineinstrs < %s | \
21; RUN:   FileCheck %s -check-prefix=MIPS64R6O0
22; RUN: llc -mtriple=mipsel-unknown-linux-gnu --disable-machine-licm -mcpu=mips32r2 -mattr=micromips -relocation-model=pic -verify-machineinstrs < %s | \
23; RUN:   FileCheck %s -check-prefix=MM32
24
25; We want to verify the produced code is well formed all optimization levels, the rest of the tests which ensure correctness.
26; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O1 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O1
27; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O2 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O2
28; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O3 --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O3
29
30; Keep one big-endian check so that we don't reduce testing, but don't add more
31; since endianness doesn't affect the body of the atomic operations.
32; RUN: llc -mtriple=mips-unknown-linux-gnu   --disable-machine-licm -mcpu=mips32 -relocation-model=pic -verify-machineinstrs < %s | \
33; RUN:   FileCheck %s -check-prefix=MIPS32EB
34
35@x = common global i32 0, align 4
36
37define i32 @AtomicLoadAdd32(i32 signext %incr) nounwind {
38; MIPS32-LABEL: AtomicLoadAdd32:
39; MIPS32:       # %bb.0: # %entry
40; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
41; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
42; MIPS32-NEXT:    addu $1, $2, $25
43; MIPS32-NEXT:    lw $1, %got(x)($1)
44; MIPS32-NEXT:  $BB0_1: # %entry
45; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
46; MIPS32-NEXT:    ll $2, 0($1)
47; MIPS32-NEXT:    addu $3, $2, $4
48; MIPS32-NEXT:    sc $3, 0($1)
49; MIPS32-NEXT:    beqz $3, $BB0_1
50; MIPS32-NEXT:    nop
51; MIPS32-NEXT:  # %bb.2: # %entry
52; MIPS32-NEXT:    jr $ra
53; MIPS32-NEXT:    nop
54;
55; MIPS32O0-LABEL: AtomicLoadAdd32:
56; MIPS32O0:       # %bb.0: # %entry
57; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
58; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
59; MIPS32O0-NEXT:    addu $1, $2, $25
60; MIPS32O0-NEXT:    lw $1, %got(x)($1)
61; MIPS32O0-NEXT:  $BB0_1: # %entry
62; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
63; MIPS32O0-NEXT:    ll $2, 0($1)
64; MIPS32O0-NEXT:    addu $3, $2, $4
65; MIPS32O0-NEXT:    sc $3, 0($1)
66; MIPS32O0-NEXT:    beqz $3, $BB0_1
67; MIPS32O0-NEXT:    nop
68; MIPS32O0-NEXT:  # %bb.2: # %entry
69; MIPS32O0-NEXT:    jr $ra
70; MIPS32O0-NEXT:    nop
71;
72; MIPS32R2-LABEL: AtomicLoadAdd32:
73; MIPS32R2:       # %bb.0: # %entry
74; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
75; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
76; MIPS32R2-NEXT:    addu $1, $2, $25
77; MIPS32R2-NEXT:    lw $1, %got(x)($1)
78; MIPS32R2-NEXT:  $BB0_1: # %entry
79; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
80; MIPS32R2-NEXT:    ll $2, 0($1)
81; MIPS32R2-NEXT:    addu $3, $2, $4
82; MIPS32R2-NEXT:    sc $3, 0($1)
83; MIPS32R2-NEXT:    beqz $3, $BB0_1
84; MIPS32R2-NEXT:    nop
85; MIPS32R2-NEXT:  # %bb.2: # %entry
86; MIPS32R2-NEXT:    jr $ra
87; MIPS32R2-NEXT:    nop
88;
89; MIPS32R6-LABEL: AtomicLoadAdd32:
90; MIPS32R6:       # %bb.0: # %entry
91; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
92; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
93; MIPS32R6-NEXT:    addu $1, $2, $25
94; MIPS32R6-NEXT:    lw $1, %got(x)($1)
95; MIPS32R6-NEXT:  $BB0_1: # %entry
96; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
97; MIPS32R6-NEXT:    ll $2, 0($1)
98; MIPS32R6-NEXT:    addu $3, $2, $4
99; MIPS32R6-NEXT:    sc $3, 0($1)
100; MIPS32R6-NEXT:    beqzc $3, $BB0_1
101; MIPS32R6-NEXT:    nop
102; MIPS32R6-NEXT:  # %bb.2: # %entry
103; MIPS32R6-NEXT:    jrc $ra
104;
105; MIPS32R6O0-LABEL: AtomicLoadAdd32:
106; MIPS32R6O0:       # %bb.0: # %entry
107; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
108; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
109; MIPS32R6O0-NEXT:    addu $1, $2, $25
110; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
111; MIPS32R6O0-NEXT:  $BB0_1: # %entry
112; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
113; MIPS32R6O0-NEXT:    ll $2, 0($1)
114; MIPS32R6O0-NEXT:    addu $3, $2, $4
115; MIPS32R6O0-NEXT:    sc $3, 0($1)
116; MIPS32R6O0-NEXT:    beqzc $3, $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 $1, %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($1)
198; MIPS64R6O0-NEXT:    addu $3, $2, $4
199; MIPS64R6O0-NEXT:    sc $3, 0($1)
200; MIPS64R6O0-NEXT:    beqzc $3, .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 $1, %got(x)($1)
317; MIPS32O0-NEXT:  $BB1_1: # %entry
318; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
319; MIPS32O0-NEXT:    ll $2, 0($1)
320; MIPS32O0-NEXT:    subu $3, $2, $4
321; MIPS32O0-NEXT:    sc $3, 0($1)
322; MIPS32O0-NEXT:    beqz $3, $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 $1, %got(x)($1)
367; MIPS32R6O0-NEXT:  $BB1_1: # %entry
368; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
369; MIPS32R6O0-NEXT:    ll $2, 0($1)
370; MIPS32R6O0-NEXT:    subu $3, $2, $4
371; MIPS32R6O0-NEXT:    sc $3, 0($1)
372; MIPS32R6O0-NEXT:    beqzc $3, $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 $1, %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($1)
454; MIPS64R6O0-NEXT:    subu $3, $2, $4
455; MIPS64R6O0-NEXT:    sc $3, 0($1)
456; MIPS64R6O0-NEXT:    beqzc $3, .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 $1, %got(x)($1)
573; MIPS32O0-NEXT:  $BB2_1: # %entry
574; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
575; MIPS32O0-NEXT:    ll $2, 0($1)
576; MIPS32O0-NEXT:    xor $3, $2, $4
577; MIPS32O0-NEXT:    sc $3, 0($1)
578; MIPS32O0-NEXT:    beqz $3, $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 $1, %got(x)($1)
623; MIPS32R6O0-NEXT:  $BB2_1: # %entry
624; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
625; MIPS32R6O0-NEXT:    ll $2, 0($1)
626; MIPS32R6O0-NEXT:    xor $3, $2, $4
627; MIPS32R6O0-NEXT:    sc $3, 0($1)
628; MIPS32R6O0-NEXT:    beqzc $3, $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 $1, %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($1)
710; MIPS64R6O0-NEXT:    xor $3, $2, $4
711; MIPS64R6O0-NEXT:    sc $3, 0($1)
712; MIPS64R6O0-NEXT:    beqzc $3, .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 $1, %got(x)($1)
828; MIPS32O0-NEXT:  $BB3_1: # %entry
829; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
830; MIPS32O0-NEXT:    ll $2, 0($1)
831; MIPS32O0-NEXT:    or $3, $2, $4
832; MIPS32O0-NEXT:    sc $3, 0($1)
833; MIPS32O0-NEXT:    beqz $3, $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 $1, %got(x)($1)
878; MIPS32R6O0-NEXT:  $BB3_1: # %entry
879; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
880; MIPS32R6O0-NEXT:    ll $2, 0($1)
881; MIPS32R6O0-NEXT:    or $3, $2, $4
882; MIPS32R6O0-NEXT:    sc $3, 0($1)
883; MIPS32R6O0-NEXT:    beqzc $3, $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 $1, %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($1)
965; MIPS64R6O0-NEXT:    or $3, $2, $4
966; MIPS64R6O0-NEXT:    sc $3, 0($1)
967; MIPS64R6O0-NEXT:    beqzc $3, .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 $1, %got(x)($1)
1083; MIPS32O0-NEXT:  $BB4_1: # %entry
1084; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1085; MIPS32O0-NEXT:    ll $2, 0($1)
1086; MIPS32O0-NEXT:    and $3, $2, $4
1087; MIPS32O0-NEXT:    sc $3, 0($1)
1088; MIPS32O0-NEXT:    beqz $3, $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 $1, %got(x)($1)
1133; MIPS32R6O0-NEXT:  $BB4_1: # %entry
1134; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1135; MIPS32R6O0-NEXT:    ll $2, 0($1)
1136; MIPS32R6O0-NEXT:    and $3, $2, $4
1137; MIPS32R6O0-NEXT:    sc $3, 0($1)
1138; MIPS32R6O0-NEXT:    beqzc $3, $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 $1, %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($1)
1220; MIPS64R6O0-NEXT:    and $3, $2, $4
1221; MIPS64R6O0-NEXT:    sc $3, 0($1)
1222; MIPS64R6O0-NEXT:    beqzc $3, .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 $1, %got(x)($1)
1339; MIPS32O0-NEXT:  $BB5_1: # %entry
1340; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1341; MIPS32O0-NEXT:    ll $2, 0($1)
1342; MIPS32O0-NEXT:    and $3, $2, $4
1343; MIPS32O0-NEXT:    nor $3, $zero, $3
1344; MIPS32O0-NEXT:    sc $3, 0($1)
1345; MIPS32O0-NEXT:    beqz $3, $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 $1, %got(x)($1)
1392; MIPS32R6O0-NEXT:  $BB5_1: # %entry
1393; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1394; MIPS32R6O0-NEXT:    ll $2, 0($1)
1395; MIPS32R6O0-NEXT:    and $3, $2, $4
1396; MIPS32R6O0-NEXT:    nor $3, $zero, $3
1397; MIPS32R6O0-NEXT:    sc $3, 0($1)
1398; MIPS32R6O0-NEXT:    beqzc $3, $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 $1, %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($1)
1484; MIPS64R6O0-NEXT:    and $3, $2, $4
1485; MIPS64R6O0-NEXT:    nor $3, $zero, $3
1486; MIPS64R6O0-NEXT:    sc $3, 0($1)
1487; MIPS64R6O0-NEXT:    beqzc $3, .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 $2, 4($sp)
1613; MIPS32O0-NEXT:    lw $1, %got(x)($1)
1614; MIPS32O0-NEXT:  $BB6_1: # %entry
1615; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1616; MIPS32O0-NEXT:    ll $3, 0($1)
1617; MIPS32O0-NEXT:    move $4, $2
1618; MIPS32O0-NEXT:    sc $4, 0($1)
1619; MIPS32O0-NEXT:    beqz $4, $BB6_1
1620; MIPS32O0-NEXT:    nop
1621; MIPS32O0-NEXT:  # %bb.2: # %entry
1622; MIPS32O0-NEXT:    move $2, $3
1623; MIPS32O0-NEXT:    addiu $sp, $sp, 8
1624; MIPS32O0-NEXT:    jr $ra
1625; MIPS32O0-NEXT:    nop
1626;
1627; MIPS32R2-LABEL: AtomicSwap32:
1628; MIPS32R2:       # %bb.0: # %entry
1629; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1630; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1631; MIPS32R2-NEXT:    addiu $sp, $sp, -8
1632; MIPS32R2-NEXT:    addu $1, $2, $25
1633; MIPS32R2-NEXT:    sw $4, 4($sp)
1634; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1635; MIPS32R2-NEXT:  $BB6_1: # %entry
1636; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1637; MIPS32R2-NEXT:    ll $2, 0($1)
1638; MIPS32R2-NEXT:    move $3, $4
1639; MIPS32R2-NEXT:    sc $3, 0($1)
1640; MIPS32R2-NEXT:    beqz $3, $BB6_1
1641; MIPS32R2-NEXT:    nop
1642; MIPS32R2-NEXT:  # %bb.2: # %entry
1643; MIPS32R2-NEXT:    jr $ra
1644; MIPS32R2-NEXT:    addiu $sp, $sp, 8
1645;
1646; MIPS32R6-LABEL: AtomicSwap32:
1647; MIPS32R6:       # %bb.0: # %entry
1648; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1649; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1650; MIPS32R6-NEXT:    addiu $sp, $sp, -8
1651; MIPS32R6-NEXT:    addu $1, $2, $25
1652; MIPS32R6-NEXT:    sw $4, 4($sp)
1653; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1654; MIPS32R6-NEXT:  $BB6_1: # %entry
1655; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1656; MIPS32R6-NEXT:    ll $2, 0($1)
1657; MIPS32R6-NEXT:    move $3, $4
1658; MIPS32R6-NEXT:    sc $3, 0($1)
1659; MIPS32R6-NEXT:    beqzc $3, $BB6_1
1660; MIPS32R6-NEXT:    nop
1661; MIPS32R6-NEXT:  # %bb.2: # %entry
1662; MIPS32R6-NEXT:    jr $ra
1663; MIPS32R6-NEXT:    addiu $sp, $sp, 8
1664;
1665; MIPS32R6O0-LABEL: AtomicSwap32:
1666; MIPS32R6O0:       # %bb.0: # %entry
1667; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1668; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1669; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
1670; MIPS32R6O0-NEXT:    addu $1, $2, $25
1671; MIPS32R6O0-NEXT:    sw $4, 4($sp)
1672; MIPS32R6O0-NEXT:    lw $2, 4($sp)
1673; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
1674; MIPS32R6O0-NEXT:  $BB6_1: # %entry
1675; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1676; MIPS32R6O0-NEXT:    ll $3, 0($1)
1677; MIPS32R6O0-NEXT:    move $4, $2
1678; MIPS32R6O0-NEXT:    sc $4, 0($1)
1679; MIPS32R6O0-NEXT:    beqzc $4, $BB6_1
1680; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1681; MIPS32R6O0-NEXT:    move $2, $3
1682; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
1683; MIPS32R6O0-NEXT:    jrc $ra
1684;
1685; MIPS4-LABEL: AtomicSwap32:
1686; MIPS4:       # %bb.0: # %entry
1687; MIPS4-NEXT:    daddiu $sp, $sp, -16
1688; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1689; MIPS4-NEXT:    daddu $1, $1, $25
1690; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1691; MIPS4-NEXT:    sw $4, 12($sp)
1692; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1693; MIPS4-NEXT:  .LBB6_1: # %entry
1694; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1695; MIPS4-NEXT:    ll $2, 0($1)
1696; MIPS4-NEXT:    move $3, $4
1697; MIPS4-NEXT:    sc $3, 0($1)
1698; MIPS4-NEXT:    beqz $3, .LBB6_1
1699; MIPS4-NEXT:    nop
1700; MIPS4-NEXT:  # %bb.2: # %entry
1701; MIPS4-NEXT:    jr $ra
1702; MIPS4-NEXT:    daddiu $sp, $sp, 16
1703;
1704; MIPS64-LABEL: AtomicSwap32:
1705; MIPS64:       # %bb.0: # %entry
1706; MIPS64-NEXT:    daddiu $sp, $sp, -16
1707; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1708; MIPS64-NEXT:    daddu $1, $1, $25
1709; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1710; MIPS64-NEXT:    sw $4, 12($sp)
1711; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1712; MIPS64-NEXT:  .LBB6_1: # %entry
1713; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1714; MIPS64-NEXT:    ll $2, 0($1)
1715; MIPS64-NEXT:    move $3, $4
1716; MIPS64-NEXT:    sc $3, 0($1)
1717; MIPS64-NEXT:    beqz $3, .LBB6_1
1718; MIPS64-NEXT:    nop
1719; MIPS64-NEXT:  # %bb.2: # %entry
1720; MIPS64-NEXT:    jr $ra
1721; MIPS64-NEXT:    daddiu $sp, $sp, 16
1722;
1723; MIPS64R2-LABEL: AtomicSwap32:
1724; MIPS64R2:       # %bb.0: # %entry
1725; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
1726; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1727; MIPS64R2-NEXT:    daddu $1, $1, $25
1728; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1729; MIPS64R2-NEXT:    sw $4, 12($sp)
1730; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1731; MIPS64R2-NEXT:  .LBB6_1: # %entry
1732; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1733; MIPS64R2-NEXT:    ll $2, 0($1)
1734; MIPS64R2-NEXT:    move $3, $4
1735; MIPS64R2-NEXT:    sc $3, 0($1)
1736; MIPS64R2-NEXT:    beqz $3, .LBB6_1
1737; MIPS64R2-NEXT:    nop
1738; MIPS64R2-NEXT:  # %bb.2: # %entry
1739; MIPS64R2-NEXT:    jr $ra
1740; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
1741;
1742; MIPS64R6-LABEL: AtomicSwap32:
1743; MIPS64R6:       # %bb.0: # %entry
1744; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
1745; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1746; MIPS64R6-NEXT:    daddu $1, $1, $25
1747; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1748; MIPS64R6-NEXT:    sw $4, 12($sp)
1749; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1750; MIPS64R6-NEXT:  .LBB6_1: # %entry
1751; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1752; MIPS64R6-NEXT:    ll $2, 0($1)
1753; MIPS64R6-NEXT:    move $3, $4
1754; MIPS64R6-NEXT:    sc $3, 0($1)
1755; MIPS64R6-NEXT:    beqzc $3, .LBB6_1
1756; MIPS64R6-NEXT:    nop
1757; MIPS64R6-NEXT:  # %bb.2: # %entry
1758; MIPS64R6-NEXT:    jr $ra
1759; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
1760;
1761; MIPS64R6O0-LABEL: AtomicSwap32:
1762; MIPS64R6O0:       # %bb.0: # %entry
1763; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
1764; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap32)))
1765; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1766; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap32)))
1767; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
1768; MIPS64R6O0-NEXT:    sw $4, 12($sp)
1769; MIPS64R6O0-NEXT:    lw $2, 12($sp)
1770; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
1771; MIPS64R6O0-NEXT:  .LBB6_1: # %entry
1772; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1773; MIPS64R6O0-NEXT:    ll $3, 0($1)
1774; MIPS64R6O0-NEXT:    move $4, $2
1775; MIPS64R6O0-NEXT:    sc $4, 0($1)
1776; MIPS64R6O0-NEXT:    beqzc $4, .LBB6_1
1777; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1778; MIPS64R6O0-NEXT:    move $2, $3
1779; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
1780; MIPS64R6O0-NEXT:    jrc $ra
1781;
1782; MM32-LABEL: AtomicSwap32:
1783; MM32:       # %bb.0: # %entry
1784; MM32-NEXT:    lui $2, %hi(_gp_disp)
1785; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1786; MM32-NEXT:    addiu $sp, $sp, -8
1787; MM32-NEXT:    addu $2, $2, $25
1788; MM32-NEXT:    sw $4, 4($sp)
1789; MM32-NEXT:    lw $1, %got(x)($2)
1790; MM32-NEXT:  $BB6_1: # %entry
1791; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
1792; MM32-NEXT:    ll $2, 0($1)
1793; MM32-NEXT:    or $3, $4, $zero
1794; MM32-NEXT:    sc $3, 0($1)
1795; MM32-NEXT:    beqzc $3, $BB6_1
1796; MM32-NEXT:  # %bb.2: # %entry
1797; MM32-NEXT:    addiusp 8
1798; MM32-NEXT:    jrc $ra
1799;
1800; O1-LABEL: AtomicSwap32:
1801; O1:       # %bb.0: # %entry
1802; O1-NEXT:    lui $2, %hi(_gp_disp)
1803; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
1804; O1-NEXT:    addiu $sp, $sp, -8
1805; O1-NEXT:    addu $1, $2, $25
1806; O1-NEXT:    sw $4, 4($sp)
1807; O1-NEXT:    lw $1, %got(x)($1)
1808; O1-NEXT:  $BB6_1: # %entry
1809; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1810; O1-NEXT:    ll $2, 0($1)
1811; O1-NEXT:    move $3, $4
1812; O1-NEXT:    sc $3, 0($1)
1813; O1-NEXT:    beqz $3, $BB6_1
1814; O1-NEXT:    nop
1815; O1-NEXT:  # %bb.2: # %entry
1816; O1-NEXT:    jr $ra
1817; O1-NEXT:    addiu $sp, $sp, 8
1818;
1819; O2-LABEL: AtomicSwap32:
1820; O2:       # %bb.0: # %entry
1821; O2-NEXT:    lui $2, %hi(_gp_disp)
1822; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1823; O2-NEXT:    addiu $sp, $sp, -8
1824; O2-NEXT:    addu $1, $2, $25
1825; O2-NEXT:    sw $4, 4($sp)
1826; O2-NEXT:    lw $1, %got(x)($1)
1827; O2-NEXT:  $BB6_1: # %entry
1828; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1829; O2-NEXT:    ll $2, 0($1)
1830; O2-NEXT:    move $3, $4
1831; O2-NEXT:    sc $3, 0($1)
1832; O2-NEXT:    beqz $3, $BB6_1
1833; O2-NEXT:    nop
1834; O2-NEXT:  # %bb.2: # %entry
1835; O2-NEXT:    jr $ra
1836; O2-NEXT:    addiu $sp, $sp, 8
1837;
1838; O3-LABEL: AtomicSwap32:
1839; O3:       # %bb.0: # %entry
1840; O3-NEXT:    lui $2, %hi(_gp_disp)
1841; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
1842; O3-NEXT:    addiu $sp, $sp, -8
1843; O3-NEXT:    addu $1, $2, $25
1844; O3-NEXT:    sw $4, 4($sp)
1845; O3-NEXT:    lw $1, %got(x)($1)
1846; O3-NEXT:  $BB6_1: # %entry
1847; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1848; O3-NEXT:    ll $2, 0($1)
1849; O3-NEXT:    move $3, $4
1850; O3-NEXT:    sc $3, 0($1)
1851; O3-NEXT:    beqz $3, $BB6_1
1852; O3-NEXT:    nop
1853; O3-NEXT:  # %bb.2: # %entry
1854; O3-NEXT:    jr $ra
1855; O3-NEXT:    addiu $sp, $sp, 8
1856;
1857; MIPS32EB-LABEL: AtomicSwap32:
1858; MIPS32EB:       # %bb.0: # %entry
1859; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
1860; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
1861; MIPS32EB-NEXT:    addiu $sp, $sp, -8
1862; MIPS32EB-NEXT:    addu $1, $2, $25
1863; MIPS32EB-NEXT:    sw $4, 4($sp)
1864; MIPS32EB-NEXT:    lw $1, %got(x)($1)
1865; MIPS32EB-NEXT:  $BB6_1: # %entry
1866; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
1867; MIPS32EB-NEXT:    ll $2, 0($1)
1868; MIPS32EB-NEXT:    move $3, $4
1869; MIPS32EB-NEXT:    sc $3, 0($1)
1870; MIPS32EB-NEXT:    beqz $3, $BB6_1
1871; MIPS32EB-NEXT:    nop
1872; MIPS32EB-NEXT:  # %bb.2: # %entry
1873; MIPS32EB-NEXT:    jr $ra
1874; MIPS32EB-NEXT:    addiu $sp, $sp, 8
1875entry:
1876  %newval.addr = alloca i32, align 4
1877  store i32 %newval, i32* %newval.addr, align 4
1878  %tmp = load i32, i32* %newval.addr, align 4
1879  %0 = atomicrmw xchg i32* @x, i32 %tmp monotonic
1880  ret i32 %0
1881
1882}
1883
1884define i32 @AtomicCmpSwap32(i32 signext %oldval, i32 signext %newval) nounwind {
1885; MIPS32-LABEL: AtomicCmpSwap32:
1886; MIPS32:       # %bb.0: # %entry
1887; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
1888; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
1889; MIPS32-NEXT:    addiu $sp, $sp, -8
1890; MIPS32-NEXT:    addu $1, $2, $25
1891; MIPS32-NEXT:    sw $5, 4($sp)
1892; MIPS32-NEXT:    lw $1, %got(x)($1)
1893; MIPS32-NEXT:  $BB7_1: # %entry
1894; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
1895; MIPS32-NEXT:    ll $2, 0($1)
1896; MIPS32-NEXT:    bne $2, $4, $BB7_3
1897; MIPS32-NEXT:    nop
1898; MIPS32-NEXT:  # %bb.2: # %entry
1899; MIPS32-NEXT:    # in Loop: Header=BB7_1 Depth=1
1900; MIPS32-NEXT:    move $3, $5
1901; MIPS32-NEXT:    sc $3, 0($1)
1902; MIPS32-NEXT:    beqz $3, $BB7_1
1903; MIPS32-NEXT:    nop
1904; MIPS32-NEXT:  $BB7_3: # %entry
1905; MIPS32-NEXT:    jr $ra
1906; MIPS32-NEXT:    addiu $sp, $sp, 8
1907;
1908; MIPS32O0-LABEL: AtomicCmpSwap32:
1909; MIPS32O0:       # %bb.0: # %entry
1910; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
1911; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1912; MIPS32O0-NEXT:    addiu $sp, $sp, -8
1913; MIPS32O0-NEXT:    addu $1, $2, $25
1914; MIPS32O0-NEXT:    sw $5, 4($sp)
1915; MIPS32O0-NEXT:    lw $2, 4($sp)
1916; MIPS32O0-NEXT:    lw $1, %got(x)($1)
1917; MIPS32O0-NEXT:    move $3, $4
1918; MIPS32O0-NEXT:  $BB7_1: # %entry
1919; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
1920; MIPS32O0-NEXT:    ll $5, 0($1)
1921; MIPS32O0-NEXT:    bne $5, $3, $BB7_3
1922; MIPS32O0-NEXT:    nop
1923; MIPS32O0-NEXT:  # %bb.2: # %entry
1924; MIPS32O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
1925; MIPS32O0-NEXT:    move $6, $2
1926; MIPS32O0-NEXT:    sc $6, 0($1)
1927; MIPS32O0-NEXT:    beqz $6, $BB7_1
1928; MIPS32O0-NEXT:    nop
1929; MIPS32O0-NEXT:  $BB7_3: # %entry
1930; MIPS32O0-NEXT:    xor $1, $5, $4
1931; MIPS32O0-NEXT:    sltiu $1, $1, 1
1932; MIPS32O0-NEXT:    move $2, $5
1933; MIPS32O0-NEXT:    addiu $sp, $sp, 8
1934; MIPS32O0-NEXT:    jr $ra
1935; MIPS32O0-NEXT:    nop
1936;
1937; MIPS32R2-LABEL: AtomicCmpSwap32:
1938; MIPS32R2:       # %bb.0: # %entry
1939; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
1940; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
1941; MIPS32R2-NEXT:    addiu $sp, $sp, -8
1942; MIPS32R2-NEXT:    addu $1, $2, $25
1943; MIPS32R2-NEXT:    sw $5, 4($sp)
1944; MIPS32R2-NEXT:    lw $1, %got(x)($1)
1945; MIPS32R2-NEXT:  $BB7_1: # %entry
1946; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
1947; MIPS32R2-NEXT:    ll $2, 0($1)
1948; MIPS32R2-NEXT:    bne $2, $4, $BB7_3
1949; MIPS32R2-NEXT:    nop
1950; MIPS32R2-NEXT:  # %bb.2: # %entry
1951; MIPS32R2-NEXT:    # in Loop: Header=BB7_1 Depth=1
1952; MIPS32R2-NEXT:    move $3, $5
1953; MIPS32R2-NEXT:    sc $3, 0($1)
1954; MIPS32R2-NEXT:    beqz $3, $BB7_1
1955; MIPS32R2-NEXT:    nop
1956; MIPS32R2-NEXT:  $BB7_3: # %entry
1957; MIPS32R2-NEXT:    jr $ra
1958; MIPS32R2-NEXT:    addiu $sp, $sp, 8
1959;
1960; MIPS32R6-LABEL: AtomicCmpSwap32:
1961; MIPS32R6:       # %bb.0: # %entry
1962; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
1963; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
1964; MIPS32R6-NEXT:    addiu $sp, $sp, -8
1965; MIPS32R6-NEXT:    addu $1, $2, $25
1966; MIPS32R6-NEXT:    sw $5, 4($sp)
1967; MIPS32R6-NEXT:    lw $1, %got(x)($1)
1968; MIPS32R6-NEXT:  $BB7_1: # %entry
1969; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
1970; MIPS32R6-NEXT:    ll $2, 0($1)
1971; MIPS32R6-NEXT:    bnec $2, $4, $BB7_3
1972; MIPS32R6-NEXT:  # %bb.2: # %entry
1973; MIPS32R6-NEXT:    # in Loop: Header=BB7_1 Depth=1
1974; MIPS32R6-NEXT:    move $3, $5
1975; MIPS32R6-NEXT:    sc $3, 0($1)
1976; MIPS32R6-NEXT:    beqzc $3, $BB7_1
1977; MIPS32R6-NEXT:    nop
1978; MIPS32R6-NEXT:  $BB7_3: # %entry
1979; MIPS32R6-NEXT:    jr $ra
1980; MIPS32R6-NEXT:    addiu $sp, $sp, 8
1981;
1982; MIPS32R6O0-LABEL: AtomicCmpSwap32:
1983; MIPS32R6O0:       # %bb.0: # %entry
1984; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
1985; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
1986; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
1987; MIPS32R6O0-NEXT:    addu $1, $2, $25
1988; MIPS32R6O0-NEXT:    sw $5, 4($sp)
1989; MIPS32R6O0-NEXT:    lw $2, 4($sp)
1990; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
1991; MIPS32R6O0-NEXT:  $BB7_1: # %entry
1992; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1993; MIPS32R6O0-NEXT:    ll $3, 0($1)
1994; MIPS32R6O0-NEXT:    bnec $3, $4, $BB7_3
1995; MIPS32R6O0-NEXT:  # %bb.2: # %entry
1996; MIPS32R6O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
1997; MIPS32R6O0-NEXT:    move $5, $2
1998; MIPS32R6O0-NEXT:    sc $5, 0($1)
1999; MIPS32R6O0-NEXT:    beqzc $5, $BB7_1
2000; MIPS32R6O0-NEXT:  $BB7_3: # %entry
2001; MIPS32R6O0-NEXT:    move $2, $3
2002; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
2003; MIPS32R6O0-NEXT:    jrc $ra
2004;
2005; MIPS4-LABEL: AtomicCmpSwap32:
2006; MIPS4:       # %bb.0: # %entry
2007; MIPS4-NEXT:    daddiu $sp, $sp, -16
2008; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2009; MIPS4-NEXT:    daddu $1, $1, $25
2010; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2011; MIPS4-NEXT:    sw $5, 12($sp)
2012; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
2013; MIPS4-NEXT:  .LBB7_1: # %entry
2014; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2015; MIPS4-NEXT:    ll $2, 0($1)
2016; MIPS4-NEXT:    bne $2, $4, .LBB7_3
2017; MIPS4-NEXT:    nop
2018; MIPS4-NEXT:  # %bb.2: # %entry
2019; MIPS4-NEXT:    # in Loop: Header=BB7_1 Depth=1
2020; MIPS4-NEXT:    move $3, $5
2021; MIPS4-NEXT:    sc $3, 0($1)
2022; MIPS4-NEXT:    beqz $3, .LBB7_1
2023; MIPS4-NEXT:    nop
2024; MIPS4-NEXT:  .LBB7_3: # %entry
2025; MIPS4-NEXT:    jr $ra
2026; MIPS4-NEXT:    daddiu $sp, $sp, 16
2027;
2028; MIPS64-LABEL: AtomicCmpSwap32:
2029; MIPS64:       # %bb.0: # %entry
2030; MIPS64-NEXT:    daddiu $sp, $sp, -16
2031; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2032; MIPS64-NEXT:    daddu $1, $1, $25
2033; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2034; MIPS64-NEXT:    sw $5, 12($sp)
2035; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
2036; MIPS64-NEXT:  .LBB7_1: # %entry
2037; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2038; MIPS64-NEXT:    ll $2, 0($1)
2039; MIPS64-NEXT:    bne $2, $4, .LBB7_3
2040; MIPS64-NEXT:    nop
2041; MIPS64-NEXT:  # %bb.2: # %entry
2042; MIPS64-NEXT:    # in Loop: Header=BB7_1 Depth=1
2043; MIPS64-NEXT:    move $3, $5
2044; MIPS64-NEXT:    sc $3, 0($1)
2045; MIPS64-NEXT:    beqz $3, .LBB7_1
2046; MIPS64-NEXT:    nop
2047; MIPS64-NEXT:  .LBB7_3: # %entry
2048; MIPS64-NEXT:    jr $ra
2049; MIPS64-NEXT:    daddiu $sp, $sp, 16
2050;
2051; MIPS64R2-LABEL: AtomicCmpSwap32:
2052; MIPS64R2:       # %bb.0: # %entry
2053; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
2054; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2055; MIPS64R2-NEXT:    daddu $1, $1, $25
2056; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2057; MIPS64R2-NEXT:    sw $5, 12($sp)
2058; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
2059; MIPS64R2-NEXT:  .LBB7_1: # %entry
2060; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
2061; MIPS64R2-NEXT:    ll $2, 0($1)
2062; MIPS64R2-NEXT:    bne $2, $4, .LBB7_3
2063; MIPS64R2-NEXT:    nop
2064; MIPS64R2-NEXT:  # %bb.2: # %entry
2065; MIPS64R2-NEXT:    # in Loop: Header=BB7_1 Depth=1
2066; MIPS64R2-NEXT:    move $3, $5
2067; MIPS64R2-NEXT:    sc $3, 0($1)
2068; MIPS64R2-NEXT:    beqz $3, .LBB7_1
2069; MIPS64R2-NEXT:    nop
2070; MIPS64R2-NEXT:  .LBB7_3: # %entry
2071; MIPS64R2-NEXT:    jr $ra
2072; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
2073;
2074; MIPS64R6-LABEL: AtomicCmpSwap32:
2075; MIPS64R6:       # %bb.0: # %entry
2076; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
2077; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2078; MIPS64R6-NEXT:    daddu $1, $1, $25
2079; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2080; MIPS64R6-NEXT:    sw $5, 12($sp)
2081; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
2082; MIPS64R6-NEXT:  .LBB7_1: # %entry
2083; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
2084; MIPS64R6-NEXT:    ll $2, 0($1)
2085; MIPS64R6-NEXT:    bnec $2, $4, .LBB7_3
2086; MIPS64R6-NEXT:  # %bb.2: # %entry
2087; MIPS64R6-NEXT:    # in Loop: Header=BB7_1 Depth=1
2088; MIPS64R6-NEXT:    move $3, $5
2089; MIPS64R6-NEXT:    sc $3, 0($1)
2090; MIPS64R6-NEXT:    beqzc $3, .LBB7_1
2091; MIPS64R6-NEXT:    nop
2092; MIPS64R6-NEXT:  .LBB7_3: # %entry
2093; MIPS64R6-NEXT:    jr $ra
2094; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
2095;
2096; MIPS64R6O0-LABEL: AtomicCmpSwap32:
2097; MIPS64R6O0:       # %bb.0: # %entry
2098; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
2099; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap32)))
2100; MIPS64R6O0-NEXT:    daddu $1, $1, $25
2101; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap32)))
2102; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
2103; MIPS64R6O0-NEXT:    # kill: def $a1 killed $a1 killed $a1_64
2104; MIPS64R6O0-NEXT:    sw $5, 12($sp)
2105; MIPS64R6O0-NEXT:    lw $2, 12($sp)
2106; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
2107; MIPS64R6O0-NEXT:  .LBB7_1: # %entry
2108; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2109; MIPS64R6O0-NEXT:    ll $3, 0($1)
2110; MIPS64R6O0-NEXT:    bnec $3, $4, .LBB7_3
2111; MIPS64R6O0-NEXT:  # %bb.2: # %entry
2112; MIPS64R6O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
2113; MIPS64R6O0-NEXT:    move $5, $2
2114; MIPS64R6O0-NEXT:    sc $5, 0($1)
2115; MIPS64R6O0-NEXT:    beqzc $5, .LBB7_1
2116; MIPS64R6O0-NEXT:  .LBB7_3: # %entry
2117; MIPS64R6O0-NEXT:    move $2, $3
2118; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
2119; MIPS64R6O0-NEXT:    jrc $ra
2120;
2121; MM32-LABEL: AtomicCmpSwap32:
2122; MM32:       # %bb.0: # %entry
2123; MM32-NEXT:    lui $2, %hi(_gp_disp)
2124; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2125; MM32-NEXT:    addiu $sp, $sp, -8
2126; MM32-NEXT:    addu $2, $2, $25
2127; MM32-NEXT:    sw $5, 4($sp)
2128; MM32-NEXT:    lw $1, %got(x)($2)
2129; MM32-NEXT:  $BB7_1: # %entry
2130; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
2131; MM32-NEXT:    ll $2, 0($1)
2132; MM32-NEXT:    bne $2, $4, $BB7_3
2133; MM32-NEXT:    nop
2134; MM32-NEXT:  # %bb.2: # %entry
2135; MM32-NEXT:    # in Loop: Header=BB7_1 Depth=1
2136; MM32-NEXT:    move $3, $5
2137; MM32-NEXT:    sc $3, 0($1)
2138; MM32-NEXT:    beqzc $3, $BB7_1
2139; MM32-NEXT:  $BB7_3: # %entry
2140; MM32-NEXT:    addiusp 8
2141; MM32-NEXT:    jrc $ra
2142;
2143; O1-LABEL: AtomicCmpSwap32:
2144; O1:       # %bb.0: # %entry
2145; O1-NEXT:    lui $2, %hi(_gp_disp)
2146; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
2147; O1-NEXT:    addiu $sp, $sp, -8
2148; O1-NEXT:    addu $1, $2, $25
2149; O1-NEXT:    sw $5, 4($sp)
2150; O1-NEXT:    lw $1, %got(x)($1)
2151; O1-NEXT:  $BB7_1: # %entry
2152; O1-NEXT:    # =>This Inner Loop Header: Depth=1
2153; O1-NEXT:    ll $2, 0($1)
2154; O1-NEXT:    bne $2, $4, $BB7_3
2155; O1-NEXT:    nop
2156; O1-NEXT:  # %bb.2: # %entry
2157; O1-NEXT:    # in Loop: Header=BB7_1 Depth=1
2158; O1-NEXT:    move $3, $5
2159; O1-NEXT:    sc $3, 0($1)
2160; O1-NEXT:    beqz $3, $BB7_1
2161; O1-NEXT:    nop
2162; O1-NEXT:  $BB7_3: # %entry
2163; O1-NEXT:    jr $ra
2164; O1-NEXT:    addiu $sp, $sp, 8
2165;
2166; O2-LABEL: AtomicCmpSwap32:
2167; O2:       # %bb.0: # %entry
2168; O2-NEXT:    lui $2, %hi(_gp_disp)
2169; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2170; O2-NEXT:    addiu $sp, $sp, -8
2171; O2-NEXT:    addu $1, $2, $25
2172; O2-NEXT:    sw $5, 4($sp)
2173; O2-NEXT:    lw $1, %got(x)($1)
2174; O2-NEXT:  $BB7_1: # %entry
2175; O2-NEXT:    # =>This Inner Loop Header: Depth=1
2176; O2-NEXT:    ll $2, 0($1)
2177; O2-NEXT:    bne $2, $4, $BB7_3
2178; O2-NEXT:    nop
2179; O2-NEXT:  # %bb.2: # %entry
2180; O2-NEXT:    # in Loop: Header=BB7_1 Depth=1
2181; O2-NEXT:    move $3, $5
2182; O2-NEXT:    sc $3, 0($1)
2183; O2-NEXT:    beqz $3, $BB7_1
2184; O2-NEXT:    nop
2185; O2-NEXT:  $BB7_3: # %entry
2186; O2-NEXT:    jr $ra
2187; O2-NEXT:    addiu $sp, $sp, 8
2188;
2189; O3-LABEL: AtomicCmpSwap32:
2190; O3:       # %bb.0: # %entry
2191; O3-NEXT:    lui $2, %hi(_gp_disp)
2192; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
2193; O3-NEXT:    addiu $sp, $sp, -8
2194; O3-NEXT:    addu $1, $2, $25
2195; O3-NEXT:    sw $5, 4($sp)
2196; O3-NEXT:    lw $1, %got(x)($1)
2197; O3-NEXT:  $BB7_1: # %entry
2198; O3-NEXT:    # =>This Inner Loop Header: Depth=1
2199; O3-NEXT:    ll $2, 0($1)
2200; O3-NEXT:    bne $2, $4, $BB7_3
2201; O3-NEXT:    nop
2202; O3-NEXT:  # %bb.2: # %entry
2203; O3-NEXT:    # in Loop: Header=BB7_1 Depth=1
2204; O3-NEXT:    move $3, $5
2205; O3-NEXT:    sc $3, 0($1)
2206; O3-NEXT:    beqz $3, $BB7_1
2207; O3-NEXT:    nop
2208; O3-NEXT:  $BB7_3: # %entry
2209; O3-NEXT:    jr $ra
2210; O3-NEXT:    addiu $sp, $sp, 8
2211;
2212; MIPS32EB-LABEL: AtomicCmpSwap32:
2213; MIPS32EB:       # %bb.0: # %entry
2214; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
2215; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
2216; MIPS32EB-NEXT:    addiu $sp, $sp, -8
2217; MIPS32EB-NEXT:    addu $1, $2, $25
2218; MIPS32EB-NEXT:    sw $5, 4($sp)
2219; MIPS32EB-NEXT:    lw $1, %got(x)($1)
2220; MIPS32EB-NEXT:  $BB7_1: # %entry
2221; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
2222; MIPS32EB-NEXT:    ll $2, 0($1)
2223; MIPS32EB-NEXT:    bne $2, $4, $BB7_3
2224; MIPS32EB-NEXT:    nop
2225; MIPS32EB-NEXT:  # %bb.2: # %entry
2226; MIPS32EB-NEXT:    # in Loop: Header=BB7_1 Depth=1
2227; MIPS32EB-NEXT:    move $3, $5
2228; MIPS32EB-NEXT:    sc $3, 0($1)
2229; MIPS32EB-NEXT:    beqz $3, $BB7_1
2230; MIPS32EB-NEXT:    nop
2231; MIPS32EB-NEXT:  $BB7_3: # %entry
2232; MIPS32EB-NEXT:    jr $ra
2233; MIPS32EB-NEXT:    addiu $sp, $sp, 8
2234entry:
2235  %newval.addr = alloca i32, align 4
2236  store i32 %newval, i32* %newval.addr, align 4
2237  %tmp = load i32, i32* %newval.addr, align 4
2238  %0 = cmpxchg i32* @x, i32 %oldval, i32 %tmp monotonic monotonic
2239  %1 = extractvalue { i32, i1 } %0, 0
2240  ret i32 %1
2241
2242}
2243
2244@y = common global i8 0, align 1
2245
2246define signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind {
2247; MIPS32-LABEL: AtomicLoadAdd8:
2248; MIPS32:       # %bb.0: # %entry
2249; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
2250; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2251; MIPS32-NEXT:    addu $1, $2, $25
2252; MIPS32-NEXT:    lw $1, %got(y)($1)
2253; MIPS32-NEXT:    addiu $2, $zero, -4
2254; MIPS32-NEXT:    and $2, $1, $2
2255; MIPS32-NEXT:    andi $1, $1, 3
2256; MIPS32-NEXT:    sll $3, $1, 3
2257; MIPS32-NEXT:    ori $1, $zero, 255
2258; MIPS32-NEXT:    sllv $5, $1, $3
2259; MIPS32-NEXT:    nor $6, $zero, $5
2260; MIPS32-NEXT:    sllv $4, $4, $3
2261; MIPS32-NEXT:  $BB8_1: # %entry
2262; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
2263; MIPS32-NEXT:    ll $7, 0($2)
2264; MIPS32-NEXT:    addu $8, $7, $4
2265; MIPS32-NEXT:    and $8, $8, $5
2266; MIPS32-NEXT:    and $9, $7, $6
2267; MIPS32-NEXT:    or $9, $9, $8
2268; MIPS32-NEXT:    sc $9, 0($2)
2269; MIPS32-NEXT:    beqz $9, $BB8_1
2270; MIPS32-NEXT:    nop
2271; MIPS32-NEXT:  # %bb.2: # %entry
2272; MIPS32-NEXT:    and $1, $7, $5
2273; MIPS32-NEXT:    srlv $1, $1, $3
2274; MIPS32-NEXT:    sll $1, $1, 24
2275; MIPS32-NEXT:    sra $1, $1, 24
2276; MIPS32-NEXT:  # %bb.3: # %entry
2277; MIPS32-NEXT:    sll $1, $1, 24
2278; MIPS32-NEXT:    jr $ra
2279; MIPS32-NEXT:    sra $2, $1, 24
2280;
2281; MIPS32O0-LABEL: AtomicLoadAdd8:
2282; MIPS32O0:       # %bb.0: # %entry
2283; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
2284; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2285; MIPS32O0-NEXT:    addiu $sp, $sp, -8
2286; MIPS32O0-NEXT:    addu $1, $2, $25
2287; MIPS32O0-NEXT:    lw $1, %got(y)($1)
2288; MIPS32O0-NEXT:    addiu $2, $zero, -4
2289; MIPS32O0-NEXT:    and $2, $1, $2
2290; MIPS32O0-NEXT:    andi $1, $1, 3
2291; MIPS32O0-NEXT:    sll $1, $1, 3
2292; MIPS32O0-NEXT:    ori $3, $zero, 255
2293; MIPS32O0-NEXT:    sllv $3, $3, $1
2294; MIPS32O0-NEXT:    nor $5, $zero, $3
2295; MIPS32O0-NEXT:    sllv $4, $4, $1
2296; MIPS32O0-NEXT:  $BB8_1: # %entry
2297; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
2298; MIPS32O0-NEXT:    ll $7, 0($2)
2299; MIPS32O0-NEXT:    addu $8, $7, $4
2300; MIPS32O0-NEXT:    and $8, $8, $3
2301; MIPS32O0-NEXT:    and $9, $7, $5
2302; MIPS32O0-NEXT:    or $9, $9, $8
2303; MIPS32O0-NEXT:    sc $9, 0($2)
2304; MIPS32O0-NEXT:    beqz $9, $BB8_1
2305; MIPS32O0-NEXT:    nop
2306; MIPS32O0-NEXT:  # %bb.2: # %entry
2307; MIPS32O0-NEXT:    and $6, $7, $3
2308; MIPS32O0-NEXT:    srlv $6, $6, $1
2309; MIPS32O0-NEXT:    sll $6, $6, 24
2310; MIPS32O0-NEXT:    sra $6, $6, 24
2311; MIPS32O0-NEXT:  # %bb.3: # %entry
2312; MIPS32O0-NEXT:    sw $6, 4($sp) # 4-byte Folded Spill
2313; MIPS32O0-NEXT:  # %bb.4: # %entry
2314; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2315; MIPS32O0-NEXT:    sll $2, $1, 24
2316; MIPS32O0-NEXT:    sra $2, $2, 24
2317; MIPS32O0-NEXT:    addiu $sp, $sp, 8
2318; MIPS32O0-NEXT:    jr $ra
2319; MIPS32O0-NEXT:    nop
2320;
2321; MIPS32R2-LABEL: AtomicLoadAdd8:
2322; MIPS32R2:       # %bb.0: # %entry
2323; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
2324; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2325; MIPS32R2-NEXT:    addu $1, $2, $25
2326; MIPS32R2-NEXT:    lw $1, %got(y)($1)
2327; MIPS32R2-NEXT:    addiu $2, $zero, -4
2328; MIPS32R2-NEXT:    and $2, $1, $2
2329; MIPS32R2-NEXT:    andi $1, $1, 3
2330; MIPS32R2-NEXT:    sll $3, $1, 3
2331; MIPS32R2-NEXT:    ori $1, $zero, 255
2332; MIPS32R2-NEXT:    sllv $5, $1, $3
2333; MIPS32R2-NEXT:    nor $6, $zero, $5
2334; MIPS32R2-NEXT:    sllv $4, $4, $3
2335; MIPS32R2-NEXT:  $BB8_1: # %entry
2336; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
2337; MIPS32R2-NEXT:    ll $7, 0($2)
2338; MIPS32R2-NEXT:    addu $8, $7, $4
2339; MIPS32R2-NEXT:    and $8, $8, $5
2340; MIPS32R2-NEXT:    and $9, $7, $6
2341; MIPS32R2-NEXT:    or $9, $9, $8
2342; MIPS32R2-NEXT:    sc $9, 0($2)
2343; MIPS32R2-NEXT:    beqz $9, $BB8_1
2344; MIPS32R2-NEXT:    nop
2345; MIPS32R2-NEXT:  # %bb.2: # %entry
2346; MIPS32R2-NEXT:    and $1, $7, $5
2347; MIPS32R2-NEXT:    srlv $1, $1, $3
2348; MIPS32R2-NEXT:    seb $1, $1
2349; MIPS32R2-NEXT:  # %bb.3: # %entry
2350; MIPS32R2-NEXT:    jr $ra
2351; MIPS32R2-NEXT:    seb $2, $1
2352;
2353; MIPS32R6-LABEL: AtomicLoadAdd8:
2354; MIPS32R6:       # %bb.0: # %entry
2355; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
2356; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
2357; MIPS32R6-NEXT:    addu $1, $2, $25
2358; MIPS32R6-NEXT:    lw $1, %got(y)($1)
2359; MIPS32R6-NEXT:    addiu $2, $zero, -4
2360; MIPS32R6-NEXT:    and $2, $1, $2
2361; MIPS32R6-NEXT:    andi $1, $1, 3
2362; MIPS32R6-NEXT:    sll $3, $1, 3
2363; MIPS32R6-NEXT:    ori $1, $zero, 255
2364; MIPS32R6-NEXT:    sllv $5, $1, $3
2365; MIPS32R6-NEXT:    nor $6, $zero, $5
2366; MIPS32R6-NEXT:    sllv $4, $4, $3
2367; MIPS32R6-NEXT:  $BB8_1: # %entry
2368; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
2369; MIPS32R6-NEXT:    ll $7, 0($2)
2370; MIPS32R6-NEXT:    addu $8, $7, $4
2371; MIPS32R6-NEXT:    and $8, $8, $5
2372; MIPS32R6-NEXT:    and $9, $7, $6
2373; MIPS32R6-NEXT:    or $9, $9, $8
2374; MIPS32R6-NEXT:    sc $9, 0($2)
2375; MIPS32R6-NEXT:    beqzc $9, $BB8_1
2376; MIPS32R6-NEXT:  # %bb.2: # %entry
2377; MIPS32R6-NEXT:    and $1, $7, $5
2378; MIPS32R6-NEXT:    srlv $1, $1, $3
2379; MIPS32R6-NEXT:    seb $1, $1
2380; MIPS32R6-NEXT:  # %bb.3: # %entry
2381; MIPS32R6-NEXT:    jr $ra
2382; MIPS32R6-NEXT:    seb $2, $1
2383;
2384; MIPS32R6O0-LABEL: AtomicLoadAdd8:
2385; MIPS32R6O0:       # %bb.0: # %entry
2386; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
2387; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2388; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
2389; MIPS32R6O0-NEXT:    addu $1, $2, $25
2390; MIPS32R6O0-NEXT:    move $2, $4
2391; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
2392; MIPS32R6O0-NEXT:    addiu $3, $zero, -4
2393; MIPS32R6O0-NEXT:    and $3, $1, $3
2394; MIPS32R6O0-NEXT:    andi $1, $1, 3
2395; MIPS32R6O0-NEXT:    sll $1, $1, 3
2396; MIPS32R6O0-NEXT:    ori $5, $zero, 255
2397; MIPS32R6O0-NEXT:    sllv $5, $5, $1
2398; MIPS32R6O0-NEXT:    nor $6, $zero, $5
2399; MIPS32R6O0-NEXT:    sllv $4, $4, $1
2400; MIPS32R6O0-NEXT:  $BB8_1: # %entry
2401; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2402; MIPS32R6O0-NEXT:    ll $8, 0($3)
2403; MIPS32R6O0-NEXT:    addu $9, $8, $4
2404; MIPS32R6O0-NEXT:    and $9, $9, $5
2405; MIPS32R6O0-NEXT:    and $10, $8, $6
2406; MIPS32R6O0-NEXT:    or $10, $10, $9
2407; MIPS32R6O0-NEXT:    sc $10, 0($3)
2408; MIPS32R6O0-NEXT:    beqzc $10, $BB8_1
2409; MIPS32R6O0-NEXT:  # %bb.2: # %entry
2410; MIPS32R6O0-NEXT:    and $7, $8, $5
2411; MIPS32R6O0-NEXT:    srlv $7, $7, $1
2412; MIPS32R6O0-NEXT:    seb $7, $7
2413; MIPS32R6O0-NEXT:  # %bb.3: # %entry
2414; MIPS32R6O0-NEXT:    sw $7, 4($sp) # 4-byte Folded Spill
2415; MIPS32R6O0-NEXT:  # %bb.4: # %entry
2416; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2417; MIPS32R6O0-NEXT:    seb $2, $1
2418; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
2419; MIPS32R6O0-NEXT:    jrc $ra
2420;
2421; MIPS4-LABEL: AtomicLoadAdd8:
2422; MIPS4:       # %bb.0: # %entry
2423; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2424; MIPS4-NEXT:    daddu $1, $1, $25
2425; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2426; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
2427; MIPS4-NEXT:    daddiu $2, $zero, -4
2428; MIPS4-NEXT:    and $2, $1, $2
2429; MIPS4-NEXT:    andi $1, $1, 3
2430; MIPS4-NEXT:    sll $3, $1, 3
2431; MIPS4-NEXT:    ori $1, $zero, 255
2432; MIPS4-NEXT:    sllv $5, $1, $3
2433; MIPS4-NEXT:    nor $6, $zero, $5
2434; MIPS4-NEXT:    sllv $4, $4, $3
2435; MIPS4-NEXT:  .LBB8_1: # %entry
2436; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2437; MIPS4-NEXT:    ll $7, 0($2)
2438; MIPS4-NEXT:    addu $8, $7, $4
2439; MIPS4-NEXT:    and $8, $8, $5
2440; MIPS4-NEXT:    and $9, $7, $6
2441; MIPS4-NEXT:    or $9, $9, $8
2442; MIPS4-NEXT:    sc $9, 0($2)
2443; MIPS4-NEXT:    beqz $9, .LBB8_1
2444; MIPS4-NEXT:    nop
2445; MIPS4-NEXT:  # %bb.2: # %entry
2446; MIPS4-NEXT:    and $1, $7, $5
2447; MIPS4-NEXT:    srlv $1, $1, $3
2448; MIPS4-NEXT:    sll $1, $1, 24
2449; MIPS4-NEXT:    sra $1, $1, 24
2450; MIPS4-NEXT:  # %bb.3: # %entry
2451; MIPS4-NEXT:    sll $1, $1, 24
2452; MIPS4-NEXT:    jr $ra
2453; MIPS4-NEXT:    sra $2, $1, 24
2454;
2455; MIPS64-LABEL: AtomicLoadAdd8:
2456; MIPS64:       # %bb.0: # %entry
2457; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2458; MIPS64-NEXT:    daddu $1, $1, $25
2459; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2460; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
2461; MIPS64-NEXT:    daddiu $2, $zero, -4
2462; MIPS64-NEXT:    and $2, $1, $2
2463; MIPS64-NEXT:    andi $1, $1, 3
2464; MIPS64-NEXT:    sll $3, $1, 3
2465; MIPS64-NEXT:    ori $1, $zero, 255
2466; MIPS64-NEXT:    sllv $5, $1, $3
2467; MIPS64-NEXT:    nor $6, $zero, $5
2468; MIPS64-NEXT:    sllv $4, $4, $3
2469; MIPS64-NEXT:  .LBB8_1: # %entry
2470; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2471; MIPS64-NEXT:    ll $7, 0($2)
2472; MIPS64-NEXT:    addu $8, $7, $4
2473; MIPS64-NEXT:    and $8, $8, $5
2474; MIPS64-NEXT:    and $9, $7, $6
2475; MIPS64-NEXT:    or $9, $9, $8
2476; MIPS64-NEXT:    sc $9, 0($2)
2477; MIPS64-NEXT:    beqz $9, .LBB8_1
2478; MIPS64-NEXT:    nop
2479; MIPS64-NEXT:  # %bb.2: # %entry
2480; MIPS64-NEXT:    and $1, $7, $5
2481; MIPS64-NEXT:    srlv $1, $1, $3
2482; MIPS64-NEXT:    sll $1, $1, 24
2483; MIPS64-NEXT:    sra $1, $1, 24
2484; MIPS64-NEXT:  # %bb.3: # %entry
2485; MIPS64-NEXT:    sll $1, $1, 24
2486; MIPS64-NEXT:    jr $ra
2487; MIPS64-NEXT:    sra $2, $1, 24
2488;
2489; MIPS64R2-LABEL: AtomicLoadAdd8:
2490; MIPS64R2:       # %bb.0: # %entry
2491; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2492; MIPS64R2-NEXT:    daddu $1, $1, $25
2493; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2494; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
2495; MIPS64R2-NEXT:    daddiu $2, $zero, -4
2496; MIPS64R2-NEXT:    and $2, $1, $2
2497; MIPS64R2-NEXT:    andi $1, $1, 3
2498; MIPS64R2-NEXT:    sll $3, $1, 3
2499; MIPS64R2-NEXT:    ori $1, $zero, 255
2500; MIPS64R2-NEXT:    sllv $5, $1, $3
2501; MIPS64R2-NEXT:    nor $6, $zero, $5
2502; MIPS64R2-NEXT:    sllv $4, $4, $3
2503; MIPS64R2-NEXT:  .LBB8_1: # %entry
2504; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
2505; MIPS64R2-NEXT:    ll $7, 0($2)
2506; MIPS64R2-NEXT:    addu $8, $7, $4
2507; MIPS64R2-NEXT:    and $8, $8, $5
2508; MIPS64R2-NEXT:    and $9, $7, $6
2509; MIPS64R2-NEXT:    or $9, $9, $8
2510; MIPS64R2-NEXT:    sc $9, 0($2)
2511; MIPS64R2-NEXT:    beqz $9, .LBB8_1
2512; MIPS64R2-NEXT:    nop
2513; MIPS64R2-NEXT:  # %bb.2: # %entry
2514; MIPS64R2-NEXT:    and $1, $7, $5
2515; MIPS64R2-NEXT:    srlv $1, $1, $3
2516; MIPS64R2-NEXT:    seb $1, $1
2517; MIPS64R2-NEXT:  # %bb.3: # %entry
2518; MIPS64R2-NEXT:    jr $ra
2519; MIPS64R2-NEXT:    seb $2, $1
2520;
2521; MIPS64R6-LABEL: AtomicLoadAdd8:
2522; MIPS64R6:       # %bb.0: # %entry
2523; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2524; MIPS64R6-NEXT:    daddu $1, $1, $25
2525; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2526; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
2527; MIPS64R6-NEXT:    daddiu $2, $zero, -4
2528; MIPS64R6-NEXT:    and $2, $1, $2
2529; MIPS64R6-NEXT:    andi $1, $1, 3
2530; MIPS64R6-NEXT:    sll $3, $1, 3
2531; MIPS64R6-NEXT:    ori $1, $zero, 255
2532; MIPS64R6-NEXT:    sllv $5, $1, $3
2533; MIPS64R6-NEXT:    nor $6, $zero, $5
2534; MIPS64R6-NEXT:    sllv $4, $4, $3
2535; MIPS64R6-NEXT:  .LBB8_1: # %entry
2536; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
2537; MIPS64R6-NEXT:    ll $7, 0($2)
2538; MIPS64R6-NEXT:    addu $8, $7, $4
2539; MIPS64R6-NEXT:    and $8, $8, $5
2540; MIPS64R6-NEXT:    and $9, $7, $6
2541; MIPS64R6-NEXT:    or $9, $9, $8
2542; MIPS64R6-NEXT:    sc $9, 0($2)
2543; MIPS64R6-NEXT:    beqzc $9, .LBB8_1
2544; MIPS64R6-NEXT:  # %bb.2: # %entry
2545; MIPS64R6-NEXT:    and $1, $7, $5
2546; MIPS64R6-NEXT:    srlv $1, $1, $3
2547; MIPS64R6-NEXT:    seb $1, $1
2548; MIPS64R6-NEXT:  # %bb.3: # %entry
2549; MIPS64R6-NEXT:    jr $ra
2550; MIPS64R6-NEXT:    seb $2, $1
2551;
2552; MIPS64R6O0-LABEL: AtomicLoadAdd8:
2553; MIPS64R6O0:       # %bb.0: # %entry
2554; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
2555; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd8)))
2556; MIPS64R6O0-NEXT:    daddu $1, $1, $25
2557; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd8)))
2558; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
2559; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
2560; MIPS64R6O0-NEXT:    daddiu $2, $zero, -4
2561; MIPS64R6O0-NEXT:    and $2, $1, $2
2562; MIPS64R6O0-NEXT:    andi $1, $1, 3
2563; MIPS64R6O0-NEXT:    xori $1, $1, 3
2564; MIPS64R6O0-NEXT:    sll $1, $1, 3
2565; MIPS64R6O0-NEXT:    ori $3, $zero, 255
2566; MIPS64R6O0-NEXT:    sllv $3, $3, $1
2567; MIPS64R6O0-NEXT:    nor $5, $zero, $3
2568; MIPS64R6O0-NEXT:    sllv $4, $4, $1
2569; MIPS64R6O0-NEXT:  .LBB8_1: # %entry
2570; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2571; MIPS64R6O0-NEXT:    ll $7, 0($2)
2572; MIPS64R6O0-NEXT:    addu $8, $7, $4
2573; MIPS64R6O0-NEXT:    and $8, $8, $3
2574; MIPS64R6O0-NEXT:    and $9, $7, $5
2575; MIPS64R6O0-NEXT:    or $9, $9, $8
2576; MIPS64R6O0-NEXT:    sc $9, 0($2)
2577; MIPS64R6O0-NEXT:    beqzc $9, .LBB8_1
2578; MIPS64R6O0-NEXT:  # %bb.2: # %entry
2579; MIPS64R6O0-NEXT:    and $6, $7, $3
2580; MIPS64R6O0-NEXT:    srlv $6, $6, $1
2581; MIPS64R6O0-NEXT:    seb $6, $6
2582; MIPS64R6O0-NEXT:  # %bb.3: # %entry
2583; MIPS64R6O0-NEXT:    sw $6, 12($sp) # 4-byte Folded Spill
2584; MIPS64R6O0-NEXT:  # %bb.4: # %entry
2585; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
2586; MIPS64R6O0-NEXT:    seb $2, $1
2587; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
2588; MIPS64R6O0-NEXT:    jrc $ra
2589;
2590; MM32-LABEL: AtomicLoadAdd8:
2591; MM32:       # %bb.0: # %entry
2592; MM32-NEXT:    lui $2, %hi(_gp_disp)
2593; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2594; MM32-NEXT:    addu $2, $2, $25
2595; MM32-NEXT:    lw $1, %got(y)($2)
2596; MM32-NEXT:    addiu $2, $zero, -4
2597; MM32-NEXT:    and $2, $1, $2
2598; MM32-NEXT:    andi $1, $1, 3
2599; MM32-NEXT:    sll $3, $1, 3
2600; MM32-NEXT:    ori $1, $zero, 255
2601; MM32-NEXT:    sllv $5, $1, $3
2602; MM32-NEXT:    nor $6, $zero, $5
2603; MM32-NEXT:    sllv $4, $4, $3
2604; MM32-NEXT:  $BB8_1: # %entry
2605; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
2606; MM32-NEXT:    ll $7, 0($2)
2607; MM32-NEXT:    addu $8, $7, $4
2608; MM32-NEXT:    and $8, $8, $5
2609; MM32-NEXT:    and $9, $7, $6
2610; MM32-NEXT:    or $9, $9, $8
2611; MM32-NEXT:    sc $9, 0($2)
2612; MM32-NEXT:    beqzc $9, $BB8_1
2613; MM32-NEXT:  # %bb.2: # %entry
2614; MM32-NEXT:    and $1, $7, $5
2615; MM32-NEXT:    srlv $1, $1, $3
2616; MM32-NEXT:    seb $1, $1
2617; MM32-NEXT:  # %bb.3: # %entry
2618; MM32-NEXT:    jr $ra
2619; MM32-NEXT:    seb $2, $1
2620;
2621; O1-LABEL: AtomicLoadAdd8:
2622; O1:       # %bb.0: # %entry
2623; O1-NEXT:    lui $2, %hi(_gp_disp)
2624; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
2625; O1-NEXT:    addu $1, $2, $25
2626; O1-NEXT:    lw $1, %got(y)($1)
2627; O1-NEXT:    addiu $2, $zero, -4
2628; O1-NEXT:    and $2, $1, $2
2629; O1-NEXT:    andi $1, $1, 3
2630; O1-NEXT:    sll $3, $1, 3
2631; O1-NEXT:    ori $1, $zero, 255
2632; O1-NEXT:    sllv $5, $1, $3
2633; O1-NEXT:    nor $6, $zero, $5
2634; O1-NEXT:    sllv $4, $4, $3
2635; O1-NEXT:  $BB8_1: # %entry
2636; O1-NEXT:    # =>This Inner Loop Header: Depth=1
2637; O1-NEXT:    ll $7, 0($2)
2638; O1-NEXT:    addu $8, $7, $4
2639; O1-NEXT:    and $8, $8, $5
2640; O1-NEXT:    and $9, $7, $6
2641; O1-NEXT:    or $9, $9, $8
2642; O1-NEXT:    sc $9, 0($2)
2643; O1-NEXT:    beqz $9, $BB8_1
2644; O1-NEXT:    nop
2645; O1-NEXT:  # %bb.2: # %entry
2646; O1-NEXT:    and $1, $7, $5
2647; O1-NEXT:    srlv $1, $1, $3
2648; O1-NEXT:    sll $1, $1, 24
2649; O1-NEXT:    sra $1, $1, 24
2650; O1-NEXT:  # %bb.3: # %entry
2651; O1-NEXT:    sll $1, $1, 24
2652; O1-NEXT:    jr $ra
2653; O1-NEXT:    sra $2, $1, 24
2654;
2655; O2-LABEL: AtomicLoadAdd8:
2656; O2:       # %bb.0: # %entry
2657; O2-NEXT:    lui $2, %hi(_gp_disp)
2658; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2659; O2-NEXT:    addu $1, $2, $25
2660; O2-NEXT:    lw $1, %got(y)($1)
2661; O2-NEXT:    addiu $2, $zero, -4
2662; O2-NEXT:    and $2, $1, $2
2663; O2-NEXT:    andi $1, $1, 3
2664; O2-NEXT:    sll $3, $1, 3
2665; O2-NEXT:    ori $1, $zero, 255
2666; O2-NEXT:    sllv $5, $1, $3
2667; O2-NEXT:    nor $6, $zero, $5
2668; O2-NEXT:    sllv $4, $4, $3
2669; O2-NEXT:  $BB8_1: # %entry
2670; O2-NEXT:    # =>This Inner Loop Header: Depth=1
2671; O2-NEXT:    ll $7, 0($2)
2672; O2-NEXT:    addu $8, $7, $4
2673; O2-NEXT:    and $8, $8, $5
2674; O2-NEXT:    and $9, $7, $6
2675; O2-NEXT:    or $9, $9, $8
2676; O2-NEXT:    sc $9, 0($2)
2677; O2-NEXT:    beqz $9, $BB8_1
2678; O2-NEXT:    nop
2679; O2-NEXT:  # %bb.2: # %entry
2680; O2-NEXT:    and $1, $7, $5
2681; O2-NEXT:    srlv $1, $1, $3
2682; O2-NEXT:    sll $1, $1, 24
2683; O2-NEXT:    sra $1, $1, 24
2684; O2-NEXT:  # %bb.3: # %entry
2685; O2-NEXT:    sll $1, $1, 24
2686; O2-NEXT:    jr $ra
2687; O2-NEXT:    sra $2, $1, 24
2688;
2689; O3-LABEL: AtomicLoadAdd8:
2690; O3:       # %bb.0: # %entry
2691; O3-NEXT:    lui $2, %hi(_gp_disp)
2692; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
2693; O3-NEXT:    addu $1, $2, $25
2694; O3-NEXT:    addiu $2, $zero, -4
2695; O3-NEXT:    lw $1, %got(y)($1)
2696; O3-NEXT:    and $2, $1, $2
2697; O3-NEXT:    andi $1, $1, 3
2698; O3-NEXT:    sll $3, $1, 3
2699; O3-NEXT:    ori $1, $zero, 255
2700; O3-NEXT:    sllv $5, $1, $3
2701; O3-NEXT:    sllv $4, $4, $3
2702; O3-NEXT:    nor $6, $zero, $5
2703; O3-NEXT:  $BB8_1: # %entry
2704; O3-NEXT:    # =>This Inner Loop Header: Depth=1
2705; O3-NEXT:    ll $7, 0($2)
2706; O3-NEXT:    addu $8, $7, $4
2707; O3-NEXT:    and $8, $8, $5
2708; O3-NEXT:    and $9, $7, $6
2709; O3-NEXT:    or $9, $9, $8
2710; O3-NEXT:    sc $9, 0($2)
2711; O3-NEXT:    beqz $9, $BB8_1
2712; O3-NEXT:    nop
2713; O3-NEXT:  # %bb.2: # %entry
2714; O3-NEXT:    and $1, $7, $5
2715; O3-NEXT:    srlv $1, $1, $3
2716; O3-NEXT:    sll $1, $1, 24
2717; O3-NEXT:    sra $1, $1, 24
2718; O3-NEXT:  # %bb.3: # %entry
2719; O3-NEXT:    sll $1, $1, 24
2720; O3-NEXT:    jr $ra
2721; O3-NEXT:    sra $2, $1, 24
2722;
2723; MIPS32EB-LABEL: AtomicLoadAdd8:
2724; MIPS32EB:       # %bb.0: # %entry
2725; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
2726; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
2727; MIPS32EB-NEXT:    addu $1, $2, $25
2728; MIPS32EB-NEXT:    lw $1, %got(y)($1)
2729; MIPS32EB-NEXT:    addiu $2, $zero, -4
2730; MIPS32EB-NEXT:    and $2, $1, $2
2731; MIPS32EB-NEXT:    andi $1, $1, 3
2732; MIPS32EB-NEXT:    xori $1, $1, 3
2733; MIPS32EB-NEXT:    sll $3, $1, 3
2734; MIPS32EB-NEXT:    ori $1, $zero, 255
2735; MIPS32EB-NEXT:    sllv $5, $1, $3
2736; MIPS32EB-NEXT:    nor $6, $zero, $5
2737; MIPS32EB-NEXT:    sllv $4, $4, $3
2738; MIPS32EB-NEXT:  $BB8_1: # %entry
2739; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
2740; MIPS32EB-NEXT:    ll $7, 0($2)
2741; MIPS32EB-NEXT:    addu $8, $7, $4
2742; MIPS32EB-NEXT:    and $8, $8, $5
2743; MIPS32EB-NEXT:    and $9, $7, $6
2744; MIPS32EB-NEXT:    or $9, $9, $8
2745; MIPS32EB-NEXT:    sc $9, 0($2)
2746; MIPS32EB-NEXT:    beqz $9, $BB8_1
2747; MIPS32EB-NEXT:    nop
2748; MIPS32EB-NEXT:  # %bb.2: # %entry
2749; MIPS32EB-NEXT:    and $1, $7, $5
2750; MIPS32EB-NEXT:    srlv $1, $1, $3
2751; MIPS32EB-NEXT:    sll $1, $1, 24
2752; MIPS32EB-NEXT:    sra $1, $1, 24
2753; MIPS32EB-NEXT:  # %bb.3: # %entry
2754; MIPS32EB-NEXT:    sll $1, $1, 24
2755; MIPS32EB-NEXT:    jr $ra
2756; MIPS32EB-NEXT:    sra $2, $1, 24
2757entry:
2758  %0 = atomicrmw add i8* @y, i8 %incr monotonic
2759  ret i8 %0
2760}
2761
2762define signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind {
2763; MIPS32-LABEL: AtomicLoadSub8:
2764; MIPS32:       # %bb.0: # %entry
2765; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
2766; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
2767; MIPS32-NEXT:    addu $1, $2, $25
2768; MIPS32-NEXT:    lw $1, %got(y)($1)
2769; MIPS32-NEXT:    addiu $2, $zero, -4
2770; MIPS32-NEXT:    and $2, $1, $2
2771; MIPS32-NEXT:    andi $1, $1, 3
2772; MIPS32-NEXT:    sll $3, $1, 3
2773; MIPS32-NEXT:    ori $1, $zero, 255
2774; MIPS32-NEXT:    sllv $5, $1, $3
2775; MIPS32-NEXT:    nor $6, $zero, $5
2776; MIPS32-NEXT:    sllv $4, $4, $3
2777; MIPS32-NEXT:  $BB9_1: # %entry
2778; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
2779; MIPS32-NEXT:    ll $7, 0($2)
2780; MIPS32-NEXT:    subu $8, $7, $4
2781; MIPS32-NEXT:    and $8, $8, $5
2782; MIPS32-NEXT:    and $9, $7, $6
2783; MIPS32-NEXT:    or $9, $9, $8
2784; MIPS32-NEXT:    sc $9, 0($2)
2785; MIPS32-NEXT:    beqz $9, $BB9_1
2786; MIPS32-NEXT:    nop
2787; MIPS32-NEXT:  # %bb.2: # %entry
2788; MIPS32-NEXT:    and $1, $7, $5
2789; MIPS32-NEXT:    srlv $1, $1, $3
2790; MIPS32-NEXT:    sll $1, $1, 24
2791; MIPS32-NEXT:    sra $1, $1, 24
2792; MIPS32-NEXT:  # %bb.3: # %entry
2793; MIPS32-NEXT:    sll $1, $1, 24
2794; MIPS32-NEXT:    jr $ra
2795; MIPS32-NEXT:    sra $2, $1, 24
2796;
2797; MIPS32O0-LABEL: AtomicLoadSub8:
2798; MIPS32O0:       # %bb.0: # %entry
2799; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
2800; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2801; MIPS32O0-NEXT:    addiu $sp, $sp, -8
2802; MIPS32O0-NEXT:    addu $1, $2, $25
2803; MIPS32O0-NEXT:    lw $1, %got(y)($1)
2804; MIPS32O0-NEXT:    addiu $2, $zero, -4
2805; MIPS32O0-NEXT:    and $2, $1, $2
2806; MIPS32O0-NEXT:    andi $1, $1, 3
2807; MIPS32O0-NEXT:    sll $1, $1, 3
2808; MIPS32O0-NEXT:    ori $3, $zero, 255
2809; MIPS32O0-NEXT:    sllv $3, $3, $1
2810; MIPS32O0-NEXT:    nor $5, $zero, $3
2811; MIPS32O0-NEXT:    sllv $4, $4, $1
2812; MIPS32O0-NEXT:  $BB9_1: # %entry
2813; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
2814; MIPS32O0-NEXT:    ll $7, 0($2)
2815; MIPS32O0-NEXT:    subu $8, $7, $4
2816; MIPS32O0-NEXT:    and $8, $8, $3
2817; MIPS32O0-NEXT:    and $9, $7, $5
2818; MIPS32O0-NEXT:    or $9, $9, $8
2819; MIPS32O0-NEXT:    sc $9, 0($2)
2820; MIPS32O0-NEXT:    beqz $9, $BB9_1
2821; MIPS32O0-NEXT:    nop
2822; MIPS32O0-NEXT:  # %bb.2: # %entry
2823; MIPS32O0-NEXT:    and $6, $7, $3
2824; MIPS32O0-NEXT:    srlv $6, $6, $1
2825; MIPS32O0-NEXT:    sll $6, $6, 24
2826; MIPS32O0-NEXT:    sra $6, $6, 24
2827; MIPS32O0-NEXT:  # %bb.3: # %entry
2828; MIPS32O0-NEXT:    sw $6, 4($sp) # 4-byte Folded Spill
2829; MIPS32O0-NEXT:  # %bb.4: # %entry
2830; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2831; MIPS32O0-NEXT:    sll $2, $1, 24
2832; MIPS32O0-NEXT:    sra $2, $2, 24
2833; MIPS32O0-NEXT:    addiu $sp, $sp, 8
2834; MIPS32O0-NEXT:    jr $ra
2835; MIPS32O0-NEXT:    nop
2836;
2837; MIPS32R2-LABEL: AtomicLoadSub8:
2838; MIPS32R2:       # %bb.0: # %entry
2839; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
2840; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
2841; MIPS32R2-NEXT:    addu $1, $2, $25
2842; MIPS32R2-NEXT:    lw $1, %got(y)($1)
2843; MIPS32R2-NEXT:    addiu $2, $zero, -4
2844; MIPS32R2-NEXT:    and $2, $1, $2
2845; MIPS32R2-NEXT:    andi $1, $1, 3
2846; MIPS32R2-NEXT:    sll $3, $1, 3
2847; MIPS32R2-NEXT:    ori $1, $zero, 255
2848; MIPS32R2-NEXT:    sllv $5, $1, $3
2849; MIPS32R2-NEXT:    nor $6, $zero, $5
2850; MIPS32R2-NEXT:    sllv $4, $4, $3
2851; MIPS32R2-NEXT:  $BB9_1: # %entry
2852; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
2853; MIPS32R2-NEXT:    ll $7, 0($2)
2854; MIPS32R2-NEXT:    subu $8, $7, $4
2855; MIPS32R2-NEXT:    and $8, $8, $5
2856; MIPS32R2-NEXT:    and $9, $7, $6
2857; MIPS32R2-NEXT:    or $9, $9, $8
2858; MIPS32R2-NEXT:    sc $9, 0($2)
2859; MIPS32R2-NEXT:    beqz $9, $BB9_1
2860; MIPS32R2-NEXT:    nop
2861; MIPS32R2-NEXT:  # %bb.2: # %entry
2862; MIPS32R2-NEXT:    and $1, $7, $5
2863; MIPS32R2-NEXT:    srlv $1, $1, $3
2864; MIPS32R2-NEXT:    seb $1, $1
2865; MIPS32R2-NEXT:  # %bb.3: # %entry
2866; MIPS32R2-NEXT:    jr $ra
2867; MIPS32R2-NEXT:    seb $2, $1
2868;
2869; MIPS32R6-LABEL: AtomicLoadSub8:
2870; MIPS32R6:       # %bb.0: # %entry
2871; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
2872; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
2873; MIPS32R6-NEXT:    addu $1, $2, $25
2874; MIPS32R6-NEXT:    lw $1, %got(y)($1)
2875; MIPS32R6-NEXT:    addiu $2, $zero, -4
2876; MIPS32R6-NEXT:    and $2, $1, $2
2877; MIPS32R6-NEXT:    andi $1, $1, 3
2878; MIPS32R6-NEXT:    sll $3, $1, 3
2879; MIPS32R6-NEXT:    ori $1, $zero, 255
2880; MIPS32R6-NEXT:    sllv $5, $1, $3
2881; MIPS32R6-NEXT:    nor $6, $zero, $5
2882; MIPS32R6-NEXT:    sllv $4, $4, $3
2883; MIPS32R6-NEXT:  $BB9_1: # %entry
2884; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
2885; MIPS32R6-NEXT:    ll $7, 0($2)
2886; MIPS32R6-NEXT:    subu $8, $7, $4
2887; MIPS32R6-NEXT:    and $8, $8, $5
2888; MIPS32R6-NEXT:    and $9, $7, $6
2889; MIPS32R6-NEXT:    or $9, $9, $8
2890; MIPS32R6-NEXT:    sc $9, 0($2)
2891; MIPS32R6-NEXT:    beqzc $9, $BB9_1
2892; MIPS32R6-NEXT:  # %bb.2: # %entry
2893; MIPS32R6-NEXT:    and $1, $7, $5
2894; MIPS32R6-NEXT:    srlv $1, $1, $3
2895; MIPS32R6-NEXT:    seb $1, $1
2896; MIPS32R6-NEXT:  # %bb.3: # %entry
2897; MIPS32R6-NEXT:    jr $ra
2898; MIPS32R6-NEXT:    seb $2, $1
2899;
2900; MIPS32R6O0-LABEL: AtomicLoadSub8:
2901; MIPS32R6O0:       # %bb.0: # %entry
2902; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
2903; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
2904; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
2905; MIPS32R6O0-NEXT:    addu $1, $2, $25
2906; MIPS32R6O0-NEXT:    move $2, $4
2907; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
2908; MIPS32R6O0-NEXT:    addiu $3, $zero, -4
2909; MIPS32R6O0-NEXT:    and $3, $1, $3
2910; MIPS32R6O0-NEXT:    andi $1, $1, 3
2911; MIPS32R6O0-NEXT:    sll $1, $1, 3
2912; MIPS32R6O0-NEXT:    ori $5, $zero, 255
2913; MIPS32R6O0-NEXT:    sllv $5, $5, $1
2914; MIPS32R6O0-NEXT:    nor $6, $zero, $5
2915; MIPS32R6O0-NEXT:    sllv $4, $4, $1
2916; MIPS32R6O0-NEXT:  $BB9_1: # %entry
2917; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
2918; MIPS32R6O0-NEXT:    ll $8, 0($3)
2919; MIPS32R6O0-NEXT:    subu $9, $8, $4
2920; MIPS32R6O0-NEXT:    and $9, $9, $5
2921; MIPS32R6O0-NEXT:    and $10, $8, $6
2922; MIPS32R6O0-NEXT:    or $10, $10, $9
2923; MIPS32R6O0-NEXT:    sc $10, 0($3)
2924; MIPS32R6O0-NEXT:    beqzc $10, $BB9_1
2925; MIPS32R6O0-NEXT:  # %bb.2: # %entry
2926; MIPS32R6O0-NEXT:    and $7, $8, $5
2927; MIPS32R6O0-NEXT:    srlv $7, $7, $1
2928; MIPS32R6O0-NEXT:    seb $7, $7
2929; MIPS32R6O0-NEXT:  # %bb.3: # %entry
2930; MIPS32R6O0-NEXT:    sw $7, 4($sp) # 4-byte Folded Spill
2931; MIPS32R6O0-NEXT:  # %bb.4: # %entry
2932; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
2933; MIPS32R6O0-NEXT:    seb $2, $1
2934; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
2935; MIPS32R6O0-NEXT:    jrc $ra
2936;
2937; MIPS4-LABEL: AtomicLoadSub8:
2938; MIPS4:       # %bb.0: # %entry
2939; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
2940; MIPS4-NEXT:    daddu $1, $1, $25
2941; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
2942; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
2943; MIPS4-NEXT:    daddiu $2, $zero, -4
2944; MIPS4-NEXT:    and $2, $1, $2
2945; MIPS4-NEXT:    andi $1, $1, 3
2946; MIPS4-NEXT:    sll $3, $1, 3
2947; MIPS4-NEXT:    ori $1, $zero, 255
2948; MIPS4-NEXT:    sllv $5, $1, $3
2949; MIPS4-NEXT:    nor $6, $zero, $5
2950; MIPS4-NEXT:    sllv $4, $4, $3
2951; MIPS4-NEXT:  .LBB9_1: # %entry
2952; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
2953; MIPS4-NEXT:    ll $7, 0($2)
2954; MIPS4-NEXT:    subu $8, $7, $4
2955; MIPS4-NEXT:    and $8, $8, $5
2956; MIPS4-NEXT:    and $9, $7, $6
2957; MIPS4-NEXT:    or $9, $9, $8
2958; MIPS4-NEXT:    sc $9, 0($2)
2959; MIPS4-NEXT:    beqz $9, .LBB9_1
2960; MIPS4-NEXT:    nop
2961; MIPS4-NEXT:  # %bb.2: # %entry
2962; MIPS4-NEXT:    and $1, $7, $5
2963; MIPS4-NEXT:    srlv $1, $1, $3
2964; MIPS4-NEXT:    sll $1, $1, 24
2965; MIPS4-NEXT:    sra $1, $1, 24
2966; MIPS4-NEXT:  # %bb.3: # %entry
2967; MIPS4-NEXT:    sll $1, $1, 24
2968; MIPS4-NEXT:    jr $ra
2969; MIPS4-NEXT:    sra $2, $1, 24
2970;
2971; MIPS64-LABEL: AtomicLoadSub8:
2972; MIPS64:       # %bb.0: # %entry
2973; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
2974; MIPS64-NEXT:    daddu $1, $1, $25
2975; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
2976; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
2977; MIPS64-NEXT:    daddiu $2, $zero, -4
2978; MIPS64-NEXT:    and $2, $1, $2
2979; MIPS64-NEXT:    andi $1, $1, 3
2980; MIPS64-NEXT:    sll $3, $1, 3
2981; MIPS64-NEXT:    ori $1, $zero, 255
2982; MIPS64-NEXT:    sllv $5, $1, $3
2983; MIPS64-NEXT:    nor $6, $zero, $5
2984; MIPS64-NEXT:    sllv $4, $4, $3
2985; MIPS64-NEXT:  .LBB9_1: # %entry
2986; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
2987; MIPS64-NEXT:    ll $7, 0($2)
2988; MIPS64-NEXT:    subu $8, $7, $4
2989; MIPS64-NEXT:    and $8, $8, $5
2990; MIPS64-NEXT:    and $9, $7, $6
2991; MIPS64-NEXT:    or $9, $9, $8
2992; MIPS64-NEXT:    sc $9, 0($2)
2993; MIPS64-NEXT:    beqz $9, .LBB9_1
2994; MIPS64-NEXT:    nop
2995; MIPS64-NEXT:  # %bb.2: # %entry
2996; MIPS64-NEXT:    and $1, $7, $5
2997; MIPS64-NEXT:    srlv $1, $1, $3
2998; MIPS64-NEXT:    sll $1, $1, 24
2999; MIPS64-NEXT:    sra $1, $1, 24
3000; MIPS64-NEXT:  # %bb.3: # %entry
3001; MIPS64-NEXT:    sll $1, $1, 24
3002; MIPS64-NEXT:    jr $ra
3003; MIPS64-NEXT:    sra $2, $1, 24
3004;
3005; MIPS64R2-LABEL: AtomicLoadSub8:
3006; MIPS64R2:       # %bb.0: # %entry
3007; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3008; MIPS64R2-NEXT:    daddu $1, $1, $25
3009; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3010; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
3011; MIPS64R2-NEXT:    daddiu $2, $zero, -4
3012; MIPS64R2-NEXT:    and $2, $1, $2
3013; MIPS64R2-NEXT:    andi $1, $1, 3
3014; MIPS64R2-NEXT:    sll $3, $1, 3
3015; MIPS64R2-NEXT:    ori $1, $zero, 255
3016; MIPS64R2-NEXT:    sllv $5, $1, $3
3017; MIPS64R2-NEXT:    nor $6, $zero, $5
3018; MIPS64R2-NEXT:    sllv $4, $4, $3
3019; MIPS64R2-NEXT:  .LBB9_1: # %entry
3020; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
3021; MIPS64R2-NEXT:    ll $7, 0($2)
3022; MIPS64R2-NEXT:    subu $8, $7, $4
3023; MIPS64R2-NEXT:    and $8, $8, $5
3024; MIPS64R2-NEXT:    and $9, $7, $6
3025; MIPS64R2-NEXT:    or $9, $9, $8
3026; MIPS64R2-NEXT:    sc $9, 0($2)
3027; MIPS64R2-NEXT:    beqz $9, .LBB9_1
3028; MIPS64R2-NEXT:    nop
3029; MIPS64R2-NEXT:  # %bb.2: # %entry
3030; MIPS64R2-NEXT:    and $1, $7, $5
3031; MIPS64R2-NEXT:    srlv $1, $1, $3
3032; MIPS64R2-NEXT:    seb $1, $1
3033; MIPS64R2-NEXT:  # %bb.3: # %entry
3034; MIPS64R2-NEXT:    jr $ra
3035; MIPS64R2-NEXT:    seb $2, $1
3036;
3037; MIPS64R6-LABEL: AtomicLoadSub8:
3038; MIPS64R6:       # %bb.0: # %entry
3039; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3040; MIPS64R6-NEXT:    daddu $1, $1, $25
3041; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3042; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
3043; MIPS64R6-NEXT:    daddiu $2, $zero, -4
3044; MIPS64R6-NEXT:    and $2, $1, $2
3045; MIPS64R6-NEXT:    andi $1, $1, 3
3046; MIPS64R6-NEXT:    sll $3, $1, 3
3047; MIPS64R6-NEXT:    ori $1, $zero, 255
3048; MIPS64R6-NEXT:    sllv $5, $1, $3
3049; MIPS64R6-NEXT:    nor $6, $zero, $5
3050; MIPS64R6-NEXT:    sllv $4, $4, $3
3051; MIPS64R6-NEXT:  .LBB9_1: # %entry
3052; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
3053; MIPS64R6-NEXT:    ll $7, 0($2)
3054; MIPS64R6-NEXT:    subu $8, $7, $4
3055; MIPS64R6-NEXT:    and $8, $8, $5
3056; MIPS64R6-NEXT:    and $9, $7, $6
3057; MIPS64R6-NEXT:    or $9, $9, $8
3058; MIPS64R6-NEXT:    sc $9, 0($2)
3059; MIPS64R6-NEXT:    beqzc $9, .LBB9_1
3060; MIPS64R6-NEXT:  # %bb.2: # %entry
3061; MIPS64R6-NEXT:    and $1, $7, $5
3062; MIPS64R6-NEXT:    srlv $1, $1, $3
3063; MIPS64R6-NEXT:    seb $1, $1
3064; MIPS64R6-NEXT:  # %bb.3: # %entry
3065; MIPS64R6-NEXT:    jr $ra
3066; MIPS64R6-NEXT:    seb $2, $1
3067;
3068; MIPS64R6O0-LABEL: AtomicLoadSub8:
3069; MIPS64R6O0:       # %bb.0: # %entry
3070; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
3071; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub8)))
3072; MIPS64R6O0-NEXT:    daddu $1, $1, $25
3073; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub8)))
3074; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
3075; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
3076; MIPS64R6O0-NEXT:    daddiu $2, $zero, -4
3077; MIPS64R6O0-NEXT:    and $2, $1, $2
3078; MIPS64R6O0-NEXT:    andi $1, $1, 3
3079; MIPS64R6O0-NEXT:    xori $1, $1, 3
3080; MIPS64R6O0-NEXT:    sll $1, $1, 3
3081; MIPS64R6O0-NEXT:    ori $3, $zero, 255
3082; MIPS64R6O0-NEXT:    sllv $3, $3, $1
3083; MIPS64R6O0-NEXT:    nor $5, $zero, $3
3084; MIPS64R6O0-NEXT:    sllv $4, $4, $1
3085; MIPS64R6O0-NEXT:  .LBB9_1: # %entry
3086; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3087; MIPS64R6O0-NEXT:    ll $7, 0($2)
3088; MIPS64R6O0-NEXT:    subu $8, $7, $4
3089; MIPS64R6O0-NEXT:    and $8, $8, $3
3090; MIPS64R6O0-NEXT:    and $9, $7, $5
3091; MIPS64R6O0-NEXT:    or $9, $9, $8
3092; MIPS64R6O0-NEXT:    sc $9, 0($2)
3093; MIPS64R6O0-NEXT:    beqzc $9, .LBB9_1
3094; MIPS64R6O0-NEXT:  # %bb.2: # %entry
3095; MIPS64R6O0-NEXT:    and $6, $7, $3
3096; MIPS64R6O0-NEXT:    srlv $6, $6, $1
3097; MIPS64R6O0-NEXT:    seb $6, $6
3098; MIPS64R6O0-NEXT:  # %bb.3: # %entry
3099; MIPS64R6O0-NEXT:    sw $6, 12($sp) # 4-byte Folded Spill
3100; MIPS64R6O0-NEXT:  # %bb.4: # %entry
3101; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
3102; MIPS64R6O0-NEXT:    seb $2, $1
3103; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
3104; MIPS64R6O0-NEXT:    jrc $ra
3105;
3106; MM32-LABEL: AtomicLoadSub8:
3107; MM32:       # %bb.0: # %entry
3108; MM32-NEXT:    lui $2, %hi(_gp_disp)
3109; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3110; MM32-NEXT:    addu $2, $2, $25
3111; MM32-NEXT:    lw $1, %got(y)($2)
3112; MM32-NEXT:    addiu $2, $zero, -4
3113; MM32-NEXT:    and $2, $1, $2
3114; MM32-NEXT:    andi $1, $1, 3
3115; MM32-NEXT:    sll $3, $1, 3
3116; MM32-NEXT:    ori $1, $zero, 255
3117; MM32-NEXT:    sllv $5, $1, $3
3118; MM32-NEXT:    nor $6, $zero, $5
3119; MM32-NEXT:    sllv $4, $4, $3
3120; MM32-NEXT:  $BB9_1: # %entry
3121; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
3122; MM32-NEXT:    ll $7, 0($2)
3123; MM32-NEXT:    subu $8, $7, $4
3124; MM32-NEXT:    and $8, $8, $5
3125; MM32-NEXT:    and $9, $7, $6
3126; MM32-NEXT:    or $9, $9, $8
3127; MM32-NEXT:    sc $9, 0($2)
3128; MM32-NEXT:    beqzc $9, $BB9_1
3129; MM32-NEXT:  # %bb.2: # %entry
3130; MM32-NEXT:    and $1, $7, $5
3131; MM32-NEXT:    srlv $1, $1, $3
3132; MM32-NEXT:    seb $1, $1
3133; MM32-NEXT:  # %bb.3: # %entry
3134; MM32-NEXT:    jr $ra
3135; MM32-NEXT:    seb $2, $1
3136;
3137; O1-LABEL: AtomicLoadSub8:
3138; O1:       # %bb.0: # %entry
3139; O1-NEXT:    lui $2, %hi(_gp_disp)
3140; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
3141; O1-NEXT:    addu $1, $2, $25
3142; O1-NEXT:    lw $1, %got(y)($1)
3143; O1-NEXT:    addiu $2, $zero, -4
3144; O1-NEXT:    and $2, $1, $2
3145; O1-NEXT:    andi $1, $1, 3
3146; O1-NEXT:    sll $3, $1, 3
3147; O1-NEXT:    ori $1, $zero, 255
3148; O1-NEXT:    sllv $5, $1, $3
3149; O1-NEXT:    nor $6, $zero, $5
3150; O1-NEXT:    sllv $4, $4, $3
3151; O1-NEXT:  $BB9_1: # %entry
3152; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3153; O1-NEXT:    ll $7, 0($2)
3154; O1-NEXT:    subu $8, $7, $4
3155; O1-NEXT:    and $8, $8, $5
3156; O1-NEXT:    and $9, $7, $6
3157; O1-NEXT:    or $9, $9, $8
3158; O1-NEXT:    sc $9, 0($2)
3159; O1-NEXT:    beqz $9, $BB9_1
3160; O1-NEXT:    nop
3161; O1-NEXT:  # %bb.2: # %entry
3162; O1-NEXT:    and $1, $7, $5
3163; O1-NEXT:    srlv $1, $1, $3
3164; O1-NEXT:    sll $1, $1, 24
3165; O1-NEXT:    sra $1, $1, 24
3166; O1-NEXT:  # %bb.3: # %entry
3167; O1-NEXT:    sll $1, $1, 24
3168; O1-NEXT:    jr $ra
3169; O1-NEXT:    sra $2, $1, 24
3170;
3171; O2-LABEL: AtomicLoadSub8:
3172; O2:       # %bb.0: # %entry
3173; O2-NEXT:    lui $2, %hi(_gp_disp)
3174; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3175; O2-NEXT:    addu $1, $2, $25
3176; O2-NEXT:    lw $1, %got(y)($1)
3177; O2-NEXT:    addiu $2, $zero, -4
3178; O2-NEXT:    and $2, $1, $2
3179; O2-NEXT:    andi $1, $1, 3
3180; O2-NEXT:    sll $3, $1, 3
3181; O2-NEXT:    ori $1, $zero, 255
3182; O2-NEXT:    sllv $5, $1, $3
3183; O2-NEXT:    nor $6, $zero, $5
3184; O2-NEXT:    sllv $4, $4, $3
3185; O2-NEXT:  $BB9_1: # %entry
3186; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3187; O2-NEXT:    ll $7, 0($2)
3188; O2-NEXT:    subu $8, $7, $4
3189; O2-NEXT:    and $8, $8, $5
3190; O2-NEXT:    and $9, $7, $6
3191; O2-NEXT:    or $9, $9, $8
3192; O2-NEXT:    sc $9, 0($2)
3193; O2-NEXT:    beqz $9, $BB9_1
3194; O2-NEXT:    nop
3195; O2-NEXT:  # %bb.2: # %entry
3196; O2-NEXT:    and $1, $7, $5
3197; O2-NEXT:    srlv $1, $1, $3
3198; O2-NEXT:    sll $1, $1, 24
3199; O2-NEXT:    sra $1, $1, 24
3200; O2-NEXT:  # %bb.3: # %entry
3201; O2-NEXT:    sll $1, $1, 24
3202; O2-NEXT:    jr $ra
3203; O2-NEXT:    sra $2, $1, 24
3204;
3205; O3-LABEL: AtomicLoadSub8:
3206; O3:       # %bb.0: # %entry
3207; O3-NEXT:    lui $2, %hi(_gp_disp)
3208; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
3209; O3-NEXT:    addu $1, $2, $25
3210; O3-NEXT:    addiu $2, $zero, -4
3211; O3-NEXT:    lw $1, %got(y)($1)
3212; O3-NEXT:    and $2, $1, $2
3213; O3-NEXT:    andi $1, $1, 3
3214; O3-NEXT:    sll $3, $1, 3
3215; O3-NEXT:    ori $1, $zero, 255
3216; O3-NEXT:    sllv $5, $1, $3
3217; O3-NEXT:    sllv $4, $4, $3
3218; O3-NEXT:    nor $6, $zero, $5
3219; O3-NEXT:  $BB9_1: # %entry
3220; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3221; O3-NEXT:    ll $7, 0($2)
3222; O3-NEXT:    subu $8, $7, $4
3223; O3-NEXT:    and $8, $8, $5
3224; O3-NEXT:    and $9, $7, $6
3225; O3-NEXT:    or $9, $9, $8
3226; O3-NEXT:    sc $9, 0($2)
3227; O3-NEXT:    beqz $9, $BB9_1
3228; O3-NEXT:    nop
3229; O3-NEXT:  # %bb.2: # %entry
3230; O3-NEXT:    and $1, $7, $5
3231; O3-NEXT:    srlv $1, $1, $3
3232; O3-NEXT:    sll $1, $1, 24
3233; O3-NEXT:    sra $1, $1, 24
3234; O3-NEXT:  # %bb.3: # %entry
3235; O3-NEXT:    sll $1, $1, 24
3236; O3-NEXT:    jr $ra
3237; O3-NEXT:    sra $2, $1, 24
3238;
3239; MIPS32EB-LABEL: AtomicLoadSub8:
3240; MIPS32EB:       # %bb.0: # %entry
3241; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
3242; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
3243; MIPS32EB-NEXT:    addu $1, $2, $25
3244; MIPS32EB-NEXT:    lw $1, %got(y)($1)
3245; MIPS32EB-NEXT:    addiu $2, $zero, -4
3246; MIPS32EB-NEXT:    and $2, $1, $2
3247; MIPS32EB-NEXT:    andi $1, $1, 3
3248; MIPS32EB-NEXT:    xori $1, $1, 3
3249; MIPS32EB-NEXT:    sll $3, $1, 3
3250; MIPS32EB-NEXT:    ori $1, $zero, 255
3251; MIPS32EB-NEXT:    sllv $5, $1, $3
3252; MIPS32EB-NEXT:    nor $6, $zero, $5
3253; MIPS32EB-NEXT:    sllv $4, $4, $3
3254; MIPS32EB-NEXT:  $BB9_1: # %entry
3255; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
3256; MIPS32EB-NEXT:    ll $7, 0($2)
3257; MIPS32EB-NEXT:    subu $8, $7, $4
3258; MIPS32EB-NEXT:    and $8, $8, $5
3259; MIPS32EB-NEXT:    and $9, $7, $6
3260; MIPS32EB-NEXT:    or $9, $9, $8
3261; MIPS32EB-NEXT:    sc $9, 0($2)
3262; MIPS32EB-NEXT:    beqz $9, $BB9_1
3263; MIPS32EB-NEXT:    nop
3264; MIPS32EB-NEXT:  # %bb.2: # %entry
3265; MIPS32EB-NEXT:    and $1, $7, $5
3266; MIPS32EB-NEXT:    srlv $1, $1, $3
3267; MIPS32EB-NEXT:    sll $1, $1, 24
3268; MIPS32EB-NEXT:    sra $1, $1, 24
3269; MIPS32EB-NEXT:  # %bb.3: # %entry
3270; MIPS32EB-NEXT:    sll $1, $1, 24
3271; MIPS32EB-NEXT:    jr $ra
3272; MIPS32EB-NEXT:    sra $2, $1, 24
3273entry:
3274  %0 = atomicrmw sub i8* @y, i8 %incr monotonic
3275  ret i8 %0
3276
3277}
3278
3279define signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind {
3280; MIPS32-LABEL: AtomicLoadNand8:
3281; MIPS32:       # %bb.0: # %entry
3282; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
3283; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3284; MIPS32-NEXT:    addu $1, $2, $25
3285; MIPS32-NEXT:    lw $1, %got(y)($1)
3286; MIPS32-NEXT:    addiu $2, $zero, -4
3287; MIPS32-NEXT:    and $2, $1, $2
3288; MIPS32-NEXT:    andi $1, $1, 3
3289; MIPS32-NEXT:    sll $3, $1, 3
3290; MIPS32-NEXT:    ori $1, $zero, 255
3291; MIPS32-NEXT:    sllv $5, $1, $3
3292; MIPS32-NEXT:    nor $6, $zero, $5
3293; MIPS32-NEXT:    sllv $4, $4, $3
3294; MIPS32-NEXT:  $BB10_1: # %entry
3295; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
3296; MIPS32-NEXT:    ll $7, 0($2)
3297; MIPS32-NEXT:    and $8, $7, $4
3298; MIPS32-NEXT:    nor $8, $zero, $8
3299; MIPS32-NEXT:    and $8, $8, $5
3300; MIPS32-NEXT:    and $9, $7, $6
3301; MIPS32-NEXT:    or $9, $9, $8
3302; MIPS32-NEXT:    sc $9, 0($2)
3303; MIPS32-NEXT:    beqz $9, $BB10_1
3304; MIPS32-NEXT:    nop
3305; MIPS32-NEXT:  # %bb.2: # %entry
3306; MIPS32-NEXT:    and $1, $7, $5
3307; MIPS32-NEXT:    srlv $1, $1, $3
3308; MIPS32-NEXT:    sll $1, $1, 24
3309; MIPS32-NEXT:    sra $1, $1, 24
3310; MIPS32-NEXT:  # %bb.3: # %entry
3311; MIPS32-NEXT:    sll $1, $1, 24
3312; MIPS32-NEXT:    jr $ra
3313; MIPS32-NEXT:    sra $2, $1, 24
3314;
3315; MIPS32O0-LABEL: AtomicLoadNand8:
3316; MIPS32O0:       # %bb.0: # %entry
3317; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
3318; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3319; MIPS32O0-NEXT:    addiu $sp, $sp, -8
3320; MIPS32O0-NEXT:    addu $1, $2, $25
3321; MIPS32O0-NEXT:    lw $1, %got(y)($1)
3322; MIPS32O0-NEXT:    addiu $2, $zero, -4
3323; MIPS32O0-NEXT:    and $2, $1, $2
3324; MIPS32O0-NEXT:    andi $1, $1, 3
3325; MIPS32O0-NEXT:    sll $1, $1, 3
3326; MIPS32O0-NEXT:    ori $3, $zero, 255
3327; MIPS32O0-NEXT:    sllv $3, $3, $1
3328; MIPS32O0-NEXT:    nor $5, $zero, $3
3329; MIPS32O0-NEXT:    sllv $4, $4, $1
3330; MIPS32O0-NEXT:  $BB10_1: # %entry
3331; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
3332; MIPS32O0-NEXT:    ll $7, 0($2)
3333; MIPS32O0-NEXT:    and $8, $7, $4
3334; MIPS32O0-NEXT:    nor $8, $zero, $8
3335; MIPS32O0-NEXT:    and $8, $8, $3
3336; MIPS32O0-NEXT:    and $9, $7, $5
3337; MIPS32O0-NEXT:    or $9, $9, $8
3338; MIPS32O0-NEXT:    sc $9, 0($2)
3339; MIPS32O0-NEXT:    beqz $9, $BB10_1
3340; MIPS32O0-NEXT:    nop
3341; MIPS32O0-NEXT:  # %bb.2: # %entry
3342; MIPS32O0-NEXT:    and $6, $7, $3
3343; MIPS32O0-NEXT:    srlv $6, $6, $1
3344; MIPS32O0-NEXT:    sll $6, $6, 24
3345; MIPS32O0-NEXT:    sra $6, $6, 24
3346; MIPS32O0-NEXT:  # %bb.3: # %entry
3347; MIPS32O0-NEXT:    sw $6, 4($sp) # 4-byte Folded Spill
3348; MIPS32O0-NEXT:  # %bb.4: # %entry
3349; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3350; MIPS32O0-NEXT:    sll $2, $1, 24
3351; MIPS32O0-NEXT:    sra $2, $2, 24
3352; MIPS32O0-NEXT:    addiu $sp, $sp, 8
3353; MIPS32O0-NEXT:    jr $ra
3354; MIPS32O0-NEXT:    nop
3355;
3356; MIPS32R2-LABEL: AtomicLoadNand8:
3357; MIPS32R2:       # %bb.0: # %entry
3358; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
3359; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3360; MIPS32R2-NEXT:    addu $1, $2, $25
3361; MIPS32R2-NEXT:    lw $1, %got(y)($1)
3362; MIPS32R2-NEXT:    addiu $2, $zero, -4
3363; MIPS32R2-NEXT:    and $2, $1, $2
3364; MIPS32R2-NEXT:    andi $1, $1, 3
3365; MIPS32R2-NEXT:    sll $3, $1, 3
3366; MIPS32R2-NEXT:    ori $1, $zero, 255
3367; MIPS32R2-NEXT:    sllv $5, $1, $3
3368; MIPS32R2-NEXT:    nor $6, $zero, $5
3369; MIPS32R2-NEXT:    sllv $4, $4, $3
3370; MIPS32R2-NEXT:  $BB10_1: # %entry
3371; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
3372; MIPS32R2-NEXT:    ll $7, 0($2)
3373; MIPS32R2-NEXT:    and $8, $7, $4
3374; MIPS32R2-NEXT:    nor $8, $zero, $8
3375; MIPS32R2-NEXT:    and $8, $8, $5
3376; MIPS32R2-NEXT:    and $9, $7, $6
3377; MIPS32R2-NEXT:    or $9, $9, $8
3378; MIPS32R2-NEXT:    sc $9, 0($2)
3379; MIPS32R2-NEXT:    beqz $9, $BB10_1
3380; MIPS32R2-NEXT:    nop
3381; MIPS32R2-NEXT:  # %bb.2: # %entry
3382; MIPS32R2-NEXT:    and $1, $7, $5
3383; MIPS32R2-NEXT:    srlv $1, $1, $3
3384; MIPS32R2-NEXT:    seb $1, $1
3385; MIPS32R2-NEXT:  # %bb.3: # %entry
3386; MIPS32R2-NEXT:    jr $ra
3387; MIPS32R2-NEXT:    seb $2, $1
3388;
3389; MIPS32R6-LABEL: AtomicLoadNand8:
3390; MIPS32R6:       # %bb.0: # %entry
3391; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
3392; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
3393; MIPS32R6-NEXT:    addu $1, $2, $25
3394; MIPS32R6-NEXT:    lw $1, %got(y)($1)
3395; MIPS32R6-NEXT:    addiu $2, $zero, -4
3396; MIPS32R6-NEXT:    and $2, $1, $2
3397; MIPS32R6-NEXT:    andi $1, $1, 3
3398; MIPS32R6-NEXT:    sll $3, $1, 3
3399; MIPS32R6-NEXT:    ori $1, $zero, 255
3400; MIPS32R6-NEXT:    sllv $5, $1, $3
3401; MIPS32R6-NEXT:    nor $6, $zero, $5
3402; MIPS32R6-NEXT:    sllv $4, $4, $3
3403; MIPS32R6-NEXT:  $BB10_1: # %entry
3404; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
3405; MIPS32R6-NEXT:    ll $7, 0($2)
3406; MIPS32R6-NEXT:    and $8, $7, $4
3407; MIPS32R6-NEXT:    nor $8, $zero, $8
3408; MIPS32R6-NEXT:    and $8, $8, $5
3409; MIPS32R6-NEXT:    and $9, $7, $6
3410; MIPS32R6-NEXT:    or $9, $9, $8
3411; MIPS32R6-NEXT:    sc $9, 0($2)
3412; MIPS32R6-NEXT:    beqzc $9, $BB10_1
3413; MIPS32R6-NEXT:  # %bb.2: # %entry
3414; MIPS32R6-NEXT:    and $1, $7, $5
3415; MIPS32R6-NEXT:    srlv $1, $1, $3
3416; MIPS32R6-NEXT:    seb $1, $1
3417; MIPS32R6-NEXT:  # %bb.3: # %entry
3418; MIPS32R6-NEXT:    jr $ra
3419; MIPS32R6-NEXT:    seb $2, $1
3420;
3421; MIPS32R6O0-LABEL: AtomicLoadNand8:
3422; MIPS32R6O0:       # %bb.0: # %entry
3423; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
3424; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3425; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
3426; MIPS32R6O0-NEXT:    addu $1, $2, $25
3427; MIPS32R6O0-NEXT:    move $2, $4
3428; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
3429; MIPS32R6O0-NEXT:    addiu $3, $zero, -4
3430; MIPS32R6O0-NEXT:    and $3, $1, $3
3431; MIPS32R6O0-NEXT:    andi $1, $1, 3
3432; MIPS32R6O0-NEXT:    sll $1, $1, 3
3433; MIPS32R6O0-NEXT:    ori $5, $zero, 255
3434; MIPS32R6O0-NEXT:    sllv $5, $5, $1
3435; MIPS32R6O0-NEXT:    nor $6, $zero, $5
3436; MIPS32R6O0-NEXT:    sllv $4, $4, $1
3437; MIPS32R6O0-NEXT:  $BB10_1: # %entry
3438; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3439; MIPS32R6O0-NEXT:    ll $8, 0($3)
3440; MIPS32R6O0-NEXT:    and $9, $8, $4
3441; MIPS32R6O0-NEXT:    nor $9, $zero, $9
3442; MIPS32R6O0-NEXT:    and $9, $9, $5
3443; MIPS32R6O0-NEXT:    and $10, $8, $6
3444; MIPS32R6O0-NEXT:    or $10, $10, $9
3445; MIPS32R6O0-NEXT:    sc $10, 0($3)
3446; MIPS32R6O0-NEXT:    beqzc $10, $BB10_1
3447; MIPS32R6O0-NEXT:  # %bb.2: # %entry
3448; MIPS32R6O0-NEXT:    and $7, $8, $5
3449; MIPS32R6O0-NEXT:    srlv $7, $7, $1
3450; MIPS32R6O0-NEXT:    seb $7, $7
3451; MIPS32R6O0-NEXT:  # %bb.3: # %entry
3452; MIPS32R6O0-NEXT:    sw $7, 4($sp) # 4-byte Folded Spill
3453; MIPS32R6O0-NEXT:  # %bb.4: # %entry
3454; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3455; MIPS32R6O0-NEXT:    seb $2, $1
3456; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
3457; MIPS32R6O0-NEXT:    jrc $ra
3458;
3459; MIPS4-LABEL: AtomicLoadNand8:
3460; MIPS4:       # %bb.0: # %entry
3461; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3462; MIPS4-NEXT:    daddu $1, $1, $25
3463; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3464; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
3465; MIPS4-NEXT:    daddiu $2, $zero, -4
3466; MIPS4-NEXT:    and $2, $1, $2
3467; MIPS4-NEXT:    andi $1, $1, 3
3468; MIPS4-NEXT:    sll $3, $1, 3
3469; MIPS4-NEXT:    ori $1, $zero, 255
3470; MIPS4-NEXT:    sllv $5, $1, $3
3471; MIPS4-NEXT:    nor $6, $zero, $5
3472; MIPS4-NEXT:    sllv $4, $4, $3
3473; MIPS4-NEXT:  .LBB10_1: # %entry
3474; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
3475; MIPS4-NEXT:    ll $7, 0($2)
3476; MIPS4-NEXT:    and $8, $7, $4
3477; MIPS4-NEXT:    nor $8, $zero, $8
3478; MIPS4-NEXT:    and $8, $8, $5
3479; MIPS4-NEXT:    and $9, $7, $6
3480; MIPS4-NEXT:    or $9, $9, $8
3481; MIPS4-NEXT:    sc $9, 0($2)
3482; MIPS4-NEXT:    beqz $9, .LBB10_1
3483; MIPS4-NEXT:    nop
3484; MIPS4-NEXT:  # %bb.2: # %entry
3485; MIPS4-NEXT:    and $1, $7, $5
3486; MIPS4-NEXT:    srlv $1, $1, $3
3487; MIPS4-NEXT:    sll $1, $1, 24
3488; MIPS4-NEXT:    sra $1, $1, 24
3489; MIPS4-NEXT:  # %bb.3: # %entry
3490; MIPS4-NEXT:    sll $1, $1, 24
3491; MIPS4-NEXT:    jr $ra
3492; MIPS4-NEXT:    sra $2, $1, 24
3493;
3494; MIPS64-LABEL: AtomicLoadNand8:
3495; MIPS64:       # %bb.0: # %entry
3496; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3497; MIPS64-NEXT:    daddu $1, $1, $25
3498; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3499; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
3500; MIPS64-NEXT:    daddiu $2, $zero, -4
3501; MIPS64-NEXT:    and $2, $1, $2
3502; MIPS64-NEXT:    andi $1, $1, 3
3503; MIPS64-NEXT:    sll $3, $1, 3
3504; MIPS64-NEXT:    ori $1, $zero, 255
3505; MIPS64-NEXT:    sllv $5, $1, $3
3506; MIPS64-NEXT:    nor $6, $zero, $5
3507; MIPS64-NEXT:    sllv $4, $4, $3
3508; MIPS64-NEXT:  .LBB10_1: # %entry
3509; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
3510; MIPS64-NEXT:    ll $7, 0($2)
3511; MIPS64-NEXT:    and $8, $7, $4
3512; MIPS64-NEXT:    nor $8, $zero, $8
3513; MIPS64-NEXT:    and $8, $8, $5
3514; MIPS64-NEXT:    and $9, $7, $6
3515; MIPS64-NEXT:    or $9, $9, $8
3516; MIPS64-NEXT:    sc $9, 0($2)
3517; MIPS64-NEXT:    beqz $9, .LBB10_1
3518; MIPS64-NEXT:    nop
3519; MIPS64-NEXT:  # %bb.2: # %entry
3520; MIPS64-NEXT:    and $1, $7, $5
3521; MIPS64-NEXT:    srlv $1, $1, $3
3522; MIPS64-NEXT:    sll $1, $1, 24
3523; MIPS64-NEXT:    sra $1, $1, 24
3524; MIPS64-NEXT:  # %bb.3: # %entry
3525; MIPS64-NEXT:    sll $1, $1, 24
3526; MIPS64-NEXT:    jr $ra
3527; MIPS64-NEXT:    sra $2, $1, 24
3528;
3529; MIPS64R2-LABEL: AtomicLoadNand8:
3530; MIPS64R2:       # %bb.0: # %entry
3531; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3532; MIPS64R2-NEXT:    daddu $1, $1, $25
3533; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3534; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
3535; MIPS64R2-NEXT:    daddiu $2, $zero, -4
3536; MIPS64R2-NEXT:    and $2, $1, $2
3537; MIPS64R2-NEXT:    andi $1, $1, 3
3538; MIPS64R2-NEXT:    sll $3, $1, 3
3539; MIPS64R2-NEXT:    ori $1, $zero, 255
3540; MIPS64R2-NEXT:    sllv $5, $1, $3
3541; MIPS64R2-NEXT:    nor $6, $zero, $5
3542; MIPS64R2-NEXT:    sllv $4, $4, $3
3543; MIPS64R2-NEXT:  .LBB10_1: # %entry
3544; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
3545; MIPS64R2-NEXT:    ll $7, 0($2)
3546; MIPS64R2-NEXT:    and $8, $7, $4
3547; MIPS64R2-NEXT:    nor $8, $zero, $8
3548; MIPS64R2-NEXT:    and $8, $8, $5
3549; MIPS64R2-NEXT:    and $9, $7, $6
3550; MIPS64R2-NEXT:    or $9, $9, $8
3551; MIPS64R2-NEXT:    sc $9, 0($2)
3552; MIPS64R2-NEXT:    beqz $9, .LBB10_1
3553; MIPS64R2-NEXT:    nop
3554; MIPS64R2-NEXT:  # %bb.2: # %entry
3555; MIPS64R2-NEXT:    and $1, $7, $5
3556; MIPS64R2-NEXT:    srlv $1, $1, $3
3557; MIPS64R2-NEXT:    seb $1, $1
3558; MIPS64R2-NEXT:  # %bb.3: # %entry
3559; MIPS64R2-NEXT:    jr $ra
3560; MIPS64R2-NEXT:    seb $2, $1
3561;
3562; MIPS64R6-LABEL: AtomicLoadNand8:
3563; MIPS64R6:       # %bb.0: # %entry
3564; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3565; MIPS64R6-NEXT:    daddu $1, $1, $25
3566; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3567; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
3568; MIPS64R6-NEXT:    daddiu $2, $zero, -4
3569; MIPS64R6-NEXT:    and $2, $1, $2
3570; MIPS64R6-NEXT:    andi $1, $1, 3
3571; MIPS64R6-NEXT:    sll $3, $1, 3
3572; MIPS64R6-NEXT:    ori $1, $zero, 255
3573; MIPS64R6-NEXT:    sllv $5, $1, $3
3574; MIPS64R6-NEXT:    nor $6, $zero, $5
3575; MIPS64R6-NEXT:    sllv $4, $4, $3
3576; MIPS64R6-NEXT:  .LBB10_1: # %entry
3577; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
3578; MIPS64R6-NEXT:    ll $7, 0($2)
3579; MIPS64R6-NEXT:    and $8, $7, $4
3580; MIPS64R6-NEXT:    nor $8, $zero, $8
3581; MIPS64R6-NEXT:    and $8, $8, $5
3582; MIPS64R6-NEXT:    and $9, $7, $6
3583; MIPS64R6-NEXT:    or $9, $9, $8
3584; MIPS64R6-NEXT:    sc $9, 0($2)
3585; MIPS64R6-NEXT:    beqzc $9, .LBB10_1
3586; MIPS64R6-NEXT:  # %bb.2: # %entry
3587; MIPS64R6-NEXT:    and $1, $7, $5
3588; MIPS64R6-NEXT:    srlv $1, $1, $3
3589; MIPS64R6-NEXT:    seb $1, $1
3590; MIPS64R6-NEXT:  # %bb.3: # %entry
3591; MIPS64R6-NEXT:    jr $ra
3592; MIPS64R6-NEXT:    seb $2, $1
3593;
3594; MIPS64R6O0-LABEL: AtomicLoadNand8:
3595; MIPS64R6O0:       # %bb.0: # %entry
3596; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
3597; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand8)))
3598; MIPS64R6O0-NEXT:    daddu $1, $1, $25
3599; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand8)))
3600; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
3601; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
3602; MIPS64R6O0-NEXT:    daddiu $2, $zero, -4
3603; MIPS64R6O0-NEXT:    and $2, $1, $2
3604; MIPS64R6O0-NEXT:    andi $1, $1, 3
3605; MIPS64R6O0-NEXT:    xori $1, $1, 3
3606; MIPS64R6O0-NEXT:    sll $1, $1, 3
3607; MIPS64R6O0-NEXT:    ori $3, $zero, 255
3608; MIPS64R6O0-NEXT:    sllv $3, $3, $1
3609; MIPS64R6O0-NEXT:    nor $5, $zero, $3
3610; MIPS64R6O0-NEXT:    sllv $4, $4, $1
3611; MIPS64R6O0-NEXT:  .LBB10_1: # %entry
3612; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3613; MIPS64R6O0-NEXT:    ll $7, 0($2)
3614; MIPS64R6O0-NEXT:    and $8, $7, $4
3615; MIPS64R6O0-NEXT:    nor $8, $zero, $8
3616; MIPS64R6O0-NEXT:    and $8, $8, $3
3617; MIPS64R6O0-NEXT:    and $9, $7, $5
3618; MIPS64R6O0-NEXT:    or $9, $9, $8
3619; MIPS64R6O0-NEXT:    sc $9, 0($2)
3620; MIPS64R6O0-NEXT:    beqzc $9, .LBB10_1
3621; MIPS64R6O0-NEXT:  # %bb.2: # %entry
3622; MIPS64R6O0-NEXT:    and $6, $7, $3
3623; MIPS64R6O0-NEXT:    srlv $6, $6, $1
3624; MIPS64R6O0-NEXT:    seb $6, $6
3625; MIPS64R6O0-NEXT:  # %bb.3: # %entry
3626; MIPS64R6O0-NEXT:    sw $6, 12($sp) # 4-byte Folded Spill
3627; MIPS64R6O0-NEXT:  # %bb.4: # %entry
3628; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
3629; MIPS64R6O0-NEXT:    seb $2, $1
3630; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
3631; MIPS64R6O0-NEXT:    jrc $ra
3632;
3633; MM32-LABEL: AtomicLoadNand8:
3634; MM32:       # %bb.0: # %entry
3635; MM32-NEXT:    lui $2, %hi(_gp_disp)
3636; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3637; MM32-NEXT:    addu $2, $2, $25
3638; MM32-NEXT:    lw $1, %got(y)($2)
3639; MM32-NEXT:    addiu $2, $zero, -4
3640; MM32-NEXT:    and $2, $1, $2
3641; MM32-NEXT:    andi $1, $1, 3
3642; MM32-NEXT:    sll $3, $1, 3
3643; MM32-NEXT:    ori $1, $zero, 255
3644; MM32-NEXT:    sllv $5, $1, $3
3645; MM32-NEXT:    nor $6, $zero, $5
3646; MM32-NEXT:    sllv $4, $4, $3
3647; MM32-NEXT:  $BB10_1: # %entry
3648; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
3649; MM32-NEXT:    ll $7, 0($2)
3650; MM32-NEXT:    and $8, $7, $4
3651; MM32-NEXT:    nor $8, $zero, $8
3652; MM32-NEXT:    and $8, $8, $5
3653; MM32-NEXT:    and $9, $7, $6
3654; MM32-NEXT:    or $9, $9, $8
3655; MM32-NEXT:    sc $9, 0($2)
3656; MM32-NEXT:    beqzc $9, $BB10_1
3657; MM32-NEXT:  # %bb.2: # %entry
3658; MM32-NEXT:    and $1, $7, $5
3659; MM32-NEXT:    srlv $1, $1, $3
3660; MM32-NEXT:    seb $1, $1
3661; MM32-NEXT:  # %bb.3: # %entry
3662; MM32-NEXT:    jr $ra
3663; MM32-NEXT:    seb $2, $1
3664;
3665; O1-LABEL: AtomicLoadNand8:
3666; O1:       # %bb.0: # %entry
3667; O1-NEXT:    lui $2, %hi(_gp_disp)
3668; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
3669; O1-NEXT:    addu $1, $2, $25
3670; O1-NEXT:    lw $1, %got(y)($1)
3671; O1-NEXT:    addiu $2, $zero, -4
3672; O1-NEXT:    and $2, $1, $2
3673; O1-NEXT:    andi $1, $1, 3
3674; O1-NEXT:    sll $3, $1, 3
3675; O1-NEXT:    ori $1, $zero, 255
3676; O1-NEXT:    sllv $5, $1, $3
3677; O1-NEXT:    nor $6, $zero, $5
3678; O1-NEXT:    sllv $4, $4, $3
3679; O1-NEXT:  $BB10_1: # %entry
3680; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3681; O1-NEXT:    ll $7, 0($2)
3682; O1-NEXT:    and $8, $7, $4
3683; O1-NEXT:    nor $8, $zero, $8
3684; O1-NEXT:    and $8, $8, $5
3685; O1-NEXT:    and $9, $7, $6
3686; O1-NEXT:    or $9, $9, $8
3687; O1-NEXT:    sc $9, 0($2)
3688; O1-NEXT:    beqz $9, $BB10_1
3689; O1-NEXT:    nop
3690; O1-NEXT:  # %bb.2: # %entry
3691; O1-NEXT:    and $1, $7, $5
3692; O1-NEXT:    srlv $1, $1, $3
3693; O1-NEXT:    sll $1, $1, 24
3694; O1-NEXT:    sra $1, $1, 24
3695; O1-NEXT:  # %bb.3: # %entry
3696; O1-NEXT:    sll $1, $1, 24
3697; O1-NEXT:    jr $ra
3698; O1-NEXT:    sra $2, $1, 24
3699;
3700; O2-LABEL: AtomicLoadNand8:
3701; O2:       # %bb.0: # %entry
3702; O2-NEXT:    lui $2, %hi(_gp_disp)
3703; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3704; O2-NEXT:    addu $1, $2, $25
3705; O2-NEXT:    lw $1, %got(y)($1)
3706; O2-NEXT:    addiu $2, $zero, -4
3707; O2-NEXT:    and $2, $1, $2
3708; O2-NEXT:    andi $1, $1, 3
3709; O2-NEXT:    sll $3, $1, 3
3710; O2-NEXT:    ori $1, $zero, 255
3711; O2-NEXT:    sllv $5, $1, $3
3712; O2-NEXT:    nor $6, $zero, $5
3713; O2-NEXT:    sllv $4, $4, $3
3714; O2-NEXT:  $BB10_1: # %entry
3715; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3716; O2-NEXT:    ll $7, 0($2)
3717; O2-NEXT:    and $8, $7, $4
3718; O2-NEXT:    nor $8, $zero, $8
3719; O2-NEXT:    and $8, $8, $5
3720; O2-NEXT:    and $9, $7, $6
3721; O2-NEXT:    or $9, $9, $8
3722; O2-NEXT:    sc $9, 0($2)
3723; O2-NEXT:    beqz $9, $BB10_1
3724; O2-NEXT:    nop
3725; O2-NEXT:  # %bb.2: # %entry
3726; O2-NEXT:    and $1, $7, $5
3727; O2-NEXT:    srlv $1, $1, $3
3728; O2-NEXT:    sll $1, $1, 24
3729; O2-NEXT:    sra $1, $1, 24
3730; O2-NEXT:  # %bb.3: # %entry
3731; O2-NEXT:    sll $1, $1, 24
3732; O2-NEXT:    jr $ra
3733; O2-NEXT:    sra $2, $1, 24
3734;
3735; O3-LABEL: AtomicLoadNand8:
3736; O3:       # %bb.0: # %entry
3737; O3-NEXT:    lui $2, %hi(_gp_disp)
3738; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
3739; O3-NEXT:    addu $1, $2, $25
3740; O3-NEXT:    addiu $2, $zero, -4
3741; O3-NEXT:    lw $1, %got(y)($1)
3742; O3-NEXT:    and $2, $1, $2
3743; O3-NEXT:    andi $1, $1, 3
3744; O3-NEXT:    sll $3, $1, 3
3745; O3-NEXT:    ori $1, $zero, 255
3746; O3-NEXT:    sllv $5, $1, $3
3747; O3-NEXT:    sllv $4, $4, $3
3748; O3-NEXT:    nor $6, $zero, $5
3749; O3-NEXT:  $BB10_1: # %entry
3750; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3751; O3-NEXT:    ll $7, 0($2)
3752; O3-NEXT:    and $8, $7, $4
3753; O3-NEXT:    nor $8, $zero, $8
3754; O3-NEXT:    and $8, $8, $5
3755; O3-NEXT:    and $9, $7, $6
3756; O3-NEXT:    or $9, $9, $8
3757; O3-NEXT:    sc $9, 0($2)
3758; O3-NEXT:    beqz $9, $BB10_1
3759; O3-NEXT:    nop
3760; O3-NEXT:  # %bb.2: # %entry
3761; O3-NEXT:    and $1, $7, $5
3762; O3-NEXT:    srlv $1, $1, $3
3763; O3-NEXT:    sll $1, $1, 24
3764; O3-NEXT:    sra $1, $1, 24
3765; O3-NEXT:  # %bb.3: # %entry
3766; O3-NEXT:    sll $1, $1, 24
3767; O3-NEXT:    jr $ra
3768; O3-NEXT:    sra $2, $1, 24
3769;
3770; MIPS32EB-LABEL: AtomicLoadNand8:
3771; MIPS32EB:       # %bb.0: # %entry
3772; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
3773; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
3774; MIPS32EB-NEXT:    addu $1, $2, $25
3775; MIPS32EB-NEXT:    lw $1, %got(y)($1)
3776; MIPS32EB-NEXT:    addiu $2, $zero, -4
3777; MIPS32EB-NEXT:    and $2, $1, $2
3778; MIPS32EB-NEXT:    andi $1, $1, 3
3779; MIPS32EB-NEXT:    xori $1, $1, 3
3780; MIPS32EB-NEXT:    sll $3, $1, 3
3781; MIPS32EB-NEXT:    ori $1, $zero, 255
3782; MIPS32EB-NEXT:    sllv $5, $1, $3
3783; MIPS32EB-NEXT:    nor $6, $zero, $5
3784; MIPS32EB-NEXT:    sllv $4, $4, $3
3785; MIPS32EB-NEXT:  $BB10_1: # %entry
3786; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
3787; MIPS32EB-NEXT:    ll $7, 0($2)
3788; MIPS32EB-NEXT:    and $8, $7, $4
3789; MIPS32EB-NEXT:    nor $8, $zero, $8
3790; MIPS32EB-NEXT:    and $8, $8, $5
3791; MIPS32EB-NEXT:    and $9, $7, $6
3792; MIPS32EB-NEXT:    or $9, $9, $8
3793; MIPS32EB-NEXT:    sc $9, 0($2)
3794; MIPS32EB-NEXT:    beqz $9, $BB10_1
3795; MIPS32EB-NEXT:    nop
3796; MIPS32EB-NEXT:  # %bb.2: # %entry
3797; MIPS32EB-NEXT:    and $1, $7, $5
3798; MIPS32EB-NEXT:    srlv $1, $1, $3
3799; MIPS32EB-NEXT:    sll $1, $1, 24
3800; MIPS32EB-NEXT:    sra $1, $1, 24
3801; MIPS32EB-NEXT:  # %bb.3: # %entry
3802; MIPS32EB-NEXT:    sll $1, $1, 24
3803; MIPS32EB-NEXT:    jr $ra
3804; MIPS32EB-NEXT:    sra $2, $1, 24
3805entry:
3806  %0 = atomicrmw nand i8* @y, i8 %incr monotonic
3807  ret i8 %0
3808
3809}
3810
3811define signext i8 @AtomicSwap8(i8 signext %newval) nounwind {
3812; MIPS32-LABEL: AtomicSwap8:
3813; MIPS32:       # %bb.0: # %entry
3814; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
3815; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
3816; MIPS32-NEXT:    addu $1, $2, $25
3817; MIPS32-NEXT:    lw $1, %got(y)($1)
3818; MIPS32-NEXT:    addiu $2, $zero, -4
3819; MIPS32-NEXT:    and $2, $1, $2
3820; MIPS32-NEXT:    andi $1, $1, 3
3821; MIPS32-NEXT:    sll $3, $1, 3
3822; MIPS32-NEXT:    ori $1, $zero, 255
3823; MIPS32-NEXT:    sllv $5, $1, $3
3824; MIPS32-NEXT:    nor $6, $zero, $5
3825; MIPS32-NEXT:    sllv $4, $4, $3
3826; MIPS32-NEXT:  $BB11_1: # %entry
3827; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
3828; MIPS32-NEXT:    ll $7, 0($2)
3829; MIPS32-NEXT:    and $8, $4, $5
3830; MIPS32-NEXT:    and $9, $7, $6
3831; MIPS32-NEXT:    or $9, $9, $8
3832; MIPS32-NEXT:    sc $9, 0($2)
3833; MIPS32-NEXT:    beqz $9, $BB11_1
3834; MIPS32-NEXT:    nop
3835; MIPS32-NEXT:  # %bb.2: # %entry
3836; MIPS32-NEXT:    and $1, $7, $5
3837; MIPS32-NEXT:    srlv $1, $1, $3
3838; MIPS32-NEXT:    sll $1, $1, 24
3839; MIPS32-NEXT:    sra $1, $1, 24
3840; MIPS32-NEXT:  # %bb.3: # %entry
3841; MIPS32-NEXT:    sll $1, $1, 24
3842; MIPS32-NEXT:    jr $ra
3843; MIPS32-NEXT:    sra $2, $1, 24
3844;
3845; MIPS32O0-LABEL: AtomicSwap8:
3846; MIPS32O0:       # %bb.0: # %entry
3847; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
3848; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3849; MIPS32O0-NEXT:    addiu $sp, $sp, -8
3850; MIPS32O0-NEXT:    addu $1, $2, $25
3851; MIPS32O0-NEXT:    lw $1, %got(y)($1)
3852; MIPS32O0-NEXT:    addiu $2, $zero, -4
3853; MIPS32O0-NEXT:    and $2, $1, $2
3854; MIPS32O0-NEXT:    andi $1, $1, 3
3855; MIPS32O0-NEXT:    sll $1, $1, 3
3856; MIPS32O0-NEXT:    ori $3, $zero, 255
3857; MIPS32O0-NEXT:    sllv $3, $3, $1
3858; MIPS32O0-NEXT:    nor $5, $zero, $3
3859; MIPS32O0-NEXT:    sllv $4, $4, $1
3860; MIPS32O0-NEXT:  $BB11_1: # %entry
3861; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
3862; MIPS32O0-NEXT:    ll $7, 0($2)
3863; MIPS32O0-NEXT:    and $8, $4, $3
3864; MIPS32O0-NEXT:    and $9, $7, $5
3865; MIPS32O0-NEXT:    or $9, $9, $8
3866; MIPS32O0-NEXT:    sc $9, 0($2)
3867; MIPS32O0-NEXT:    beqz $9, $BB11_1
3868; MIPS32O0-NEXT:    nop
3869; MIPS32O0-NEXT:  # %bb.2: # %entry
3870; MIPS32O0-NEXT:    and $6, $7, $3
3871; MIPS32O0-NEXT:    srlv $6, $6, $1
3872; MIPS32O0-NEXT:    sll $6, $6, 24
3873; MIPS32O0-NEXT:    sra $6, $6, 24
3874; MIPS32O0-NEXT:  # %bb.3: # %entry
3875; MIPS32O0-NEXT:    sw $6, 4($sp) # 4-byte Folded Spill
3876; MIPS32O0-NEXT:  # %bb.4: # %entry
3877; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3878; MIPS32O0-NEXT:    sll $2, $1, 24
3879; MIPS32O0-NEXT:    sra $2, $2, 24
3880; MIPS32O0-NEXT:    addiu $sp, $sp, 8
3881; MIPS32O0-NEXT:    jr $ra
3882; MIPS32O0-NEXT:    nop
3883;
3884; MIPS32R2-LABEL: AtomicSwap8:
3885; MIPS32R2:       # %bb.0: # %entry
3886; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
3887; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
3888; MIPS32R2-NEXT:    addu $1, $2, $25
3889; MIPS32R2-NEXT:    lw $1, %got(y)($1)
3890; MIPS32R2-NEXT:    addiu $2, $zero, -4
3891; MIPS32R2-NEXT:    and $2, $1, $2
3892; MIPS32R2-NEXT:    andi $1, $1, 3
3893; MIPS32R2-NEXT:    sll $3, $1, 3
3894; MIPS32R2-NEXT:    ori $1, $zero, 255
3895; MIPS32R2-NEXT:    sllv $5, $1, $3
3896; MIPS32R2-NEXT:    nor $6, $zero, $5
3897; MIPS32R2-NEXT:    sllv $4, $4, $3
3898; MIPS32R2-NEXT:  $BB11_1: # %entry
3899; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
3900; MIPS32R2-NEXT:    ll $7, 0($2)
3901; MIPS32R2-NEXT:    and $8, $4, $5
3902; MIPS32R2-NEXT:    and $9, $7, $6
3903; MIPS32R2-NEXT:    or $9, $9, $8
3904; MIPS32R2-NEXT:    sc $9, 0($2)
3905; MIPS32R2-NEXT:    beqz $9, $BB11_1
3906; MIPS32R2-NEXT:    nop
3907; MIPS32R2-NEXT:  # %bb.2: # %entry
3908; MIPS32R2-NEXT:    and $1, $7, $5
3909; MIPS32R2-NEXT:    srlv $1, $1, $3
3910; MIPS32R2-NEXT:    seb $1, $1
3911; MIPS32R2-NEXT:  # %bb.3: # %entry
3912; MIPS32R2-NEXT:    jr $ra
3913; MIPS32R2-NEXT:    seb $2, $1
3914;
3915; MIPS32R6-LABEL: AtomicSwap8:
3916; MIPS32R6:       # %bb.0: # %entry
3917; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
3918; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
3919; MIPS32R6-NEXT:    addu $1, $2, $25
3920; MIPS32R6-NEXT:    lw $1, %got(y)($1)
3921; MIPS32R6-NEXT:    addiu $2, $zero, -4
3922; MIPS32R6-NEXT:    and $2, $1, $2
3923; MIPS32R6-NEXT:    andi $1, $1, 3
3924; MIPS32R6-NEXT:    sll $3, $1, 3
3925; MIPS32R6-NEXT:    ori $1, $zero, 255
3926; MIPS32R6-NEXT:    sllv $5, $1, $3
3927; MIPS32R6-NEXT:    nor $6, $zero, $5
3928; MIPS32R6-NEXT:    sllv $4, $4, $3
3929; MIPS32R6-NEXT:  $BB11_1: # %entry
3930; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
3931; MIPS32R6-NEXT:    ll $7, 0($2)
3932; MIPS32R6-NEXT:    and $8, $4, $5
3933; MIPS32R6-NEXT:    and $9, $7, $6
3934; MIPS32R6-NEXT:    or $9, $9, $8
3935; MIPS32R6-NEXT:    sc $9, 0($2)
3936; MIPS32R6-NEXT:    beqzc $9, $BB11_1
3937; MIPS32R6-NEXT:  # %bb.2: # %entry
3938; MIPS32R6-NEXT:    and $1, $7, $5
3939; MIPS32R6-NEXT:    srlv $1, $1, $3
3940; MIPS32R6-NEXT:    seb $1, $1
3941; MIPS32R6-NEXT:  # %bb.3: # %entry
3942; MIPS32R6-NEXT:    jr $ra
3943; MIPS32R6-NEXT:    seb $2, $1
3944;
3945; MIPS32R6O0-LABEL: AtomicSwap8:
3946; MIPS32R6O0:       # %bb.0: # %entry
3947; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
3948; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
3949; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
3950; MIPS32R6O0-NEXT:    addu $1, $2, $25
3951; MIPS32R6O0-NEXT:    move $2, $4
3952; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
3953; MIPS32R6O0-NEXT:    addiu $3, $zero, -4
3954; MIPS32R6O0-NEXT:    and $3, $1, $3
3955; MIPS32R6O0-NEXT:    andi $1, $1, 3
3956; MIPS32R6O0-NEXT:    sll $1, $1, 3
3957; MIPS32R6O0-NEXT:    ori $5, $zero, 255
3958; MIPS32R6O0-NEXT:    sllv $5, $5, $1
3959; MIPS32R6O0-NEXT:    nor $6, $zero, $5
3960; MIPS32R6O0-NEXT:    sllv $4, $4, $1
3961; MIPS32R6O0-NEXT:  $BB11_1: # %entry
3962; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
3963; MIPS32R6O0-NEXT:    ll $8, 0($3)
3964; MIPS32R6O0-NEXT:    and $9, $4, $5
3965; MIPS32R6O0-NEXT:    and $10, $8, $6
3966; MIPS32R6O0-NEXT:    or $10, $10, $9
3967; MIPS32R6O0-NEXT:    sc $10, 0($3)
3968; MIPS32R6O0-NEXT:    beqzc $10, $BB11_1
3969; MIPS32R6O0-NEXT:  # %bb.2: # %entry
3970; MIPS32R6O0-NEXT:    and $7, $8, $5
3971; MIPS32R6O0-NEXT:    srlv $7, $7, $1
3972; MIPS32R6O0-NEXT:    seb $7, $7
3973; MIPS32R6O0-NEXT:  # %bb.3: # %entry
3974; MIPS32R6O0-NEXT:    sw $7, 4($sp) # 4-byte Folded Spill
3975; MIPS32R6O0-NEXT:  # %bb.4: # %entry
3976; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
3977; MIPS32R6O0-NEXT:    seb $2, $1
3978; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
3979; MIPS32R6O0-NEXT:    jrc $ra
3980;
3981; MIPS4-LABEL: AtomicSwap8:
3982; MIPS4:       # %bb.0: # %entry
3983; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
3984; MIPS4-NEXT:    daddu $1, $1, $25
3985; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
3986; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
3987; MIPS4-NEXT:    daddiu $2, $zero, -4
3988; MIPS4-NEXT:    and $2, $1, $2
3989; MIPS4-NEXT:    andi $1, $1, 3
3990; MIPS4-NEXT:    sll $3, $1, 3
3991; MIPS4-NEXT:    ori $1, $zero, 255
3992; MIPS4-NEXT:    sllv $5, $1, $3
3993; MIPS4-NEXT:    nor $6, $zero, $5
3994; MIPS4-NEXT:    sllv $4, $4, $3
3995; MIPS4-NEXT:  .LBB11_1: # %entry
3996; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
3997; MIPS4-NEXT:    ll $7, 0($2)
3998; MIPS4-NEXT:    and $8, $4, $5
3999; MIPS4-NEXT:    and $9, $7, $6
4000; MIPS4-NEXT:    or $9, $9, $8
4001; MIPS4-NEXT:    sc $9, 0($2)
4002; MIPS4-NEXT:    beqz $9, .LBB11_1
4003; MIPS4-NEXT:    nop
4004; MIPS4-NEXT:  # %bb.2: # %entry
4005; MIPS4-NEXT:    and $1, $7, $5
4006; MIPS4-NEXT:    srlv $1, $1, $3
4007; MIPS4-NEXT:    sll $1, $1, 24
4008; MIPS4-NEXT:    sra $1, $1, 24
4009; MIPS4-NEXT:  # %bb.3: # %entry
4010; MIPS4-NEXT:    sll $1, $1, 24
4011; MIPS4-NEXT:    jr $ra
4012; MIPS4-NEXT:    sra $2, $1, 24
4013;
4014; MIPS64-LABEL: AtomicSwap8:
4015; MIPS64:       # %bb.0: # %entry
4016; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4017; MIPS64-NEXT:    daddu $1, $1, $25
4018; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4019; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
4020; MIPS64-NEXT:    daddiu $2, $zero, -4
4021; MIPS64-NEXT:    and $2, $1, $2
4022; MIPS64-NEXT:    andi $1, $1, 3
4023; MIPS64-NEXT:    sll $3, $1, 3
4024; MIPS64-NEXT:    ori $1, $zero, 255
4025; MIPS64-NEXT:    sllv $5, $1, $3
4026; MIPS64-NEXT:    nor $6, $zero, $5
4027; MIPS64-NEXT:    sllv $4, $4, $3
4028; MIPS64-NEXT:  .LBB11_1: # %entry
4029; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
4030; MIPS64-NEXT:    ll $7, 0($2)
4031; MIPS64-NEXT:    and $8, $4, $5
4032; MIPS64-NEXT:    and $9, $7, $6
4033; MIPS64-NEXT:    or $9, $9, $8
4034; MIPS64-NEXT:    sc $9, 0($2)
4035; MIPS64-NEXT:    beqz $9, .LBB11_1
4036; MIPS64-NEXT:    nop
4037; MIPS64-NEXT:  # %bb.2: # %entry
4038; MIPS64-NEXT:    and $1, $7, $5
4039; MIPS64-NEXT:    srlv $1, $1, $3
4040; MIPS64-NEXT:    sll $1, $1, 24
4041; MIPS64-NEXT:    sra $1, $1, 24
4042; MIPS64-NEXT:  # %bb.3: # %entry
4043; MIPS64-NEXT:    sll $1, $1, 24
4044; MIPS64-NEXT:    jr $ra
4045; MIPS64-NEXT:    sra $2, $1, 24
4046;
4047; MIPS64R2-LABEL: AtomicSwap8:
4048; MIPS64R2:       # %bb.0: # %entry
4049; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4050; MIPS64R2-NEXT:    daddu $1, $1, $25
4051; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4052; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
4053; MIPS64R2-NEXT:    daddiu $2, $zero, -4
4054; MIPS64R2-NEXT:    and $2, $1, $2
4055; MIPS64R2-NEXT:    andi $1, $1, 3
4056; MIPS64R2-NEXT:    sll $3, $1, 3
4057; MIPS64R2-NEXT:    ori $1, $zero, 255
4058; MIPS64R2-NEXT:    sllv $5, $1, $3
4059; MIPS64R2-NEXT:    nor $6, $zero, $5
4060; MIPS64R2-NEXT:    sllv $4, $4, $3
4061; MIPS64R2-NEXT:  .LBB11_1: # %entry
4062; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
4063; MIPS64R2-NEXT:    ll $7, 0($2)
4064; MIPS64R2-NEXT:    and $8, $4, $5
4065; MIPS64R2-NEXT:    and $9, $7, $6
4066; MIPS64R2-NEXT:    or $9, $9, $8
4067; MIPS64R2-NEXT:    sc $9, 0($2)
4068; MIPS64R2-NEXT:    beqz $9, .LBB11_1
4069; MIPS64R2-NEXT:    nop
4070; MIPS64R2-NEXT:  # %bb.2: # %entry
4071; MIPS64R2-NEXT:    and $1, $7, $5
4072; MIPS64R2-NEXT:    srlv $1, $1, $3
4073; MIPS64R2-NEXT:    seb $1, $1
4074; MIPS64R2-NEXT:  # %bb.3: # %entry
4075; MIPS64R2-NEXT:    jr $ra
4076; MIPS64R2-NEXT:    seb $2, $1
4077;
4078; MIPS64R6-LABEL: AtomicSwap8:
4079; MIPS64R6:       # %bb.0: # %entry
4080; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4081; MIPS64R6-NEXT:    daddu $1, $1, $25
4082; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4083; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
4084; MIPS64R6-NEXT:    daddiu $2, $zero, -4
4085; MIPS64R6-NEXT:    and $2, $1, $2
4086; MIPS64R6-NEXT:    andi $1, $1, 3
4087; MIPS64R6-NEXT:    sll $3, $1, 3
4088; MIPS64R6-NEXT:    ori $1, $zero, 255
4089; MIPS64R6-NEXT:    sllv $5, $1, $3
4090; MIPS64R6-NEXT:    nor $6, $zero, $5
4091; MIPS64R6-NEXT:    sllv $4, $4, $3
4092; MIPS64R6-NEXT:  .LBB11_1: # %entry
4093; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
4094; MIPS64R6-NEXT:    ll $7, 0($2)
4095; MIPS64R6-NEXT:    and $8, $4, $5
4096; MIPS64R6-NEXT:    and $9, $7, $6
4097; MIPS64R6-NEXT:    or $9, $9, $8
4098; MIPS64R6-NEXT:    sc $9, 0($2)
4099; MIPS64R6-NEXT:    beqzc $9, .LBB11_1
4100; MIPS64R6-NEXT:  # %bb.2: # %entry
4101; MIPS64R6-NEXT:    and $1, $7, $5
4102; MIPS64R6-NEXT:    srlv $1, $1, $3
4103; MIPS64R6-NEXT:    seb $1, $1
4104; MIPS64R6-NEXT:  # %bb.3: # %entry
4105; MIPS64R6-NEXT:    jr $ra
4106; MIPS64R6-NEXT:    seb $2, $1
4107;
4108; MIPS64R6O0-LABEL: AtomicSwap8:
4109; MIPS64R6O0:       # %bb.0: # %entry
4110; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
4111; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap8)))
4112; MIPS64R6O0-NEXT:    daddu $1, $1, $25
4113; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap8)))
4114; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
4115; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
4116; MIPS64R6O0-NEXT:    daddiu $2, $zero, -4
4117; MIPS64R6O0-NEXT:    and $2, $1, $2
4118; MIPS64R6O0-NEXT:    andi $1, $1, 3
4119; MIPS64R6O0-NEXT:    xori $1, $1, 3
4120; MIPS64R6O0-NEXT:    sll $1, $1, 3
4121; MIPS64R6O0-NEXT:    ori $3, $zero, 255
4122; MIPS64R6O0-NEXT:    sllv $3, $3, $1
4123; MIPS64R6O0-NEXT:    nor $5, $zero, $3
4124; MIPS64R6O0-NEXT:    sllv $4, $4, $1
4125; MIPS64R6O0-NEXT:  .LBB11_1: # %entry
4126; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4127; MIPS64R6O0-NEXT:    ll $7, 0($2)
4128; MIPS64R6O0-NEXT:    and $8, $4, $3
4129; MIPS64R6O0-NEXT:    and $9, $7, $5
4130; MIPS64R6O0-NEXT:    or $9, $9, $8
4131; MIPS64R6O0-NEXT:    sc $9, 0($2)
4132; MIPS64R6O0-NEXT:    beqzc $9, .LBB11_1
4133; MIPS64R6O0-NEXT:  # %bb.2: # %entry
4134; MIPS64R6O0-NEXT:    and $6, $7, $3
4135; MIPS64R6O0-NEXT:    srlv $6, $6, $1
4136; MIPS64R6O0-NEXT:    seb $6, $6
4137; MIPS64R6O0-NEXT:  # %bb.3: # %entry
4138; MIPS64R6O0-NEXT:    sw $6, 12($sp) # 4-byte Folded Spill
4139; MIPS64R6O0-NEXT:  # %bb.4: # %entry
4140; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
4141; MIPS64R6O0-NEXT:    seb $2, $1
4142; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
4143; MIPS64R6O0-NEXT:    jrc $ra
4144;
4145; MM32-LABEL: AtomicSwap8:
4146; MM32:       # %bb.0: # %entry
4147; MM32-NEXT:    lui $2, %hi(_gp_disp)
4148; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4149; MM32-NEXT:    addu $2, $2, $25
4150; MM32-NEXT:    lw $1, %got(y)($2)
4151; MM32-NEXT:    addiu $2, $zero, -4
4152; MM32-NEXT:    and $2, $1, $2
4153; MM32-NEXT:    andi $1, $1, 3
4154; MM32-NEXT:    sll $3, $1, 3
4155; MM32-NEXT:    ori $1, $zero, 255
4156; MM32-NEXT:    sllv $5, $1, $3
4157; MM32-NEXT:    nor $6, $zero, $5
4158; MM32-NEXT:    sllv $4, $4, $3
4159; MM32-NEXT:  $BB11_1: # %entry
4160; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
4161; MM32-NEXT:    ll $7, 0($2)
4162; MM32-NEXT:    and $8, $4, $5
4163; MM32-NEXT:    and $9, $7, $6
4164; MM32-NEXT:    or $9, $9, $8
4165; MM32-NEXT:    sc $9, 0($2)
4166; MM32-NEXT:    beqzc $9, $BB11_1
4167; MM32-NEXT:  # %bb.2: # %entry
4168; MM32-NEXT:    and $1, $7, $5
4169; MM32-NEXT:    srlv $1, $1, $3
4170; MM32-NEXT:    seb $1, $1
4171; MM32-NEXT:  # %bb.3: # %entry
4172; MM32-NEXT:    jr $ra
4173; MM32-NEXT:    seb $2, $1
4174;
4175; O1-LABEL: AtomicSwap8:
4176; O1:       # %bb.0: # %entry
4177; O1-NEXT:    lui $2, %hi(_gp_disp)
4178; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
4179; O1-NEXT:    addu $1, $2, $25
4180; O1-NEXT:    lw $1, %got(y)($1)
4181; O1-NEXT:    addiu $2, $zero, -4
4182; O1-NEXT:    and $2, $1, $2
4183; O1-NEXT:    andi $1, $1, 3
4184; O1-NEXT:    sll $3, $1, 3
4185; O1-NEXT:    ori $1, $zero, 255
4186; O1-NEXT:    sllv $5, $1, $3
4187; O1-NEXT:    nor $6, $zero, $5
4188; O1-NEXT:    sllv $4, $4, $3
4189; O1-NEXT:  $BB11_1: # %entry
4190; O1-NEXT:    # =>This Inner Loop Header: Depth=1
4191; O1-NEXT:    ll $7, 0($2)
4192; O1-NEXT:    and $8, $4, $5
4193; O1-NEXT:    and $9, $7, $6
4194; O1-NEXT:    or $9, $9, $8
4195; O1-NEXT:    sc $9, 0($2)
4196; O1-NEXT:    beqz $9, $BB11_1
4197; O1-NEXT:    nop
4198; O1-NEXT:  # %bb.2: # %entry
4199; O1-NEXT:    and $1, $7, $5
4200; O1-NEXT:    srlv $1, $1, $3
4201; O1-NEXT:    sll $1, $1, 24
4202; O1-NEXT:    sra $1, $1, 24
4203; O1-NEXT:  # %bb.3: # %entry
4204; O1-NEXT:    sll $1, $1, 24
4205; O1-NEXT:    jr $ra
4206; O1-NEXT:    sra $2, $1, 24
4207;
4208; O2-LABEL: AtomicSwap8:
4209; O2:       # %bb.0: # %entry
4210; O2-NEXT:    lui $2, %hi(_gp_disp)
4211; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4212; O2-NEXT:    addu $1, $2, $25
4213; O2-NEXT:    lw $1, %got(y)($1)
4214; O2-NEXT:    addiu $2, $zero, -4
4215; O2-NEXT:    and $2, $1, $2
4216; O2-NEXT:    andi $1, $1, 3
4217; O2-NEXT:    sll $3, $1, 3
4218; O2-NEXT:    ori $1, $zero, 255
4219; O2-NEXT:    sllv $5, $1, $3
4220; O2-NEXT:    nor $6, $zero, $5
4221; O2-NEXT:    sllv $4, $4, $3
4222; O2-NEXT:  $BB11_1: # %entry
4223; O2-NEXT:    # =>This Inner Loop Header: Depth=1
4224; O2-NEXT:    ll $7, 0($2)
4225; O2-NEXT:    and $8, $4, $5
4226; O2-NEXT:    and $9, $7, $6
4227; O2-NEXT:    or $9, $9, $8
4228; O2-NEXT:    sc $9, 0($2)
4229; O2-NEXT:    beqz $9, $BB11_1
4230; O2-NEXT:    nop
4231; O2-NEXT:  # %bb.2: # %entry
4232; O2-NEXT:    and $1, $7, $5
4233; O2-NEXT:    srlv $1, $1, $3
4234; O2-NEXT:    sll $1, $1, 24
4235; O2-NEXT:    sra $1, $1, 24
4236; O2-NEXT:  # %bb.3: # %entry
4237; O2-NEXT:    sll $1, $1, 24
4238; O2-NEXT:    jr $ra
4239; O2-NEXT:    sra $2, $1, 24
4240;
4241; O3-LABEL: AtomicSwap8:
4242; O3:       # %bb.0: # %entry
4243; O3-NEXT:    lui $2, %hi(_gp_disp)
4244; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
4245; O3-NEXT:    addu $1, $2, $25
4246; O3-NEXT:    addiu $2, $zero, -4
4247; O3-NEXT:    lw $1, %got(y)($1)
4248; O3-NEXT:    and $2, $1, $2
4249; O3-NEXT:    andi $1, $1, 3
4250; O3-NEXT:    sll $3, $1, 3
4251; O3-NEXT:    ori $1, $zero, 255
4252; O3-NEXT:    sllv $5, $1, $3
4253; O3-NEXT:    sllv $4, $4, $3
4254; O3-NEXT:    nor $6, $zero, $5
4255; O3-NEXT:  $BB11_1: # %entry
4256; O3-NEXT:    # =>This Inner Loop Header: Depth=1
4257; O3-NEXT:    ll $7, 0($2)
4258; O3-NEXT:    and $8, $4, $5
4259; O3-NEXT:    and $9, $7, $6
4260; O3-NEXT:    or $9, $9, $8
4261; O3-NEXT:    sc $9, 0($2)
4262; O3-NEXT:    beqz $9, $BB11_1
4263; O3-NEXT:    nop
4264; O3-NEXT:  # %bb.2: # %entry
4265; O3-NEXT:    and $1, $7, $5
4266; O3-NEXT:    srlv $1, $1, $3
4267; O3-NEXT:    sll $1, $1, 24
4268; O3-NEXT:    sra $1, $1, 24
4269; O3-NEXT:  # %bb.3: # %entry
4270; O3-NEXT:    sll $1, $1, 24
4271; O3-NEXT:    jr $ra
4272; O3-NEXT:    sra $2, $1, 24
4273;
4274; MIPS32EB-LABEL: AtomicSwap8:
4275; MIPS32EB:       # %bb.0: # %entry
4276; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
4277; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
4278; MIPS32EB-NEXT:    addu $1, $2, $25
4279; MIPS32EB-NEXT:    lw $1, %got(y)($1)
4280; MIPS32EB-NEXT:    addiu $2, $zero, -4
4281; MIPS32EB-NEXT:    and $2, $1, $2
4282; MIPS32EB-NEXT:    andi $1, $1, 3
4283; MIPS32EB-NEXT:    xori $1, $1, 3
4284; MIPS32EB-NEXT:    sll $3, $1, 3
4285; MIPS32EB-NEXT:    ori $1, $zero, 255
4286; MIPS32EB-NEXT:    sllv $5, $1, $3
4287; MIPS32EB-NEXT:    nor $6, $zero, $5
4288; MIPS32EB-NEXT:    sllv $4, $4, $3
4289; MIPS32EB-NEXT:  $BB11_1: # %entry
4290; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
4291; MIPS32EB-NEXT:    ll $7, 0($2)
4292; MIPS32EB-NEXT:    and $8, $4, $5
4293; MIPS32EB-NEXT:    and $9, $7, $6
4294; MIPS32EB-NEXT:    or $9, $9, $8
4295; MIPS32EB-NEXT:    sc $9, 0($2)
4296; MIPS32EB-NEXT:    beqz $9, $BB11_1
4297; MIPS32EB-NEXT:    nop
4298; MIPS32EB-NEXT:  # %bb.2: # %entry
4299; MIPS32EB-NEXT:    and $1, $7, $5
4300; MIPS32EB-NEXT:    srlv $1, $1, $3
4301; MIPS32EB-NEXT:    sll $1, $1, 24
4302; MIPS32EB-NEXT:    sra $1, $1, 24
4303; MIPS32EB-NEXT:  # %bb.3: # %entry
4304; MIPS32EB-NEXT:    sll $1, $1, 24
4305; MIPS32EB-NEXT:    jr $ra
4306; MIPS32EB-NEXT:    sra $2, $1, 24
4307entry:
4308  %0 = atomicrmw xchg i8* @y, i8 %newval monotonic
4309  ret i8 %0
4310}
4311
4312define signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind {
4313; MIPS32-LABEL: AtomicCmpSwap8:
4314; MIPS32:       # %bb.0: # %entry
4315; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
4316; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4317; MIPS32-NEXT:    addu $1, $2, $25
4318; MIPS32-NEXT:    lw $1, %got(y)($1)
4319; MIPS32-NEXT:    addiu $2, $zero, -4
4320; MIPS32-NEXT:    and $2, $1, $2
4321; MIPS32-NEXT:    andi $1, $1, 3
4322; MIPS32-NEXT:    sll $3, $1, 3
4323; MIPS32-NEXT:    ori $1, $zero, 255
4324; MIPS32-NEXT:    sllv $6, $1, $3
4325; MIPS32-NEXT:    nor $7, $zero, $6
4326; MIPS32-NEXT:    andi $1, $4, 255
4327; MIPS32-NEXT:    sllv $4, $1, $3
4328; MIPS32-NEXT:    andi $1, $5, 255
4329; MIPS32-NEXT:    sllv $5, $1, $3
4330; MIPS32-NEXT:  $BB12_1: # %entry
4331; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
4332; MIPS32-NEXT:    ll $8, 0($2)
4333; MIPS32-NEXT:    and $9, $8, $6
4334; MIPS32-NEXT:    bne $9, $4, $BB12_3
4335; MIPS32-NEXT:    nop
4336; MIPS32-NEXT:  # %bb.2: # %entry
4337; MIPS32-NEXT:    # in Loop: Header=BB12_1 Depth=1
4338; MIPS32-NEXT:    and $8, $8, $7
4339; MIPS32-NEXT:    or $8, $8, $5
4340; MIPS32-NEXT:    sc $8, 0($2)
4341; MIPS32-NEXT:    beqz $8, $BB12_1
4342; MIPS32-NEXT:    nop
4343; MIPS32-NEXT:  $BB12_3: # %entry
4344; MIPS32-NEXT:    srlv $1, $9, $3
4345; MIPS32-NEXT:    sll $1, $1, 24
4346; MIPS32-NEXT:    sra $1, $1, 24
4347; MIPS32-NEXT:  # %bb.4: # %entry
4348; MIPS32-NEXT:    sll $1, $1, 24
4349; MIPS32-NEXT:    jr $ra
4350; MIPS32-NEXT:    sra $2, $1, 24
4351;
4352; MIPS32O0-LABEL: AtomicCmpSwap8:
4353; MIPS32O0:       # %bb.0: # %entry
4354; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
4355; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
4356; MIPS32O0-NEXT:    addiu $sp, $sp, -8
4357; MIPS32O0-NEXT:    addu $1, $2, $25
4358; MIPS32O0-NEXT:    lw $1, %got(y)($1)
4359; MIPS32O0-NEXT:    addiu $2, $zero, -4
4360; MIPS32O0-NEXT:    and $2, $1, $2
4361; MIPS32O0-NEXT:    andi $1, $1, 3
4362; MIPS32O0-NEXT:    sll $1, $1, 3
4363; MIPS32O0-NEXT:    ori $3, $zero, 255
4364; MIPS32O0-NEXT:    sllv $3, $3, $1
4365; MIPS32O0-NEXT:    nor $6, $zero, $3
4366; MIPS32O0-NEXT:    andi $4, $4, 255
4367; MIPS32O0-NEXT:    sllv $4, $4, $1
4368; MIPS32O0-NEXT:    andi $5, $5, 255
4369; MIPS32O0-NEXT:    sllv $5, $5, $1
4370; MIPS32O0-NEXT:  $BB12_1: # %entry
4371; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
4372; MIPS32O0-NEXT:    ll $8, 0($2)
4373; MIPS32O0-NEXT:    and $9, $8, $3
4374; MIPS32O0-NEXT:    bne $9, $4, $BB12_3
4375; MIPS32O0-NEXT:    nop
4376; MIPS32O0-NEXT:  # %bb.2: # %entry
4377; MIPS32O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4378; MIPS32O0-NEXT:    and $8, $8, $6
4379; MIPS32O0-NEXT:    or $8, $8, $5
4380; MIPS32O0-NEXT:    sc $8, 0($2)
4381; MIPS32O0-NEXT:    beqz $8, $BB12_1
4382; MIPS32O0-NEXT:    nop
4383; MIPS32O0-NEXT:  $BB12_3: # %entry
4384; MIPS32O0-NEXT:    srlv $7, $9, $1
4385; MIPS32O0-NEXT:    sll $7, $7, 24
4386; MIPS32O0-NEXT:    sra $7, $7, 24
4387; MIPS32O0-NEXT:  # %bb.4: # %entry
4388; MIPS32O0-NEXT:    sw $7, 4($sp) # 4-byte Folded Spill
4389; MIPS32O0-NEXT:  # %bb.5: # %entry
4390; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
4391; MIPS32O0-NEXT:    sll $2, $1, 24
4392; MIPS32O0-NEXT:    sra $2, $2, 24
4393; MIPS32O0-NEXT:    addiu $sp, $sp, 8
4394; MIPS32O0-NEXT:    jr $ra
4395; MIPS32O0-NEXT:    nop
4396;
4397; MIPS32R2-LABEL: AtomicCmpSwap8:
4398; MIPS32R2:       # %bb.0: # %entry
4399; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
4400; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4401; MIPS32R2-NEXT:    addu $1, $2, $25
4402; MIPS32R2-NEXT:    lw $1, %got(y)($1)
4403; MIPS32R2-NEXT:    addiu $2, $zero, -4
4404; MIPS32R2-NEXT:    and $3, $1, $2
4405; MIPS32R2-NEXT:    andi $1, $1, 3
4406; MIPS32R2-NEXT:    sll $1, $1, 3
4407; MIPS32R2-NEXT:    ori $2, $zero, 255
4408; MIPS32R2-NEXT:    sllv $6, $2, $1
4409; MIPS32R2-NEXT:    nor $7, $zero, $6
4410; MIPS32R2-NEXT:    andi $2, $4, 255
4411; MIPS32R2-NEXT:    sllv $4, $2, $1
4412; MIPS32R2-NEXT:    andi $2, $5, 255
4413; MIPS32R2-NEXT:    sllv $5, $2, $1
4414; MIPS32R2-NEXT:  $BB12_1: # %entry
4415; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
4416; MIPS32R2-NEXT:    ll $8, 0($3)
4417; MIPS32R2-NEXT:    and $9, $8, $6
4418; MIPS32R2-NEXT:    bne $9, $4, $BB12_3
4419; MIPS32R2-NEXT:    nop
4420; MIPS32R2-NEXT:  # %bb.2: # %entry
4421; MIPS32R2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4422; MIPS32R2-NEXT:    and $8, $8, $7
4423; MIPS32R2-NEXT:    or $8, $8, $5
4424; MIPS32R2-NEXT:    sc $8, 0($3)
4425; MIPS32R2-NEXT:    beqz $8, $BB12_1
4426; MIPS32R2-NEXT:    nop
4427; MIPS32R2-NEXT:  $BB12_3: # %entry
4428; MIPS32R2-NEXT:    srlv $2, $9, $1
4429; MIPS32R2-NEXT:    seb $2, $2
4430; MIPS32R2-NEXT:  # %bb.4: # %entry
4431; MIPS32R2-NEXT:    jr $ra
4432; MIPS32R2-NEXT:    nop
4433;
4434; MIPS32R6-LABEL: AtomicCmpSwap8:
4435; MIPS32R6:       # %bb.0: # %entry
4436; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
4437; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
4438; MIPS32R6-NEXT:    addu $1, $2, $25
4439; MIPS32R6-NEXT:    lw $1, %got(y)($1)
4440; MIPS32R6-NEXT:    addiu $2, $zero, -4
4441; MIPS32R6-NEXT:    and $3, $1, $2
4442; MIPS32R6-NEXT:    andi $1, $1, 3
4443; MIPS32R6-NEXT:    sll $1, $1, 3
4444; MIPS32R6-NEXT:    ori $2, $zero, 255
4445; MIPS32R6-NEXT:    sllv $6, $2, $1
4446; MIPS32R6-NEXT:    nor $7, $zero, $6
4447; MIPS32R6-NEXT:    andi $2, $4, 255
4448; MIPS32R6-NEXT:    sllv $4, $2, $1
4449; MIPS32R6-NEXT:    andi $2, $5, 255
4450; MIPS32R6-NEXT:    sllv $5, $2, $1
4451; MIPS32R6-NEXT:  $BB12_1: # %entry
4452; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
4453; MIPS32R6-NEXT:    ll $8, 0($3)
4454; MIPS32R6-NEXT:    and $9, $8, $6
4455; MIPS32R6-NEXT:    bnec $9, $4, $BB12_3
4456; MIPS32R6-NEXT:  # %bb.2: # %entry
4457; MIPS32R6-NEXT:    # in Loop: Header=BB12_1 Depth=1
4458; MIPS32R6-NEXT:    and $8, $8, $7
4459; MIPS32R6-NEXT:    or $8, $8, $5
4460; MIPS32R6-NEXT:    sc $8, 0($3)
4461; MIPS32R6-NEXT:    beqzc $8, $BB12_1
4462; MIPS32R6-NEXT:  $BB12_3: # %entry
4463; MIPS32R6-NEXT:    srlv $2, $9, $1
4464; MIPS32R6-NEXT:    seb $2, $2
4465; MIPS32R6-NEXT:  # %bb.4: # %entry
4466; MIPS32R6-NEXT:    jrc $ra
4467;
4468; MIPS32R6O0-LABEL: AtomicCmpSwap8:
4469; MIPS32R6O0:       # %bb.0: # %entry
4470; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
4471; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
4472; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
4473; MIPS32R6O0-NEXT:    addu $1, $2, $25
4474; MIPS32R6O0-NEXT:    move $2, $5
4475; MIPS32R6O0-NEXT:    move $3, $4
4476; MIPS32R6O0-NEXT:    lw $1, %got(y)($1)
4477; MIPS32R6O0-NEXT:    addiu $6, $zero, -4
4478; MIPS32R6O0-NEXT:    and $6, $1, $6
4479; MIPS32R6O0-NEXT:    andi $1, $1, 3
4480; MIPS32R6O0-NEXT:    sll $1, $1, 3
4481; MIPS32R6O0-NEXT:    ori $7, $zero, 255
4482; MIPS32R6O0-NEXT:    sllv $7, $7, $1
4483; MIPS32R6O0-NEXT:    nor $8, $zero, $7
4484; MIPS32R6O0-NEXT:    andi $4, $4, 255
4485; MIPS32R6O0-NEXT:    sllv $4, $4, $1
4486; MIPS32R6O0-NEXT:    andi $5, $5, 255
4487; MIPS32R6O0-NEXT:    sllv $5, $5, $1
4488; MIPS32R6O0-NEXT:  $BB12_1: # %entry
4489; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4490; MIPS32R6O0-NEXT:    ll $10, 0($6)
4491; MIPS32R6O0-NEXT:    and $11, $10, $7
4492; MIPS32R6O0-NEXT:    bnec $11, $4, $BB12_3
4493; MIPS32R6O0-NEXT:  # %bb.2: # %entry
4494; MIPS32R6O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4495; MIPS32R6O0-NEXT:    and $10, $10, $8
4496; MIPS32R6O0-NEXT:    or $10, $10, $5
4497; MIPS32R6O0-NEXT:    sc $10, 0($6)
4498; MIPS32R6O0-NEXT:    beqzc $10, $BB12_1
4499; MIPS32R6O0-NEXT:  $BB12_3: # %entry
4500; MIPS32R6O0-NEXT:    srlv $9, $11, $1
4501; MIPS32R6O0-NEXT:    seb $9, $9
4502; MIPS32R6O0-NEXT:  # %bb.4: # %entry
4503; MIPS32R6O0-NEXT:    sw $9, 4($sp) # 4-byte Folded Spill
4504; MIPS32R6O0-NEXT:  # %bb.5: # %entry
4505; MIPS32R6O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
4506; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
4507; MIPS32R6O0-NEXT:    jrc $ra
4508;
4509; MIPS4-LABEL: AtomicCmpSwap8:
4510; MIPS4:       # %bb.0: # %entry
4511; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4512; MIPS4-NEXT:    daddu $1, $1, $25
4513; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4514; MIPS4-NEXT:    ld $1, %got_disp(y)($1)
4515; MIPS4-NEXT:    daddiu $2, $zero, -4
4516; MIPS4-NEXT:    and $2, $1, $2
4517; MIPS4-NEXT:    andi $1, $1, 3
4518; MIPS4-NEXT:    sll $3, $1, 3
4519; MIPS4-NEXT:    ori $1, $zero, 255
4520; MIPS4-NEXT:    sllv $6, $1, $3
4521; MIPS4-NEXT:    nor $7, $zero, $6
4522; MIPS4-NEXT:    andi $1, $4, 255
4523; MIPS4-NEXT:    sllv $4, $1, $3
4524; MIPS4-NEXT:    andi $1, $5, 255
4525; MIPS4-NEXT:    sllv $5, $1, $3
4526; MIPS4-NEXT:  .LBB12_1: # %entry
4527; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
4528; MIPS4-NEXT:    ll $8, 0($2)
4529; MIPS4-NEXT:    and $9, $8, $6
4530; MIPS4-NEXT:    bne $9, $4, .LBB12_3
4531; MIPS4-NEXT:    nop
4532; MIPS4-NEXT:  # %bb.2: # %entry
4533; MIPS4-NEXT:    # in Loop: Header=BB12_1 Depth=1
4534; MIPS4-NEXT:    and $8, $8, $7
4535; MIPS4-NEXT:    or $8, $8, $5
4536; MIPS4-NEXT:    sc $8, 0($2)
4537; MIPS4-NEXT:    beqz $8, .LBB12_1
4538; MIPS4-NEXT:    nop
4539; MIPS4-NEXT:  .LBB12_3: # %entry
4540; MIPS4-NEXT:    srlv $1, $9, $3
4541; MIPS4-NEXT:    sll $1, $1, 24
4542; MIPS4-NEXT:    sra $1, $1, 24
4543; MIPS4-NEXT:  # %bb.4: # %entry
4544; MIPS4-NEXT:    sll $1, $1, 24
4545; MIPS4-NEXT:    jr $ra
4546; MIPS4-NEXT:    sra $2, $1, 24
4547;
4548; MIPS64-LABEL: AtomicCmpSwap8:
4549; MIPS64:       # %bb.0: # %entry
4550; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4551; MIPS64-NEXT:    daddu $1, $1, $25
4552; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4553; MIPS64-NEXT:    ld $1, %got_disp(y)($1)
4554; MIPS64-NEXT:    daddiu $2, $zero, -4
4555; MIPS64-NEXT:    and $2, $1, $2
4556; MIPS64-NEXT:    andi $1, $1, 3
4557; MIPS64-NEXT:    sll $3, $1, 3
4558; MIPS64-NEXT:    ori $1, $zero, 255
4559; MIPS64-NEXT:    sllv $6, $1, $3
4560; MIPS64-NEXT:    nor $7, $zero, $6
4561; MIPS64-NEXT:    andi $1, $4, 255
4562; MIPS64-NEXT:    sllv $4, $1, $3
4563; MIPS64-NEXT:    andi $1, $5, 255
4564; MIPS64-NEXT:    sllv $5, $1, $3
4565; MIPS64-NEXT:  .LBB12_1: # %entry
4566; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
4567; MIPS64-NEXT:    ll $8, 0($2)
4568; MIPS64-NEXT:    and $9, $8, $6
4569; MIPS64-NEXT:    bne $9, $4, .LBB12_3
4570; MIPS64-NEXT:    nop
4571; MIPS64-NEXT:  # %bb.2: # %entry
4572; MIPS64-NEXT:    # in Loop: Header=BB12_1 Depth=1
4573; MIPS64-NEXT:    and $8, $8, $7
4574; MIPS64-NEXT:    or $8, $8, $5
4575; MIPS64-NEXT:    sc $8, 0($2)
4576; MIPS64-NEXT:    beqz $8, .LBB12_1
4577; MIPS64-NEXT:    nop
4578; MIPS64-NEXT:  .LBB12_3: # %entry
4579; MIPS64-NEXT:    srlv $1, $9, $3
4580; MIPS64-NEXT:    sll $1, $1, 24
4581; MIPS64-NEXT:    sra $1, $1, 24
4582; MIPS64-NEXT:  # %bb.4: # %entry
4583; MIPS64-NEXT:    sll $1, $1, 24
4584; MIPS64-NEXT:    jr $ra
4585; MIPS64-NEXT:    sra $2, $1, 24
4586;
4587; MIPS64R2-LABEL: AtomicCmpSwap8:
4588; MIPS64R2:       # %bb.0: # %entry
4589; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4590; MIPS64R2-NEXT:    daddu $1, $1, $25
4591; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4592; MIPS64R2-NEXT:    ld $1, %got_disp(y)($1)
4593; MIPS64R2-NEXT:    daddiu $2, $zero, -4
4594; MIPS64R2-NEXT:    and $3, $1, $2
4595; MIPS64R2-NEXT:    andi $1, $1, 3
4596; MIPS64R2-NEXT:    sll $1, $1, 3
4597; MIPS64R2-NEXT:    ori $2, $zero, 255
4598; MIPS64R2-NEXT:    sllv $6, $2, $1
4599; MIPS64R2-NEXT:    nor $7, $zero, $6
4600; MIPS64R2-NEXT:    andi $2, $4, 255
4601; MIPS64R2-NEXT:    sllv $4, $2, $1
4602; MIPS64R2-NEXT:    andi $2, $5, 255
4603; MIPS64R2-NEXT:    sllv $5, $2, $1
4604; MIPS64R2-NEXT:  .LBB12_1: # %entry
4605; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
4606; MIPS64R2-NEXT:    ll $8, 0($3)
4607; MIPS64R2-NEXT:    and $9, $8, $6
4608; MIPS64R2-NEXT:    bne $9, $4, .LBB12_3
4609; MIPS64R2-NEXT:    nop
4610; MIPS64R2-NEXT:  # %bb.2: # %entry
4611; MIPS64R2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4612; MIPS64R2-NEXT:    and $8, $8, $7
4613; MIPS64R2-NEXT:    or $8, $8, $5
4614; MIPS64R2-NEXT:    sc $8, 0($3)
4615; MIPS64R2-NEXT:    beqz $8, .LBB12_1
4616; MIPS64R2-NEXT:    nop
4617; MIPS64R2-NEXT:  .LBB12_3: # %entry
4618; MIPS64R2-NEXT:    srlv $2, $9, $1
4619; MIPS64R2-NEXT:    seb $2, $2
4620; MIPS64R2-NEXT:  # %bb.4: # %entry
4621; MIPS64R2-NEXT:    jr $ra
4622; MIPS64R2-NEXT:    nop
4623;
4624; MIPS64R6-LABEL: AtomicCmpSwap8:
4625; MIPS64R6:       # %bb.0: # %entry
4626; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4627; MIPS64R6-NEXT:    daddu $1, $1, $25
4628; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4629; MIPS64R6-NEXT:    ld $1, %got_disp(y)($1)
4630; MIPS64R6-NEXT:    daddiu $2, $zero, -4
4631; MIPS64R6-NEXT:    and $3, $1, $2
4632; MIPS64R6-NEXT:    andi $1, $1, 3
4633; MIPS64R6-NEXT:    sll $1, $1, 3
4634; MIPS64R6-NEXT:    ori $2, $zero, 255
4635; MIPS64R6-NEXT:    sllv $6, $2, $1
4636; MIPS64R6-NEXT:    nor $7, $zero, $6
4637; MIPS64R6-NEXT:    andi $2, $4, 255
4638; MIPS64R6-NEXT:    sllv $4, $2, $1
4639; MIPS64R6-NEXT:    andi $2, $5, 255
4640; MIPS64R6-NEXT:    sllv $5, $2, $1
4641; MIPS64R6-NEXT:  .LBB12_1: # %entry
4642; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
4643; MIPS64R6-NEXT:    ll $8, 0($3)
4644; MIPS64R6-NEXT:    and $9, $8, $6
4645; MIPS64R6-NEXT:    bnec $9, $4, .LBB12_3
4646; MIPS64R6-NEXT:  # %bb.2: # %entry
4647; MIPS64R6-NEXT:    # in Loop: Header=BB12_1 Depth=1
4648; MIPS64R6-NEXT:    and $8, $8, $7
4649; MIPS64R6-NEXT:    or $8, $8, $5
4650; MIPS64R6-NEXT:    sc $8, 0($3)
4651; MIPS64R6-NEXT:    beqzc $8, .LBB12_1
4652; MIPS64R6-NEXT:  .LBB12_3: # %entry
4653; MIPS64R6-NEXT:    srlv $2, $9, $1
4654; MIPS64R6-NEXT:    seb $2, $2
4655; MIPS64R6-NEXT:  # %bb.4: # %entry
4656; MIPS64R6-NEXT:    jrc $ra
4657;
4658; MIPS64R6O0-LABEL: AtomicCmpSwap8:
4659; MIPS64R6O0:       # %bb.0: # %entry
4660; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
4661; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap8)))
4662; MIPS64R6O0-NEXT:    daddu $1, $1, $25
4663; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap8)))
4664; MIPS64R6O0-NEXT:    # kill: def $a1 killed $a1 killed $a1_64
4665; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
4666; MIPS64R6O0-NEXT:    ld $1, %got_disp(y)($1)
4667; MIPS64R6O0-NEXT:    daddiu $2, $zero, -4
4668; MIPS64R6O0-NEXT:    and $2, $1, $2
4669; MIPS64R6O0-NEXT:    andi $1, $1, 3
4670; MIPS64R6O0-NEXT:    xori $1, $1, 3
4671; MIPS64R6O0-NEXT:    sll $1, $1, 3
4672; MIPS64R6O0-NEXT:    ori $3, $zero, 255
4673; MIPS64R6O0-NEXT:    sllv $3, $3, $1
4674; MIPS64R6O0-NEXT:    nor $6, $zero, $3
4675; MIPS64R6O0-NEXT:    andi $4, $4, 255
4676; MIPS64R6O0-NEXT:    sllv $4, $4, $1
4677; MIPS64R6O0-NEXT:    andi $5, $5, 255
4678; MIPS64R6O0-NEXT:    sllv $5, $5, $1
4679; MIPS64R6O0-NEXT:  .LBB12_1: # %entry
4680; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
4681; MIPS64R6O0-NEXT:    ll $8, 0($2)
4682; MIPS64R6O0-NEXT:    and $9, $8, $3
4683; MIPS64R6O0-NEXT:    bnec $9, $4, .LBB12_3
4684; MIPS64R6O0-NEXT:  # %bb.2: # %entry
4685; MIPS64R6O0-NEXT:    # in Loop: Header=BB12_1 Depth=1
4686; MIPS64R6O0-NEXT:    and $8, $8, $6
4687; MIPS64R6O0-NEXT:    or $8, $8, $5
4688; MIPS64R6O0-NEXT:    sc $8, 0($2)
4689; MIPS64R6O0-NEXT:    beqzc $8, .LBB12_1
4690; MIPS64R6O0-NEXT:  .LBB12_3: # %entry
4691; MIPS64R6O0-NEXT:    srlv $7, $9, $1
4692; MIPS64R6O0-NEXT:    seb $7, $7
4693; MIPS64R6O0-NEXT:  # %bb.4: # %entry
4694; MIPS64R6O0-NEXT:    sw $7, 12($sp) # 4-byte Folded Spill
4695; MIPS64R6O0-NEXT:  # %bb.5: # %entry
4696; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
4697; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
4698; MIPS64R6O0-NEXT:    jrc $ra
4699;
4700; MM32-LABEL: AtomicCmpSwap8:
4701; MM32:       # %bb.0: # %entry
4702; MM32-NEXT:    lui $2, %hi(_gp_disp)
4703; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
4704; MM32-NEXT:    addu $2, $2, $25
4705; MM32-NEXT:    lw $1, %got(y)($2)
4706; MM32-NEXT:    addiu $2, $zero, -4
4707; MM32-NEXT:    and $3, $1, $2
4708; MM32-NEXT:    andi $1, $1, 3
4709; MM32-NEXT:    sll $1, $1, 3
4710; MM32-NEXT:    ori $2, $zero, 255
4711; MM32-NEXT:    sllv $6, $2, $1
4712; MM32-NEXT:    nor $7, $zero, $6
4713; MM32-NEXT:    andi $2, $4, 255
4714; MM32-NEXT:    sllv $4, $2, $1
4715; MM32-NEXT:    andi $2, $5, 255
4716; MM32-NEXT:    sllv $5, $2, $1
4717; MM32-NEXT:  $BB12_1: # %entry
4718; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
4719; MM32-NEXT:    ll $8, 0($3)
4720; MM32-NEXT:    and $9, $8, $6
4721; MM32-NEXT:    bne $9, $4, $BB12_3
4722; MM32-NEXT:    nop
4723; MM32-NEXT:  # %bb.2: # %entry
4724; MM32-NEXT:    # in Loop: Header=BB12_1 Depth=1
4725; MM32-NEXT:    and $8, $8, $7
4726; MM32-NEXT:    or $8, $8, $5
4727; MM32-NEXT:    sc $8, 0($3)
4728; MM32-NEXT:    beqzc $8, $BB12_1
4729; MM32-NEXT:  $BB12_3: # %entry
4730; MM32-NEXT:    srlv $2, $9, $1
4731; MM32-NEXT:    seb $2, $2
4732; MM32-NEXT:  # %bb.4: # %entry
4733; MM32-NEXT:    jrc $ra
4734;
4735; O1-LABEL: AtomicCmpSwap8:
4736; O1:       # %bb.0: # %entry
4737; O1-NEXT:    lui $2, %hi(_gp_disp)
4738; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
4739; O1-NEXT:    addu $1, $2, $25
4740; O1-NEXT:    lw $1, %got(y)($1)
4741; O1-NEXT:    addiu $2, $zero, -4
4742; O1-NEXT:    and $2, $1, $2
4743; O1-NEXT:    andi $1, $1, 3
4744; O1-NEXT:    sll $3, $1, 3
4745; O1-NEXT:    ori $1, $zero, 255
4746; O1-NEXT:    sllv $6, $1, $3
4747; O1-NEXT:    nor $7, $zero, $6
4748; O1-NEXT:    andi $1, $4, 255
4749; O1-NEXT:    sllv $4, $1, $3
4750; O1-NEXT:    andi $1, $5, 255
4751; O1-NEXT:    sllv $5, $1, $3
4752; O1-NEXT:  $BB12_1: # %entry
4753; O1-NEXT:    # =>This Inner Loop Header: Depth=1
4754; O1-NEXT:    ll $8, 0($2)
4755; O1-NEXT:    and $9, $8, $6
4756; O1-NEXT:    bne $9, $4, $BB12_3
4757; O1-NEXT:    nop
4758; O1-NEXT:  # %bb.2: # %entry
4759; O1-NEXT:    # in Loop: Header=BB12_1 Depth=1
4760; O1-NEXT:    and $8, $8, $7
4761; O1-NEXT:    or $8, $8, $5
4762; O1-NEXT:    sc $8, 0($2)
4763; O1-NEXT:    beqz $8, $BB12_1
4764; O1-NEXT:    nop
4765; O1-NEXT:  $BB12_3: # %entry
4766; O1-NEXT:    srlv $1, $9, $3
4767; O1-NEXT:    sll $1, $1, 24
4768; O1-NEXT:    sra $1, $1, 24
4769; O1-NEXT:  # %bb.4: # %entry
4770; O1-NEXT:    sll $1, $1, 24
4771; O1-NEXT:    jr $ra
4772; O1-NEXT:    sra $2, $1, 24
4773;
4774; O2-LABEL: AtomicCmpSwap8:
4775; O2:       # %bb.0: # %entry
4776; O2-NEXT:    lui $2, %hi(_gp_disp)
4777; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
4778; O2-NEXT:    addu $1, $2, $25
4779; O2-NEXT:    lw $1, %got(y)($1)
4780; O2-NEXT:    addiu $2, $zero, -4
4781; O2-NEXT:    and $2, $1, $2
4782; O2-NEXT:    andi $1, $1, 3
4783; O2-NEXT:    sll $3, $1, 3
4784; O2-NEXT:    ori $1, $zero, 255
4785; O2-NEXT:    sllv $6, $1, $3
4786; O2-NEXT:    nor $7, $zero, $6
4787; O2-NEXT:    andi $1, $4, 255
4788; O2-NEXT:    sllv $4, $1, $3
4789; O2-NEXT:    andi $1, $5, 255
4790; O2-NEXT:    sllv $5, $1, $3
4791; O2-NEXT:  $BB12_1: # %entry
4792; O2-NEXT:    # =>This Inner Loop Header: Depth=1
4793; O2-NEXT:    ll $8, 0($2)
4794; O2-NEXT:    and $9, $8, $6
4795; O2-NEXT:    bne $9, $4, $BB12_3
4796; O2-NEXT:    nop
4797; O2-NEXT:  # %bb.2: # %entry
4798; O2-NEXT:    # in Loop: Header=BB12_1 Depth=1
4799; O2-NEXT:    and $8, $8, $7
4800; O2-NEXT:    or $8, $8, $5
4801; O2-NEXT:    sc $8, 0($2)
4802; O2-NEXT:    beqz $8, $BB12_1
4803; O2-NEXT:    nop
4804; O2-NEXT:  $BB12_3: # %entry
4805; O2-NEXT:    srlv $1, $9, $3
4806; O2-NEXT:    sll $1, $1, 24
4807; O2-NEXT:    sra $1, $1, 24
4808; O2-NEXT:  # %bb.4: # %entry
4809; O2-NEXT:    sll $1, $1, 24
4810; O2-NEXT:    jr $ra
4811; O2-NEXT:    sra $2, $1, 24
4812;
4813; O3-LABEL: AtomicCmpSwap8:
4814; O3:       # %bb.0: # %entry
4815; O3-NEXT:    lui $2, %hi(_gp_disp)
4816; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
4817; O3-NEXT:    addu $1, $2, $25
4818; O3-NEXT:    addiu $2, $zero, -4
4819; O3-NEXT:    lw $1, %got(y)($1)
4820; O3-NEXT:    and $2, $1, $2
4821; O3-NEXT:    andi $1, $1, 3
4822; O3-NEXT:    sll $3, $1, 3
4823; O3-NEXT:    ori $1, $zero, 255
4824; O3-NEXT:    sllv $6, $1, $3
4825; O3-NEXT:    andi $1, $4, 255
4826; O3-NEXT:    sllv $4, $1, $3
4827; O3-NEXT:    andi $1, $5, 255
4828; O3-NEXT:    nor $7, $zero, $6
4829; O3-NEXT:    sllv $5, $1, $3
4830; O3-NEXT:  $BB12_1: # %entry
4831; O3-NEXT:    # =>This Inner Loop Header: Depth=1
4832; O3-NEXT:    ll $8, 0($2)
4833; O3-NEXT:    and $9, $8, $6
4834; O3-NEXT:    bne $9, $4, $BB12_3
4835; O3-NEXT:    nop
4836; O3-NEXT:  # %bb.2: # %entry
4837; O3-NEXT:    # in Loop: Header=BB12_1 Depth=1
4838; O3-NEXT:    and $8, $8, $7
4839; O3-NEXT:    or $8, $8, $5
4840; O3-NEXT:    sc $8, 0($2)
4841; O3-NEXT:    beqz $8, $BB12_1
4842; O3-NEXT:    nop
4843; O3-NEXT:  $BB12_3: # %entry
4844; O3-NEXT:    srlv $1, $9, $3
4845; O3-NEXT:    sll $1, $1, 24
4846; O3-NEXT:    sra $1, $1, 24
4847; O3-NEXT:  # %bb.4: # %entry
4848; O3-NEXT:    sll $1, $1, 24
4849; O3-NEXT:    jr $ra
4850; O3-NEXT:    sra $2, $1, 24
4851;
4852; MIPS32EB-LABEL: AtomicCmpSwap8:
4853; MIPS32EB:       # %bb.0: # %entry
4854; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
4855; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
4856; MIPS32EB-NEXT:    addu $1, $2, $25
4857; MIPS32EB-NEXT:    lw $1, %got(y)($1)
4858; MIPS32EB-NEXT:    addiu $2, $zero, -4
4859; MIPS32EB-NEXT:    and $2, $1, $2
4860; MIPS32EB-NEXT:    andi $1, $1, 3
4861; MIPS32EB-NEXT:    xori $1, $1, 3
4862; MIPS32EB-NEXT:    sll $3, $1, 3
4863; MIPS32EB-NEXT:    ori $1, $zero, 255
4864; MIPS32EB-NEXT:    sllv $6, $1, $3
4865; MIPS32EB-NEXT:    nor $7, $zero, $6
4866; MIPS32EB-NEXT:    andi $1, $4, 255
4867; MIPS32EB-NEXT:    sllv $4, $1, $3
4868; MIPS32EB-NEXT:    andi $1, $5, 255
4869; MIPS32EB-NEXT:    sllv $5, $1, $3
4870; MIPS32EB-NEXT:  $BB12_1: # %entry
4871; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
4872; MIPS32EB-NEXT:    ll $8, 0($2)
4873; MIPS32EB-NEXT:    and $9, $8, $6
4874; MIPS32EB-NEXT:    bne $9, $4, $BB12_3
4875; MIPS32EB-NEXT:    nop
4876; MIPS32EB-NEXT:  # %bb.2: # %entry
4877; MIPS32EB-NEXT:    # in Loop: Header=BB12_1 Depth=1
4878; MIPS32EB-NEXT:    and $8, $8, $7
4879; MIPS32EB-NEXT:    or $8, $8, $5
4880; MIPS32EB-NEXT:    sc $8, 0($2)
4881; MIPS32EB-NEXT:    beqz $8, $BB12_1
4882; MIPS32EB-NEXT:    nop
4883; MIPS32EB-NEXT:  $BB12_3: # %entry
4884; MIPS32EB-NEXT:    srlv $1, $9, $3
4885; MIPS32EB-NEXT:    sll $1, $1, 24
4886; MIPS32EB-NEXT:    sra $1, $1, 24
4887; MIPS32EB-NEXT:  # %bb.4: # %entry
4888; MIPS32EB-NEXT:    sll $1, $1, 24
4889; MIPS32EB-NEXT:    jr $ra
4890; MIPS32EB-NEXT:    sra $2, $1, 24
4891entry:
4892  %pair0 = cmpxchg i8* @y, i8 %oldval, i8 %newval monotonic monotonic
4893  %0 = extractvalue { i8, i1 } %pair0, 0
4894  ret i8 %0
4895}
4896
4897define i1 @AtomicCmpSwapRes8(i8* %ptr, i8 signext %oldval, i8 signext %newval) nounwind {
4898; MIPS32-LABEL: AtomicCmpSwapRes8:
4899; MIPS32:       # %bb.0: # %entry
4900; MIPS32-NEXT:    addiu $1, $zero, -4
4901; MIPS32-NEXT:    and $2, $4, $1
4902; MIPS32-NEXT:    andi $1, $4, 3
4903; MIPS32-NEXT:    sll $3, $1, 3
4904; MIPS32-NEXT:    ori $1, $zero, 255
4905; MIPS32-NEXT:    sllv $4, $1, $3
4906; MIPS32-NEXT:    nor $7, $zero, $4
4907; MIPS32-NEXT:    andi $1, $5, 255
4908; MIPS32-NEXT:    sllv $8, $1, $3
4909; MIPS32-NEXT:    andi $1, $6, 255
4910; MIPS32-NEXT:    sllv $6, $1, $3
4911; MIPS32-NEXT:  $BB13_1: # %entry
4912; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
4913; MIPS32-NEXT:    ll $9, 0($2)
4914; MIPS32-NEXT:    and $10, $9, $4
4915; MIPS32-NEXT:    bne $10, $8, $BB13_3
4916; MIPS32-NEXT:    nop
4917; MIPS32-NEXT:  # %bb.2: # %entry
4918; MIPS32-NEXT:    # in Loop: Header=BB13_1 Depth=1
4919; MIPS32-NEXT:    and $9, $9, $7
4920; MIPS32-NEXT:    or $9, $9, $6
4921; MIPS32-NEXT:    sc $9, 0($2)
4922; MIPS32-NEXT:    beqz $9, $BB13_1
4923; MIPS32-NEXT:    nop
4924; MIPS32-NEXT:  $BB13_3: # %entry
4925; MIPS32-NEXT:    srlv $1, $10, $3
4926; MIPS32-NEXT:    sll $1, $1, 24
4927; MIPS32-NEXT:    sra $1, $1, 24
4928; MIPS32-NEXT:  # %bb.4: # %entry
4929; MIPS32-NEXT:    sll $2, $5, 24
4930; MIPS32-NEXT:    sra $2, $2, 24
4931; MIPS32-NEXT:    xor $1, $1, $2
4932; MIPS32-NEXT:    jr $ra
4933; MIPS32-NEXT:    sltiu $2, $1, 1
4934;
4935; MIPS32O0-LABEL: AtomicCmpSwapRes8:
4936; MIPS32O0:       # %bb.0: # %entry
4937; MIPS32O0-NEXT:    addiu $sp, $sp, -8
4938; MIPS32O0-NEXT:    addiu $1, $zero, -4
4939; MIPS32O0-NEXT:    and $1, $4, $1
4940; MIPS32O0-NEXT:    andi $2, $4, 3
4941; MIPS32O0-NEXT:    sll $2, $2, 3
4942; MIPS32O0-NEXT:    ori $3, $zero, 255
4943; MIPS32O0-NEXT:    sllv $3, $3, $2
4944; MIPS32O0-NEXT:    nor $4, $zero, $3
4945; MIPS32O0-NEXT:    andi $7, $5, 255
4946; MIPS32O0-NEXT:    sllv $7, $7, $2
4947; MIPS32O0-NEXT:    andi $6, $6, 255
4948; MIPS32O0-NEXT:    sllv $6, $6, $2
4949; MIPS32O0-NEXT:  $BB13_1: # %entry
4950; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
4951; MIPS32O0-NEXT:    ll $9, 0($1)
4952; MIPS32O0-NEXT:    and $10, $9, $3
4953; MIPS32O0-NEXT:    bne $10, $7, $BB13_3
4954; MIPS32O0-NEXT:    nop
4955; MIPS32O0-NEXT:  # %bb.2: # %entry
4956; MIPS32O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
4957; MIPS32O0-NEXT:    and $9, $9, $4
4958; MIPS32O0-NEXT:    or $9, $9, $6
4959; MIPS32O0-NEXT:    sc $9, 0($1)
4960; MIPS32O0-NEXT:    beqz $9, $BB13_1
4961; MIPS32O0-NEXT:    nop
4962; MIPS32O0-NEXT:  $BB13_3: # %entry
4963; MIPS32O0-NEXT:    srlv $8, $10, $2
4964; MIPS32O0-NEXT:    sll $8, $8, 24
4965; MIPS32O0-NEXT:    sra $8, $8, 24
4966; MIPS32O0-NEXT:  # %bb.4: # %entry
4967; MIPS32O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
4968; MIPS32O0-NEXT:    sw $8, 0($sp) # 4-byte Folded Spill
4969; MIPS32O0-NEXT:  # %bb.5: # %entry
4970; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
4971; MIPS32O0-NEXT:    sll $2, $1, 24
4972; MIPS32O0-NEXT:    sra $2, $2, 24
4973; MIPS32O0-NEXT:    lw $3, 0($sp) # 4-byte Folded Reload
4974; MIPS32O0-NEXT:    xor $2, $3, $2
4975; MIPS32O0-NEXT:    sltiu $2, $2, 1
4976; MIPS32O0-NEXT:    addiu $sp, $sp, 8
4977; MIPS32O0-NEXT:    jr $ra
4978; MIPS32O0-NEXT:    nop
4979;
4980; MIPS32R2-LABEL: AtomicCmpSwapRes8:
4981; MIPS32R2:       # %bb.0: # %entry
4982; MIPS32R2-NEXT:    addiu $1, $zero, -4
4983; MIPS32R2-NEXT:    and $2, $4, $1
4984; MIPS32R2-NEXT:    andi $1, $4, 3
4985; MIPS32R2-NEXT:    sll $3, $1, 3
4986; MIPS32R2-NEXT:    ori $1, $zero, 255
4987; MIPS32R2-NEXT:    sllv $4, $1, $3
4988; MIPS32R2-NEXT:    nor $7, $zero, $4
4989; MIPS32R2-NEXT:    andi $1, $5, 255
4990; MIPS32R2-NEXT:    sllv $8, $1, $3
4991; MIPS32R2-NEXT:    andi $1, $6, 255
4992; MIPS32R2-NEXT:    sllv $6, $1, $3
4993; MIPS32R2-NEXT:  $BB13_1: # %entry
4994; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
4995; MIPS32R2-NEXT:    ll $9, 0($2)
4996; MIPS32R2-NEXT:    and $10, $9, $4
4997; MIPS32R2-NEXT:    bne $10, $8, $BB13_3
4998; MIPS32R2-NEXT:    nop
4999; MIPS32R2-NEXT:  # %bb.2: # %entry
5000; MIPS32R2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5001; MIPS32R2-NEXT:    and $9, $9, $7
5002; MIPS32R2-NEXT:    or $9, $9, $6
5003; MIPS32R2-NEXT:    sc $9, 0($2)
5004; MIPS32R2-NEXT:    beqz $9, $BB13_1
5005; MIPS32R2-NEXT:    nop
5006; MIPS32R2-NEXT:  $BB13_3: # %entry
5007; MIPS32R2-NEXT:    srlv $1, $10, $3
5008; MIPS32R2-NEXT:    seb $1, $1
5009; MIPS32R2-NEXT:  # %bb.4: # %entry
5010; MIPS32R2-NEXT:    xor $1, $1, $5
5011; MIPS32R2-NEXT:    jr $ra
5012; MIPS32R2-NEXT:    sltiu $2, $1, 1
5013;
5014; MIPS32R6-LABEL: AtomicCmpSwapRes8:
5015; MIPS32R6:       # %bb.0: # %entry
5016; MIPS32R6-NEXT:    addiu $1, $zero, -4
5017; MIPS32R6-NEXT:    and $2, $4, $1
5018; MIPS32R6-NEXT:    andi $1, $4, 3
5019; MIPS32R6-NEXT:    sll $3, $1, 3
5020; MIPS32R6-NEXT:    ori $1, $zero, 255
5021; MIPS32R6-NEXT:    sllv $4, $1, $3
5022; MIPS32R6-NEXT:    nor $7, $zero, $4
5023; MIPS32R6-NEXT:    andi $1, $5, 255
5024; MIPS32R6-NEXT:    sllv $8, $1, $3
5025; MIPS32R6-NEXT:    andi $1, $6, 255
5026; MIPS32R6-NEXT:    sllv $6, $1, $3
5027; MIPS32R6-NEXT:  $BB13_1: # %entry
5028; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
5029; MIPS32R6-NEXT:    ll $9, 0($2)
5030; MIPS32R6-NEXT:    and $10, $9, $4
5031; MIPS32R6-NEXT:    bnec $10, $8, $BB13_3
5032; MIPS32R6-NEXT:  # %bb.2: # %entry
5033; MIPS32R6-NEXT:    # in Loop: Header=BB13_1 Depth=1
5034; MIPS32R6-NEXT:    and $9, $9, $7
5035; MIPS32R6-NEXT:    or $9, $9, $6
5036; MIPS32R6-NEXT:    sc $9, 0($2)
5037; MIPS32R6-NEXT:    beqzc $9, $BB13_1
5038; MIPS32R6-NEXT:  $BB13_3: # %entry
5039; MIPS32R6-NEXT:    srlv $1, $10, $3
5040; MIPS32R6-NEXT:    seb $1, $1
5041; MIPS32R6-NEXT:  # %bb.4: # %entry
5042; MIPS32R6-NEXT:    xor $1, $1, $5
5043; MIPS32R6-NEXT:    jr $ra
5044; MIPS32R6-NEXT:    sltiu $2, $1, 1
5045;
5046; MIPS32R6O0-LABEL: AtomicCmpSwapRes8:
5047; MIPS32R6O0:       # %bb.0: # %entry
5048; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
5049; MIPS32R6O0-NEXT:    move $1, $6
5050; MIPS32R6O0-NEXT:    move $2, $5
5051; MIPS32R6O0-NEXT:    addiu $3, $zero, -4
5052; MIPS32R6O0-NEXT:    and $3, $4, $3
5053; MIPS32R6O0-NEXT:    andi $4, $4, 3
5054; MIPS32R6O0-NEXT:    sll $4, $4, 3
5055; MIPS32R6O0-NEXT:    ori $7, $zero, 255
5056; MIPS32R6O0-NEXT:    sllv $7, $7, $4
5057; MIPS32R6O0-NEXT:    nor $8, $zero, $7
5058; MIPS32R6O0-NEXT:    andi $9, $5, 255
5059; MIPS32R6O0-NEXT:    sllv $9, $9, $4
5060; MIPS32R6O0-NEXT:    andi $6, $6, 255
5061; MIPS32R6O0-NEXT:    sllv $6, $6, $4
5062; MIPS32R6O0-NEXT:  $BB13_1: # %entry
5063; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5064; MIPS32R6O0-NEXT:    ll $11, 0($3)
5065; MIPS32R6O0-NEXT:    and $12, $11, $7
5066; MIPS32R6O0-NEXT:    bnec $12, $9, $BB13_3
5067; MIPS32R6O0-NEXT:  # %bb.2: # %entry
5068; MIPS32R6O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
5069; MIPS32R6O0-NEXT:    and $11, $11, $8
5070; MIPS32R6O0-NEXT:    or $11, $11, $6
5071; MIPS32R6O0-NEXT:    sc $11, 0($3)
5072; MIPS32R6O0-NEXT:    beqzc $11, $BB13_1
5073; MIPS32R6O0-NEXT:  $BB13_3: # %entry
5074; MIPS32R6O0-NEXT:    srlv $10, $12, $4
5075; MIPS32R6O0-NEXT:    seb $10, $10
5076; MIPS32R6O0-NEXT:  # %bb.4: # %entry
5077; MIPS32R6O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
5078; MIPS32R6O0-NEXT:    sw $10, 0($sp) # 4-byte Folded Spill
5079; MIPS32R6O0-NEXT:  # %bb.5: # %entry
5080; MIPS32R6O0-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
5081; MIPS32R6O0-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
5082; MIPS32R6O0-NEXT:    xor $1, $1, $2
5083; MIPS32R6O0-NEXT:    sltiu $2, $1, 1
5084; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
5085; MIPS32R6O0-NEXT:    jrc $ra
5086;
5087; MIPS4-LABEL: AtomicCmpSwapRes8:
5088; MIPS4:       # %bb.0: # %entry
5089; MIPS4-NEXT:    daddiu $1, $zero, -4
5090; MIPS4-NEXT:    and $2, $4, $1
5091; MIPS4-NEXT:    andi $1, $4, 3
5092; MIPS4-NEXT:    sll $3, $1, 3
5093; MIPS4-NEXT:    ori $1, $zero, 255
5094; MIPS4-NEXT:    sllv $4, $1, $3
5095; MIPS4-NEXT:    nor $7, $zero, $4
5096; MIPS4-NEXT:    andi $1, $5, 255
5097; MIPS4-NEXT:    sllv $8, $1, $3
5098; MIPS4-NEXT:    andi $1, $6, 255
5099; MIPS4-NEXT:    sllv $6, $1, $3
5100; MIPS4-NEXT:  .LBB13_1: # %entry
5101; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
5102; MIPS4-NEXT:    ll $9, 0($2)
5103; MIPS4-NEXT:    and $10, $9, $4
5104; MIPS4-NEXT:    bne $10, $8, .LBB13_3
5105; MIPS4-NEXT:    nop
5106; MIPS4-NEXT:  # %bb.2: # %entry
5107; MIPS4-NEXT:    # in Loop: Header=BB13_1 Depth=1
5108; MIPS4-NEXT:    and $9, $9, $7
5109; MIPS4-NEXT:    or $9, $9, $6
5110; MIPS4-NEXT:    sc $9, 0($2)
5111; MIPS4-NEXT:    beqz $9, .LBB13_1
5112; MIPS4-NEXT:    nop
5113; MIPS4-NEXT:  .LBB13_3: # %entry
5114; MIPS4-NEXT:    srlv $1, $10, $3
5115; MIPS4-NEXT:    sll $1, $1, 24
5116; MIPS4-NEXT:    sra $1, $1, 24
5117; MIPS4-NEXT:  # %bb.4: # %entry
5118; MIPS4-NEXT:    sll $2, $5, 24
5119; MIPS4-NEXT:    sra $2, $2, 24
5120; MIPS4-NEXT:    xor $1, $1, $2
5121; MIPS4-NEXT:    jr $ra
5122; MIPS4-NEXT:    sltiu $2, $1, 1
5123;
5124; MIPS64-LABEL: AtomicCmpSwapRes8:
5125; MIPS64:       # %bb.0: # %entry
5126; MIPS64-NEXT:    daddiu $1, $zero, -4
5127; MIPS64-NEXT:    and $2, $4, $1
5128; MIPS64-NEXT:    andi $1, $4, 3
5129; MIPS64-NEXT:    sll $3, $1, 3
5130; MIPS64-NEXT:    ori $1, $zero, 255
5131; MIPS64-NEXT:    sllv $4, $1, $3
5132; MIPS64-NEXT:    nor $7, $zero, $4
5133; MIPS64-NEXT:    andi $1, $5, 255
5134; MIPS64-NEXT:    sllv $8, $1, $3
5135; MIPS64-NEXT:    andi $1, $6, 255
5136; MIPS64-NEXT:    sllv $6, $1, $3
5137; MIPS64-NEXT:  .LBB13_1: # %entry
5138; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
5139; MIPS64-NEXT:    ll $9, 0($2)
5140; MIPS64-NEXT:    and $10, $9, $4
5141; MIPS64-NEXT:    bne $10, $8, .LBB13_3
5142; MIPS64-NEXT:    nop
5143; MIPS64-NEXT:  # %bb.2: # %entry
5144; MIPS64-NEXT:    # in Loop: Header=BB13_1 Depth=1
5145; MIPS64-NEXT:    and $9, $9, $7
5146; MIPS64-NEXT:    or $9, $9, $6
5147; MIPS64-NEXT:    sc $9, 0($2)
5148; MIPS64-NEXT:    beqz $9, .LBB13_1
5149; MIPS64-NEXT:    nop
5150; MIPS64-NEXT:  .LBB13_3: # %entry
5151; MIPS64-NEXT:    srlv $1, $10, $3
5152; MIPS64-NEXT:    sll $1, $1, 24
5153; MIPS64-NEXT:    sra $1, $1, 24
5154; MIPS64-NEXT:  # %bb.4: # %entry
5155; MIPS64-NEXT:    sll $2, $5, 24
5156; MIPS64-NEXT:    sra $2, $2, 24
5157; MIPS64-NEXT:    xor $1, $1, $2
5158; MIPS64-NEXT:    jr $ra
5159; MIPS64-NEXT:    sltiu $2, $1, 1
5160;
5161; MIPS64R2-LABEL: AtomicCmpSwapRes8:
5162; MIPS64R2:       # %bb.0: # %entry
5163; MIPS64R2-NEXT:    daddiu $1, $zero, -4
5164; MIPS64R2-NEXT:    and $2, $4, $1
5165; MIPS64R2-NEXT:    andi $1, $4, 3
5166; MIPS64R2-NEXT:    sll $3, $1, 3
5167; MIPS64R2-NEXT:    ori $1, $zero, 255
5168; MIPS64R2-NEXT:    sllv $4, $1, $3
5169; MIPS64R2-NEXT:    nor $7, $zero, $4
5170; MIPS64R2-NEXT:    andi $1, $5, 255
5171; MIPS64R2-NEXT:    sllv $8, $1, $3
5172; MIPS64R2-NEXT:    andi $1, $6, 255
5173; MIPS64R2-NEXT:    sllv $6, $1, $3
5174; MIPS64R2-NEXT:  .LBB13_1: # %entry
5175; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
5176; MIPS64R2-NEXT:    ll $9, 0($2)
5177; MIPS64R2-NEXT:    and $10, $9, $4
5178; MIPS64R2-NEXT:    bne $10, $8, .LBB13_3
5179; MIPS64R2-NEXT:    nop
5180; MIPS64R2-NEXT:  # %bb.2: # %entry
5181; MIPS64R2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5182; MIPS64R2-NEXT:    and $9, $9, $7
5183; MIPS64R2-NEXT:    or $9, $9, $6
5184; MIPS64R2-NEXT:    sc $9, 0($2)
5185; MIPS64R2-NEXT:    beqz $9, .LBB13_1
5186; MIPS64R2-NEXT:    nop
5187; MIPS64R2-NEXT:  .LBB13_3: # %entry
5188; MIPS64R2-NEXT:    srlv $1, $10, $3
5189; MIPS64R2-NEXT:    seb $1, $1
5190; MIPS64R2-NEXT:  # %bb.4: # %entry
5191; MIPS64R2-NEXT:    xor $1, $1, $5
5192; MIPS64R2-NEXT:    jr $ra
5193; MIPS64R2-NEXT:    sltiu $2, $1, 1
5194;
5195; MIPS64R6-LABEL: AtomicCmpSwapRes8:
5196; MIPS64R6:       # %bb.0: # %entry
5197; MIPS64R6-NEXT:    daddiu $1, $zero, -4
5198; MIPS64R6-NEXT:    and $2, $4, $1
5199; MIPS64R6-NEXT:    andi $1, $4, 3
5200; MIPS64R6-NEXT:    sll $3, $1, 3
5201; MIPS64R6-NEXT:    ori $1, $zero, 255
5202; MIPS64R6-NEXT:    sllv $4, $1, $3
5203; MIPS64R6-NEXT:    nor $7, $zero, $4
5204; MIPS64R6-NEXT:    andi $1, $5, 255
5205; MIPS64R6-NEXT:    sllv $8, $1, $3
5206; MIPS64R6-NEXT:    andi $1, $6, 255
5207; MIPS64R6-NEXT:    sllv $6, $1, $3
5208; MIPS64R6-NEXT:  .LBB13_1: # %entry
5209; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
5210; MIPS64R6-NEXT:    ll $9, 0($2)
5211; MIPS64R6-NEXT:    and $10, $9, $4
5212; MIPS64R6-NEXT:    bnec $10, $8, .LBB13_3
5213; MIPS64R6-NEXT:  # %bb.2: # %entry
5214; MIPS64R6-NEXT:    # in Loop: Header=BB13_1 Depth=1
5215; MIPS64R6-NEXT:    and $9, $9, $7
5216; MIPS64R6-NEXT:    or $9, $9, $6
5217; MIPS64R6-NEXT:    sc $9, 0($2)
5218; MIPS64R6-NEXT:    beqzc $9, .LBB13_1
5219; MIPS64R6-NEXT:  .LBB13_3: # %entry
5220; MIPS64R6-NEXT:    srlv $1, $10, $3
5221; MIPS64R6-NEXT:    seb $1, $1
5222; MIPS64R6-NEXT:  # %bb.4: # %entry
5223; MIPS64R6-NEXT:    xor $1, $1, $5
5224; MIPS64R6-NEXT:    jr $ra
5225; MIPS64R6-NEXT:    sltiu $2, $1, 1
5226;
5227; MIPS64R6O0-LABEL: AtomicCmpSwapRes8:
5228; MIPS64R6O0:       # %bb.0: # %entry
5229; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
5230; MIPS64R6O0-NEXT:    # kill: def $a2 killed $a2 killed $a2_64
5231; MIPS64R6O0-NEXT:    # kill: def $a1 killed $a1 killed $a1_64
5232; MIPS64R6O0-NEXT:    daddiu $1, $zero, -4
5233; MIPS64R6O0-NEXT:    and $1, $4, $1
5234; MIPS64R6O0-NEXT:    andi $2, $4, 3
5235; MIPS64R6O0-NEXT:    xori $2, $2, 3
5236; MIPS64R6O0-NEXT:    sll $2, $2, 3
5237; MIPS64R6O0-NEXT:    ori $3, $zero, 255
5238; MIPS64R6O0-NEXT:    sllv $3, $3, $2
5239; MIPS64R6O0-NEXT:    nor $4, $zero, $3
5240; MIPS64R6O0-NEXT:    andi $7, $5, 255
5241; MIPS64R6O0-NEXT:    sllv $7, $7, $2
5242; MIPS64R6O0-NEXT:    andi $6, $6, 255
5243; MIPS64R6O0-NEXT:    sllv $6, $6, $2
5244; MIPS64R6O0-NEXT:  .LBB13_1: # %entry
5245; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5246; MIPS64R6O0-NEXT:    ll $9, 0($1)
5247; MIPS64R6O0-NEXT:    and $10, $9, $3
5248; MIPS64R6O0-NEXT:    bnec $10, $7, .LBB13_3
5249; MIPS64R6O0-NEXT:  # %bb.2: # %entry
5250; MIPS64R6O0-NEXT:    # in Loop: Header=BB13_1 Depth=1
5251; MIPS64R6O0-NEXT:    and $9, $9, $4
5252; MIPS64R6O0-NEXT:    or $9, $9, $6
5253; MIPS64R6O0-NEXT:    sc $9, 0($1)
5254; MIPS64R6O0-NEXT:    beqzc $9, .LBB13_1
5255; MIPS64R6O0-NEXT:  .LBB13_3: # %entry
5256; MIPS64R6O0-NEXT:    srlv $8, $10, $2
5257; MIPS64R6O0-NEXT:    seb $8, $8
5258; MIPS64R6O0-NEXT:  # %bb.4: # %entry
5259; MIPS64R6O0-NEXT:    sw $5, 12($sp) # 4-byte Folded Spill
5260; MIPS64R6O0-NEXT:    sw $8, 8($sp) # 4-byte Folded Spill
5261; MIPS64R6O0-NEXT:  # %bb.5: # %entry
5262; MIPS64R6O0-NEXT:    lw $1, 8($sp) # 4-byte Folded Reload
5263; MIPS64R6O0-NEXT:    lw $2, 12($sp) # 4-byte Folded Reload
5264; MIPS64R6O0-NEXT:    xor $1, $1, $2
5265; MIPS64R6O0-NEXT:    sltiu $2, $1, 1
5266; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
5267; MIPS64R6O0-NEXT:    jrc $ra
5268;
5269; MM32-LABEL: AtomicCmpSwapRes8:
5270; MM32:       # %bb.0: # %entry
5271; MM32-NEXT:    addiu $1, $zero, -4
5272; MM32-NEXT:    and $2, $4, $1
5273; MM32-NEXT:    andi $1, $4, 3
5274; MM32-NEXT:    sll $3, $1, 3
5275; MM32-NEXT:    ori $1, $zero, 255
5276; MM32-NEXT:    sllv $4, $1, $3
5277; MM32-NEXT:    nor $7, $zero, $4
5278; MM32-NEXT:    andi $1, $5, 255
5279; MM32-NEXT:    sllv $8, $1, $3
5280; MM32-NEXT:    andi $1, $6, 255
5281; MM32-NEXT:    sllv $6, $1, $3
5282; MM32-NEXT:  $BB13_1: # %entry
5283; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
5284; MM32-NEXT:    ll $9, 0($2)
5285; MM32-NEXT:    and $10, $9, $4
5286; MM32-NEXT:    bne $10, $8, $BB13_3
5287; MM32-NEXT:    nop
5288; MM32-NEXT:  # %bb.2: # %entry
5289; MM32-NEXT:    # in Loop: Header=BB13_1 Depth=1
5290; MM32-NEXT:    and $9, $9, $7
5291; MM32-NEXT:    or $9, $9, $6
5292; MM32-NEXT:    sc $9, 0($2)
5293; MM32-NEXT:    beqzc $9, $BB13_1
5294; MM32-NEXT:  $BB13_3: # %entry
5295; MM32-NEXT:    srlv $1, $10, $3
5296; MM32-NEXT:    seb $1, $1
5297; MM32-NEXT:  # %bb.4: # %entry
5298; MM32-NEXT:    xor $1, $1, $5
5299; MM32-NEXT:    jr $ra
5300; MM32-NEXT:    sltiu $2, $1, 1
5301;
5302; O1-LABEL: AtomicCmpSwapRes8:
5303; O1:       # %bb.0: # %entry
5304; O1-NEXT:    addiu $1, $zero, -4
5305; O1-NEXT:    and $2, $4, $1
5306; O1-NEXT:    andi $1, $4, 3
5307; O1-NEXT:    sll $3, $1, 3
5308; O1-NEXT:    ori $1, $zero, 255
5309; O1-NEXT:    sllv $4, $1, $3
5310; O1-NEXT:    nor $7, $zero, $4
5311; O1-NEXT:    andi $1, $5, 255
5312; O1-NEXT:    sllv $8, $1, $3
5313; O1-NEXT:    andi $1, $6, 255
5314; O1-NEXT:    sllv $6, $1, $3
5315; O1-NEXT:  $BB13_1: # %entry
5316; O1-NEXT:    # =>This Inner Loop Header: Depth=1
5317; O1-NEXT:    ll $9, 0($2)
5318; O1-NEXT:    and $10, $9, $4
5319; O1-NEXT:    bne $10, $8, $BB13_3
5320; O1-NEXT:    nop
5321; O1-NEXT:  # %bb.2: # %entry
5322; O1-NEXT:    # in Loop: Header=BB13_1 Depth=1
5323; O1-NEXT:    and $9, $9, $7
5324; O1-NEXT:    or $9, $9, $6
5325; O1-NEXT:    sc $9, 0($2)
5326; O1-NEXT:    beqz $9, $BB13_1
5327; O1-NEXT:    nop
5328; O1-NEXT:  $BB13_3: # %entry
5329; O1-NEXT:    srlv $1, $10, $3
5330; O1-NEXT:    sll $1, $1, 24
5331; O1-NEXT:    sra $1, $1, 24
5332; O1-NEXT:  # %bb.4: # %entry
5333; O1-NEXT:    sll $2, $5, 24
5334; O1-NEXT:    sra $2, $2, 24
5335; O1-NEXT:    xor $1, $1, $2
5336; O1-NEXT:    jr $ra
5337; O1-NEXT:    sltiu $2, $1, 1
5338;
5339; O2-LABEL: AtomicCmpSwapRes8:
5340; O2:       # %bb.0: # %entry
5341; O2-NEXT:    addiu $1, $zero, -4
5342; O2-NEXT:    and $2, $4, $1
5343; O2-NEXT:    andi $1, $4, 3
5344; O2-NEXT:    sll $3, $1, 3
5345; O2-NEXT:    ori $1, $zero, 255
5346; O2-NEXT:    sllv $4, $1, $3
5347; O2-NEXT:    nor $7, $zero, $4
5348; O2-NEXT:    andi $1, $5, 255
5349; O2-NEXT:    sllv $8, $1, $3
5350; O2-NEXT:    andi $1, $6, 255
5351; O2-NEXT:    sllv $6, $1, $3
5352; O2-NEXT:  $BB13_1: # %entry
5353; O2-NEXT:    # =>This Inner Loop Header: Depth=1
5354; O2-NEXT:    ll $9, 0($2)
5355; O2-NEXT:    and $10, $9, $4
5356; O2-NEXT:    bne $10, $8, $BB13_3
5357; O2-NEXT:    nop
5358; O2-NEXT:  # %bb.2: # %entry
5359; O2-NEXT:    # in Loop: Header=BB13_1 Depth=1
5360; O2-NEXT:    and $9, $9, $7
5361; O2-NEXT:    or $9, $9, $6
5362; O2-NEXT:    sc $9, 0($2)
5363; O2-NEXT:    beqz $9, $BB13_1
5364; O2-NEXT:    nop
5365; O2-NEXT:  $BB13_3: # %entry
5366; O2-NEXT:    srlv $1, $10, $3
5367; O2-NEXT:    sll $1, $1, 24
5368; O2-NEXT:    sra $1, $1, 24
5369; O2-NEXT:  # %bb.4: # %entry
5370; O2-NEXT:    sll $2, $5, 24
5371; O2-NEXT:    sra $2, $2, 24
5372; O2-NEXT:    xor $1, $1, $2
5373; O2-NEXT:    jr $ra
5374; O2-NEXT:    sltiu $2, $1, 1
5375;
5376; O3-LABEL: AtomicCmpSwapRes8:
5377; O3:       # %bb.0: # %entry
5378; O3-NEXT:    addiu $1, $zero, -4
5379; O3-NEXT:    and $2, $4, $1
5380; O3-NEXT:    andi $1, $4, 3
5381; O3-NEXT:    sll $3, $1, 3
5382; O3-NEXT:    ori $1, $zero, 255
5383; O3-NEXT:    sllv $4, $1, $3
5384; O3-NEXT:    andi $1, $5, 255
5385; O3-NEXT:    sllv $8, $1, $3
5386; O3-NEXT:    andi $1, $6, 255
5387; O3-NEXT:    nor $7, $zero, $4
5388; O3-NEXT:    sllv $6, $1, $3
5389; O3-NEXT:  $BB13_1: # %entry
5390; O3-NEXT:    # =>This Inner Loop Header: Depth=1
5391; O3-NEXT:    ll $9, 0($2)
5392; O3-NEXT:    and $10, $9, $4
5393; O3-NEXT:    bne $10, $8, $BB13_3
5394; O3-NEXT:    nop
5395; O3-NEXT:  # %bb.2: # %entry
5396; O3-NEXT:    # in Loop: Header=BB13_1 Depth=1
5397; O3-NEXT:    and $9, $9, $7
5398; O3-NEXT:    or $9, $9, $6
5399; O3-NEXT:    sc $9, 0($2)
5400; O3-NEXT:    beqz $9, $BB13_1
5401; O3-NEXT:    nop
5402; O3-NEXT:  $BB13_3: # %entry
5403; O3-NEXT:    srlv $1, $10, $3
5404; O3-NEXT:    sll $1, $1, 24
5405; O3-NEXT:    sra $1, $1, 24
5406; O3-NEXT:  # %bb.4: # %entry
5407; O3-NEXT:    sll $2, $5, 24
5408; O3-NEXT:    sra $2, $2, 24
5409; O3-NEXT:    xor $1, $1, $2
5410; O3-NEXT:    jr $ra
5411; O3-NEXT:    sltiu $2, $1, 1
5412;
5413; MIPS32EB-LABEL: AtomicCmpSwapRes8:
5414; MIPS32EB:       # %bb.0: # %entry
5415; MIPS32EB-NEXT:    addiu $1, $zero, -4
5416; MIPS32EB-NEXT:    and $2, $4, $1
5417; MIPS32EB-NEXT:    andi $1, $4, 3
5418; MIPS32EB-NEXT:    xori $1, $1, 3
5419; MIPS32EB-NEXT:    sll $3, $1, 3
5420; MIPS32EB-NEXT:    ori $1, $zero, 255
5421; MIPS32EB-NEXT:    sllv $4, $1, $3
5422; MIPS32EB-NEXT:    nor $7, $zero, $4
5423; MIPS32EB-NEXT:    andi $1, $5, 255
5424; MIPS32EB-NEXT:    sllv $8, $1, $3
5425; MIPS32EB-NEXT:    andi $1, $6, 255
5426; MIPS32EB-NEXT:    sllv $6, $1, $3
5427; MIPS32EB-NEXT:  $BB13_1: # %entry
5428; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
5429; MIPS32EB-NEXT:    ll $9, 0($2)
5430; MIPS32EB-NEXT:    and $10, $9, $4
5431; MIPS32EB-NEXT:    bne $10, $8, $BB13_3
5432; MIPS32EB-NEXT:    nop
5433; MIPS32EB-NEXT:  # %bb.2: # %entry
5434; MIPS32EB-NEXT:    # in Loop: Header=BB13_1 Depth=1
5435; MIPS32EB-NEXT:    and $9, $9, $7
5436; MIPS32EB-NEXT:    or $9, $9, $6
5437; MIPS32EB-NEXT:    sc $9, 0($2)
5438; MIPS32EB-NEXT:    beqz $9, $BB13_1
5439; MIPS32EB-NEXT:    nop
5440; MIPS32EB-NEXT:  $BB13_3: # %entry
5441; MIPS32EB-NEXT:    srlv $1, $10, $3
5442; MIPS32EB-NEXT:    sll $1, $1, 24
5443; MIPS32EB-NEXT:    sra $1, $1, 24
5444; MIPS32EB-NEXT:  # %bb.4: # %entry
5445; MIPS32EB-NEXT:    sll $2, $5, 24
5446; MIPS32EB-NEXT:    sra $2, $2, 24
5447; MIPS32EB-NEXT:    xor $1, $1, $2
5448; MIPS32EB-NEXT:    jr $ra
5449; MIPS32EB-NEXT:    sltiu $2, $1, 1
5450entry:
5451  %0 = cmpxchg i8* %ptr, i8 %oldval, i8 %newval monotonic monotonic
5452  %1 = extractvalue { i8, i1 } %0, 1
5453  ret i1 %1
5454; FIXME: -march=mips produces a redundant sign extension here...
5455; FIXME: ...Leading to this split check.
5456
5457}
5458
5459; Check one i16 so that we cover the seh sign extend
5460@z = common global i16 0, align 1
5461
5462define signext i16 @AtomicLoadAdd16(i16 signext %incr) nounwind {
5463; MIPS32-LABEL: AtomicLoadAdd16:
5464; MIPS32:       # %bb.0: # %entry
5465; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
5466; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
5467; MIPS32-NEXT:    addu $1, $2, $25
5468; MIPS32-NEXT:    lw $1, %got(z)($1)
5469; MIPS32-NEXT:    addiu $2, $zero, -4
5470; MIPS32-NEXT:    and $2, $1, $2
5471; MIPS32-NEXT:    andi $1, $1, 3
5472; MIPS32-NEXT:    sll $3, $1, 3
5473; MIPS32-NEXT:    ori $1, $zero, 65535
5474; MIPS32-NEXT:    sllv $5, $1, $3
5475; MIPS32-NEXT:    nor $6, $zero, $5
5476; MIPS32-NEXT:    sllv $4, $4, $3
5477; MIPS32-NEXT:  $BB14_1: # %entry
5478; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
5479; MIPS32-NEXT:    ll $7, 0($2)
5480; MIPS32-NEXT:    addu $8, $7, $4
5481; MIPS32-NEXT:    and $8, $8, $5
5482; MIPS32-NEXT:    and $9, $7, $6
5483; MIPS32-NEXT:    or $9, $9, $8
5484; MIPS32-NEXT:    sc $9, 0($2)
5485; MIPS32-NEXT:    beqz $9, $BB14_1
5486; MIPS32-NEXT:    nop
5487; MIPS32-NEXT:  # %bb.2: # %entry
5488; MIPS32-NEXT:    and $1, $7, $5
5489; MIPS32-NEXT:    srlv $1, $1, $3
5490; MIPS32-NEXT:    sll $1, $1, 16
5491; MIPS32-NEXT:    sra $1, $1, 16
5492; MIPS32-NEXT:  # %bb.3: # %entry
5493; MIPS32-NEXT:    sll $1, $1, 16
5494; MIPS32-NEXT:    jr $ra
5495; MIPS32-NEXT:    sra $2, $1, 16
5496;
5497; MIPS32O0-LABEL: AtomicLoadAdd16:
5498; MIPS32O0:       # %bb.0: # %entry
5499; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
5500; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
5501; MIPS32O0-NEXT:    addiu $sp, $sp, -8
5502; MIPS32O0-NEXT:    addu $1, $2, $25
5503; MIPS32O0-NEXT:    lw $1, %got(z)($1)
5504; MIPS32O0-NEXT:    addiu $2, $zero, -4
5505; MIPS32O0-NEXT:    and $2, $1, $2
5506; MIPS32O0-NEXT:    andi $1, $1, 3
5507; MIPS32O0-NEXT:    sll $1, $1, 3
5508; MIPS32O0-NEXT:    ori $3, $zero, 65535
5509; MIPS32O0-NEXT:    sllv $3, $3, $1
5510; MIPS32O0-NEXT:    nor $5, $zero, $3
5511; MIPS32O0-NEXT:    sllv $4, $4, $1
5512; MIPS32O0-NEXT:  $BB14_1: # %entry
5513; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
5514; MIPS32O0-NEXT:    ll $7, 0($2)
5515; MIPS32O0-NEXT:    addu $8, $7, $4
5516; MIPS32O0-NEXT:    and $8, $8, $3
5517; MIPS32O0-NEXT:    and $9, $7, $5
5518; MIPS32O0-NEXT:    or $9, $9, $8
5519; MIPS32O0-NEXT:    sc $9, 0($2)
5520; MIPS32O0-NEXT:    beqz $9, $BB14_1
5521; MIPS32O0-NEXT:    nop
5522; MIPS32O0-NEXT:  # %bb.2: # %entry
5523; MIPS32O0-NEXT:    and $6, $7, $3
5524; MIPS32O0-NEXT:    srlv $6, $6, $1
5525; MIPS32O0-NEXT:    sll $6, $6, 16
5526; MIPS32O0-NEXT:    sra $6, $6, 16
5527; MIPS32O0-NEXT:  # %bb.3: # %entry
5528; MIPS32O0-NEXT:    sw $6, 4($sp) # 4-byte Folded Spill
5529; MIPS32O0-NEXT:  # %bb.4: # %entry
5530; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5531; MIPS32O0-NEXT:    sll $2, $1, 16
5532; MIPS32O0-NEXT:    sra $2, $2, 16
5533; MIPS32O0-NEXT:    addiu $sp, $sp, 8
5534; MIPS32O0-NEXT:    jr $ra
5535; MIPS32O0-NEXT:    nop
5536;
5537; MIPS32R2-LABEL: AtomicLoadAdd16:
5538; MIPS32R2:       # %bb.0: # %entry
5539; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
5540; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
5541; MIPS32R2-NEXT:    addu $1, $2, $25
5542; MIPS32R2-NEXT:    lw $1, %got(z)($1)
5543; MIPS32R2-NEXT:    addiu $2, $zero, -4
5544; MIPS32R2-NEXT:    and $2, $1, $2
5545; MIPS32R2-NEXT:    andi $1, $1, 3
5546; MIPS32R2-NEXT:    sll $3, $1, 3
5547; MIPS32R2-NEXT:    ori $1, $zero, 65535
5548; MIPS32R2-NEXT:    sllv $5, $1, $3
5549; MIPS32R2-NEXT:    nor $6, $zero, $5
5550; MIPS32R2-NEXT:    sllv $4, $4, $3
5551; MIPS32R2-NEXT:  $BB14_1: # %entry
5552; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
5553; MIPS32R2-NEXT:    ll $7, 0($2)
5554; MIPS32R2-NEXT:    addu $8, $7, $4
5555; MIPS32R2-NEXT:    and $8, $8, $5
5556; MIPS32R2-NEXT:    and $9, $7, $6
5557; MIPS32R2-NEXT:    or $9, $9, $8
5558; MIPS32R2-NEXT:    sc $9, 0($2)
5559; MIPS32R2-NEXT:    beqz $9, $BB14_1
5560; MIPS32R2-NEXT:    nop
5561; MIPS32R2-NEXT:  # %bb.2: # %entry
5562; MIPS32R2-NEXT:    and $1, $7, $5
5563; MIPS32R2-NEXT:    srlv $1, $1, $3
5564; MIPS32R2-NEXT:    seh $1, $1
5565; MIPS32R2-NEXT:  # %bb.3: # %entry
5566; MIPS32R2-NEXT:    jr $ra
5567; MIPS32R2-NEXT:    seh $2, $1
5568;
5569; MIPS32R6-LABEL: AtomicLoadAdd16:
5570; MIPS32R6:       # %bb.0: # %entry
5571; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
5572; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
5573; MIPS32R6-NEXT:    addu $1, $2, $25
5574; MIPS32R6-NEXT:    lw $1, %got(z)($1)
5575; MIPS32R6-NEXT:    addiu $2, $zero, -4
5576; MIPS32R6-NEXT:    and $2, $1, $2
5577; MIPS32R6-NEXT:    andi $1, $1, 3
5578; MIPS32R6-NEXT:    sll $3, $1, 3
5579; MIPS32R6-NEXT:    ori $1, $zero, 65535
5580; MIPS32R6-NEXT:    sllv $5, $1, $3
5581; MIPS32R6-NEXT:    nor $6, $zero, $5
5582; MIPS32R6-NEXT:    sllv $4, $4, $3
5583; MIPS32R6-NEXT:  $BB14_1: # %entry
5584; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
5585; MIPS32R6-NEXT:    ll $7, 0($2)
5586; MIPS32R6-NEXT:    addu $8, $7, $4
5587; MIPS32R6-NEXT:    and $8, $8, $5
5588; MIPS32R6-NEXT:    and $9, $7, $6
5589; MIPS32R6-NEXT:    or $9, $9, $8
5590; MIPS32R6-NEXT:    sc $9, 0($2)
5591; MIPS32R6-NEXT:    beqzc $9, $BB14_1
5592; MIPS32R6-NEXT:  # %bb.2: # %entry
5593; MIPS32R6-NEXT:    and $1, $7, $5
5594; MIPS32R6-NEXT:    srlv $1, $1, $3
5595; MIPS32R6-NEXT:    seh $1, $1
5596; MIPS32R6-NEXT:  # %bb.3: # %entry
5597; MIPS32R6-NEXT:    jr $ra
5598; MIPS32R6-NEXT:    seh $2, $1
5599;
5600; MIPS32R6O0-LABEL: AtomicLoadAdd16:
5601; MIPS32R6O0:       # %bb.0: # %entry
5602; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
5603; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
5604; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
5605; MIPS32R6O0-NEXT:    addu $1, $2, $25
5606; MIPS32R6O0-NEXT:    move $2, $4
5607; MIPS32R6O0-NEXT:    lw $1, %got(z)($1)
5608; MIPS32R6O0-NEXT:    addiu $3, $zero, -4
5609; MIPS32R6O0-NEXT:    and $3, $1, $3
5610; MIPS32R6O0-NEXT:    andi $1, $1, 3
5611; MIPS32R6O0-NEXT:    sll $1, $1, 3
5612; MIPS32R6O0-NEXT:    ori $5, $zero, 65535
5613; MIPS32R6O0-NEXT:    sllv $5, $5, $1
5614; MIPS32R6O0-NEXT:    nor $6, $zero, $5
5615; MIPS32R6O0-NEXT:    sllv $4, $4, $1
5616; MIPS32R6O0-NEXT:  $BB14_1: # %entry
5617; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5618; MIPS32R6O0-NEXT:    ll $8, 0($3)
5619; MIPS32R6O0-NEXT:    addu $9, $8, $4
5620; MIPS32R6O0-NEXT:    and $9, $9, $5
5621; MIPS32R6O0-NEXT:    and $10, $8, $6
5622; MIPS32R6O0-NEXT:    or $10, $10, $9
5623; MIPS32R6O0-NEXT:    sc $10, 0($3)
5624; MIPS32R6O0-NEXT:    beqzc $10, $BB14_1
5625; MIPS32R6O0-NEXT:  # %bb.2: # %entry
5626; MIPS32R6O0-NEXT:    and $7, $8, $5
5627; MIPS32R6O0-NEXT:    srlv $7, $7, $1
5628; MIPS32R6O0-NEXT:    seh $7, $7
5629; MIPS32R6O0-NEXT:  # %bb.3: # %entry
5630; MIPS32R6O0-NEXT:    sw $7, 4($sp) # 4-byte Folded Spill
5631; MIPS32R6O0-NEXT:  # %bb.4: # %entry
5632; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
5633; MIPS32R6O0-NEXT:    seh $2, $1
5634; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
5635; MIPS32R6O0-NEXT:    jrc $ra
5636;
5637; MIPS4-LABEL: AtomicLoadAdd16:
5638; MIPS4:       # %bb.0: # %entry
5639; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5640; MIPS4-NEXT:    daddu $1, $1, $25
5641; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5642; MIPS4-NEXT:    ld $1, %got_disp(z)($1)
5643; MIPS4-NEXT:    daddiu $2, $zero, -4
5644; MIPS4-NEXT:    and $2, $1, $2
5645; MIPS4-NEXT:    andi $1, $1, 3
5646; MIPS4-NEXT:    sll $3, $1, 3
5647; MIPS4-NEXT:    ori $1, $zero, 65535
5648; MIPS4-NEXT:    sllv $5, $1, $3
5649; MIPS4-NEXT:    nor $6, $zero, $5
5650; MIPS4-NEXT:    sllv $4, $4, $3
5651; MIPS4-NEXT:  .LBB14_1: # %entry
5652; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
5653; MIPS4-NEXT:    ll $7, 0($2)
5654; MIPS4-NEXT:    addu $8, $7, $4
5655; MIPS4-NEXT:    and $8, $8, $5
5656; MIPS4-NEXT:    and $9, $7, $6
5657; MIPS4-NEXT:    or $9, $9, $8
5658; MIPS4-NEXT:    sc $9, 0($2)
5659; MIPS4-NEXT:    beqz $9, .LBB14_1
5660; MIPS4-NEXT:    nop
5661; MIPS4-NEXT:  # %bb.2: # %entry
5662; MIPS4-NEXT:    and $1, $7, $5
5663; MIPS4-NEXT:    srlv $1, $1, $3
5664; MIPS4-NEXT:    sll $1, $1, 16
5665; MIPS4-NEXT:    sra $1, $1, 16
5666; MIPS4-NEXT:  # %bb.3: # %entry
5667; MIPS4-NEXT:    sll $1, $1, 16
5668; MIPS4-NEXT:    jr $ra
5669; MIPS4-NEXT:    sra $2, $1, 16
5670;
5671; MIPS64-LABEL: AtomicLoadAdd16:
5672; MIPS64:       # %bb.0: # %entry
5673; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5674; MIPS64-NEXT:    daddu $1, $1, $25
5675; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5676; MIPS64-NEXT:    ld $1, %got_disp(z)($1)
5677; MIPS64-NEXT:    daddiu $2, $zero, -4
5678; MIPS64-NEXT:    and $2, $1, $2
5679; MIPS64-NEXT:    andi $1, $1, 3
5680; MIPS64-NEXT:    sll $3, $1, 3
5681; MIPS64-NEXT:    ori $1, $zero, 65535
5682; MIPS64-NEXT:    sllv $5, $1, $3
5683; MIPS64-NEXT:    nor $6, $zero, $5
5684; MIPS64-NEXT:    sllv $4, $4, $3
5685; MIPS64-NEXT:  .LBB14_1: # %entry
5686; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
5687; MIPS64-NEXT:    ll $7, 0($2)
5688; MIPS64-NEXT:    addu $8, $7, $4
5689; MIPS64-NEXT:    and $8, $8, $5
5690; MIPS64-NEXT:    and $9, $7, $6
5691; MIPS64-NEXT:    or $9, $9, $8
5692; MIPS64-NEXT:    sc $9, 0($2)
5693; MIPS64-NEXT:    beqz $9, .LBB14_1
5694; MIPS64-NEXT:    nop
5695; MIPS64-NEXT:  # %bb.2: # %entry
5696; MIPS64-NEXT:    and $1, $7, $5
5697; MIPS64-NEXT:    srlv $1, $1, $3
5698; MIPS64-NEXT:    sll $1, $1, 16
5699; MIPS64-NEXT:    sra $1, $1, 16
5700; MIPS64-NEXT:  # %bb.3: # %entry
5701; MIPS64-NEXT:    sll $1, $1, 16
5702; MIPS64-NEXT:    jr $ra
5703; MIPS64-NEXT:    sra $2, $1, 16
5704;
5705; MIPS64R2-LABEL: AtomicLoadAdd16:
5706; MIPS64R2:       # %bb.0: # %entry
5707; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5708; MIPS64R2-NEXT:    daddu $1, $1, $25
5709; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5710; MIPS64R2-NEXT:    ld $1, %got_disp(z)($1)
5711; MIPS64R2-NEXT:    daddiu $2, $zero, -4
5712; MIPS64R2-NEXT:    and $2, $1, $2
5713; MIPS64R2-NEXT:    andi $1, $1, 3
5714; MIPS64R2-NEXT:    sll $3, $1, 3
5715; MIPS64R2-NEXT:    ori $1, $zero, 65535
5716; MIPS64R2-NEXT:    sllv $5, $1, $3
5717; MIPS64R2-NEXT:    nor $6, $zero, $5
5718; MIPS64R2-NEXT:    sllv $4, $4, $3
5719; MIPS64R2-NEXT:  .LBB14_1: # %entry
5720; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
5721; MIPS64R2-NEXT:    ll $7, 0($2)
5722; MIPS64R2-NEXT:    addu $8, $7, $4
5723; MIPS64R2-NEXT:    and $8, $8, $5
5724; MIPS64R2-NEXT:    and $9, $7, $6
5725; MIPS64R2-NEXT:    or $9, $9, $8
5726; MIPS64R2-NEXT:    sc $9, 0($2)
5727; MIPS64R2-NEXT:    beqz $9, .LBB14_1
5728; MIPS64R2-NEXT:    nop
5729; MIPS64R2-NEXT:  # %bb.2: # %entry
5730; MIPS64R2-NEXT:    and $1, $7, $5
5731; MIPS64R2-NEXT:    srlv $1, $1, $3
5732; MIPS64R2-NEXT:    seh $1, $1
5733; MIPS64R2-NEXT:  # %bb.3: # %entry
5734; MIPS64R2-NEXT:    jr $ra
5735; MIPS64R2-NEXT:    seh $2, $1
5736;
5737; MIPS64R6-LABEL: AtomicLoadAdd16:
5738; MIPS64R6:       # %bb.0: # %entry
5739; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5740; MIPS64R6-NEXT:    daddu $1, $1, $25
5741; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5742; MIPS64R6-NEXT:    ld $1, %got_disp(z)($1)
5743; MIPS64R6-NEXT:    daddiu $2, $zero, -4
5744; MIPS64R6-NEXT:    and $2, $1, $2
5745; MIPS64R6-NEXT:    andi $1, $1, 3
5746; MIPS64R6-NEXT:    sll $3, $1, 3
5747; MIPS64R6-NEXT:    ori $1, $zero, 65535
5748; MIPS64R6-NEXT:    sllv $5, $1, $3
5749; MIPS64R6-NEXT:    nor $6, $zero, $5
5750; MIPS64R6-NEXT:    sllv $4, $4, $3
5751; MIPS64R6-NEXT:  .LBB14_1: # %entry
5752; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
5753; MIPS64R6-NEXT:    ll $7, 0($2)
5754; MIPS64R6-NEXT:    addu $8, $7, $4
5755; MIPS64R6-NEXT:    and $8, $8, $5
5756; MIPS64R6-NEXT:    and $9, $7, $6
5757; MIPS64R6-NEXT:    or $9, $9, $8
5758; MIPS64R6-NEXT:    sc $9, 0($2)
5759; MIPS64R6-NEXT:    beqzc $9, .LBB14_1
5760; MIPS64R6-NEXT:  # %bb.2: # %entry
5761; MIPS64R6-NEXT:    and $1, $7, $5
5762; MIPS64R6-NEXT:    srlv $1, $1, $3
5763; MIPS64R6-NEXT:    seh $1, $1
5764; MIPS64R6-NEXT:  # %bb.3: # %entry
5765; MIPS64R6-NEXT:    jr $ra
5766; MIPS64R6-NEXT:    seh $2, $1
5767;
5768; MIPS64R6O0-LABEL: AtomicLoadAdd16:
5769; MIPS64R6O0:       # %bb.0: # %entry
5770; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
5771; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd16)))
5772; MIPS64R6O0-NEXT:    daddu $1, $1, $25
5773; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd16)))
5774; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
5775; MIPS64R6O0-NEXT:    ld $1, %got_disp(z)($1)
5776; MIPS64R6O0-NEXT:    daddiu $2, $zero, -4
5777; MIPS64R6O0-NEXT:    and $2, $1, $2
5778; MIPS64R6O0-NEXT:    andi $1, $1, 3
5779; MIPS64R6O0-NEXT:    xori $1, $1, 2
5780; MIPS64R6O0-NEXT:    sll $1, $1, 3
5781; MIPS64R6O0-NEXT:    ori $3, $zero, 65535
5782; MIPS64R6O0-NEXT:    sllv $3, $3, $1
5783; MIPS64R6O0-NEXT:    nor $5, $zero, $3
5784; MIPS64R6O0-NEXT:    sllv $4, $4, $1
5785; MIPS64R6O0-NEXT:  .LBB14_1: # %entry
5786; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
5787; MIPS64R6O0-NEXT:    ll $7, 0($2)
5788; MIPS64R6O0-NEXT:    addu $8, $7, $4
5789; MIPS64R6O0-NEXT:    and $8, $8, $3
5790; MIPS64R6O0-NEXT:    and $9, $7, $5
5791; MIPS64R6O0-NEXT:    or $9, $9, $8
5792; MIPS64R6O0-NEXT:    sc $9, 0($2)
5793; MIPS64R6O0-NEXT:    beqzc $9, .LBB14_1
5794; MIPS64R6O0-NEXT:  # %bb.2: # %entry
5795; MIPS64R6O0-NEXT:    and $6, $7, $3
5796; MIPS64R6O0-NEXT:    srlv $6, $6, $1
5797; MIPS64R6O0-NEXT:    seh $6, $6
5798; MIPS64R6O0-NEXT:  # %bb.3: # %entry
5799; MIPS64R6O0-NEXT:    sw $6, 12($sp) # 4-byte Folded Spill
5800; MIPS64R6O0-NEXT:  # %bb.4: # %entry
5801; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
5802; MIPS64R6O0-NEXT:    seh $2, $1
5803; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
5804; MIPS64R6O0-NEXT:    jrc $ra
5805;
5806; MM32-LABEL: AtomicLoadAdd16:
5807; MM32:       # %bb.0: # %entry
5808; MM32-NEXT:    lui $2, %hi(_gp_disp)
5809; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
5810; MM32-NEXT:    addu $2, $2, $25
5811; MM32-NEXT:    lw $1, %got(z)($2)
5812; MM32-NEXT:    addiu $2, $zero, -4
5813; MM32-NEXT:    and $2, $1, $2
5814; MM32-NEXT:    andi $1, $1, 3
5815; MM32-NEXT:    sll $3, $1, 3
5816; MM32-NEXT:    ori $1, $zero, 65535
5817; MM32-NEXT:    sllv $5, $1, $3
5818; MM32-NEXT:    nor $6, $zero, $5
5819; MM32-NEXT:    sllv $4, $4, $3
5820; MM32-NEXT:  $BB14_1: # %entry
5821; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
5822; MM32-NEXT:    ll $7, 0($2)
5823; MM32-NEXT:    addu $8, $7, $4
5824; MM32-NEXT:    and $8, $8, $5
5825; MM32-NEXT:    and $9, $7, $6
5826; MM32-NEXT:    or $9, $9, $8
5827; MM32-NEXT:    sc $9, 0($2)
5828; MM32-NEXT:    beqzc $9, $BB14_1
5829; MM32-NEXT:  # %bb.2: # %entry
5830; MM32-NEXT:    and $1, $7, $5
5831; MM32-NEXT:    srlv $1, $1, $3
5832; MM32-NEXT:    seh $1, $1
5833; MM32-NEXT:  # %bb.3: # %entry
5834; MM32-NEXT:    jr $ra
5835; MM32-NEXT:    seh $2, $1
5836;
5837; O1-LABEL: AtomicLoadAdd16:
5838; O1:       # %bb.0: # %entry
5839; O1-NEXT:    lui $2, %hi(_gp_disp)
5840; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
5841; O1-NEXT:    addu $1, $2, $25
5842; O1-NEXT:    lw $1, %got(z)($1)
5843; O1-NEXT:    addiu $2, $zero, -4
5844; O1-NEXT:    and $2, $1, $2
5845; O1-NEXT:    andi $1, $1, 3
5846; O1-NEXT:    sll $3, $1, 3
5847; O1-NEXT:    ori $1, $zero, 65535
5848; O1-NEXT:    sllv $5, $1, $3
5849; O1-NEXT:    nor $6, $zero, $5
5850; O1-NEXT:    sllv $4, $4, $3
5851; O1-NEXT:  $BB14_1: # %entry
5852; O1-NEXT:    # =>This Inner Loop Header: Depth=1
5853; O1-NEXT:    ll $7, 0($2)
5854; O1-NEXT:    addu $8, $7, $4
5855; O1-NEXT:    and $8, $8, $5
5856; O1-NEXT:    and $9, $7, $6
5857; O1-NEXT:    or $9, $9, $8
5858; O1-NEXT:    sc $9, 0($2)
5859; O1-NEXT:    beqz $9, $BB14_1
5860; O1-NEXT:    nop
5861; O1-NEXT:  # %bb.2: # %entry
5862; O1-NEXT:    and $1, $7, $5
5863; O1-NEXT:    srlv $1, $1, $3
5864; O1-NEXT:    sll $1, $1, 16
5865; O1-NEXT:    sra $1, $1, 16
5866; O1-NEXT:  # %bb.3: # %entry
5867; O1-NEXT:    sll $1, $1, 16
5868; O1-NEXT:    jr $ra
5869; O1-NEXT:    sra $2, $1, 16
5870;
5871; O2-LABEL: AtomicLoadAdd16:
5872; O2:       # %bb.0: # %entry
5873; O2-NEXT:    lui $2, %hi(_gp_disp)
5874; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
5875; O2-NEXT:    addu $1, $2, $25
5876; O2-NEXT:    lw $1, %got(z)($1)
5877; O2-NEXT:    addiu $2, $zero, -4
5878; O2-NEXT:    and $2, $1, $2
5879; O2-NEXT:    andi $1, $1, 3
5880; O2-NEXT:    sll $3, $1, 3
5881; O2-NEXT:    ori $1, $zero, 65535
5882; O2-NEXT:    sllv $5, $1, $3
5883; O2-NEXT:    nor $6, $zero, $5
5884; O2-NEXT:    sllv $4, $4, $3
5885; O2-NEXT:  $BB14_1: # %entry
5886; O2-NEXT:    # =>This Inner Loop Header: Depth=1
5887; O2-NEXT:    ll $7, 0($2)
5888; O2-NEXT:    addu $8, $7, $4
5889; O2-NEXT:    and $8, $8, $5
5890; O2-NEXT:    and $9, $7, $6
5891; O2-NEXT:    or $9, $9, $8
5892; O2-NEXT:    sc $9, 0($2)
5893; O2-NEXT:    beqz $9, $BB14_1
5894; O2-NEXT:    nop
5895; O2-NEXT:  # %bb.2: # %entry
5896; O2-NEXT:    and $1, $7, $5
5897; O2-NEXT:    srlv $1, $1, $3
5898; O2-NEXT:    sll $1, $1, 16
5899; O2-NEXT:    sra $1, $1, 16
5900; O2-NEXT:  # %bb.3: # %entry
5901; O2-NEXT:    sll $1, $1, 16
5902; O2-NEXT:    jr $ra
5903; O2-NEXT:    sra $2, $1, 16
5904;
5905; O3-LABEL: AtomicLoadAdd16:
5906; O3:       # %bb.0: # %entry
5907; O3-NEXT:    lui $2, %hi(_gp_disp)
5908; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
5909; O3-NEXT:    addu $1, $2, $25
5910; O3-NEXT:    addiu $2, $zero, -4
5911; O3-NEXT:    lw $1, %got(z)($1)
5912; O3-NEXT:    and $2, $1, $2
5913; O3-NEXT:    andi $1, $1, 3
5914; O3-NEXT:    sll $3, $1, 3
5915; O3-NEXT:    ori $1, $zero, 65535
5916; O3-NEXT:    sllv $5, $1, $3
5917; O3-NEXT:    sllv $4, $4, $3
5918; O3-NEXT:    nor $6, $zero, $5
5919; O3-NEXT:  $BB14_1: # %entry
5920; O3-NEXT:    # =>This Inner Loop Header: Depth=1
5921; O3-NEXT:    ll $7, 0($2)
5922; O3-NEXT:    addu $8, $7, $4
5923; O3-NEXT:    and $8, $8, $5
5924; O3-NEXT:    and $9, $7, $6
5925; O3-NEXT:    or $9, $9, $8
5926; O3-NEXT:    sc $9, 0($2)
5927; O3-NEXT:    beqz $9, $BB14_1
5928; O3-NEXT:    nop
5929; O3-NEXT:  # %bb.2: # %entry
5930; O3-NEXT:    and $1, $7, $5
5931; O3-NEXT:    srlv $1, $1, $3
5932; O3-NEXT:    sll $1, $1, 16
5933; O3-NEXT:    sra $1, $1, 16
5934; O3-NEXT:  # %bb.3: # %entry
5935; O3-NEXT:    sll $1, $1, 16
5936; O3-NEXT:    jr $ra
5937; O3-NEXT:    sra $2, $1, 16
5938;
5939; MIPS32EB-LABEL: AtomicLoadAdd16:
5940; MIPS32EB:       # %bb.0: # %entry
5941; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
5942; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
5943; MIPS32EB-NEXT:    addu $1, $2, $25
5944; MIPS32EB-NEXT:    lw $1, %got(z)($1)
5945; MIPS32EB-NEXT:    addiu $2, $zero, -4
5946; MIPS32EB-NEXT:    and $2, $1, $2
5947; MIPS32EB-NEXT:    andi $1, $1, 3
5948; MIPS32EB-NEXT:    xori $1, $1, 2
5949; MIPS32EB-NEXT:    sll $3, $1, 3
5950; MIPS32EB-NEXT:    ori $1, $zero, 65535
5951; MIPS32EB-NEXT:    sllv $5, $1, $3
5952; MIPS32EB-NEXT:    nor $6, $zero, $5
5953; MIPS32EB-NEXT:    sllv $4, $4, $3
5954; MIPS32EB-NEXT:  $BB14_1: # %entry
5955; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
5956; MIPS32EB-NEXT:    ll $7, 0($2)
5957; MIPS32EB-NEXT:    addu $8, $7, $4
5958; MIPS32EB-NEXT:    and $8, $8, $5
5959; MIPS32EB-NEXT:    and $9, $7, $6
5960; MIPS32EB-NEXT:    or $9, $9, $8
5961; MIPS32EB-NEXT:    sc $9, 0($2)
5962; MIPS32EB-NEXT:    beqz $9, $BB14_1
5963; MIPS32EB-NEXT:    nop
5964; MIPS32EB-NEXT:  # %bb.2: # %entry
5965; MIPS32EB-NEXT:    and $1, $7, $5
5966; MIPS32EB-NEXT:    srlv $1, $1, $3
5967; MIPS32EB-NEXT:    sll $1, $1, 16
5968; MIPS32EB-NEXT:    sra $1, $1, 16
5969; MIPS32EB-NEXT:  # %bb.3: # %entry
5970; MIPS32EB-NEXT:    sll $1, $1, 16
5971; MIPS32EB-NEXT:    jr $ra
5972; MIPS32EB-NEXT:    sra $2, $1, 16
5973entry:
5974  %0 = atomicrmw add i16* @z, i16 %incr monotonic
5975  ret i16 %0
5976
5977}
5978
5979; Test that the i16 return value from cmpxchg is recognised as signed,
5980; so that setCC doesn't end up comparing an unsigned value to a signed
5981; value.
5982; The rest of the functions here are testing the atomic expansion, so
5983; we just match the end of the function.
5984define {i16, i1} @foo(i16* %addr, i16 %l, i16 %r, i16 %new) {
5985; MIPS32-LABEL: foo:
5986; MIPS32:       # %bb.0:
5987; MIPS32-NEXT:    addu $1, $5, $6
5988; MIPS32-NEXT:    sync
5989; MIPS32-NEXT:    addiu $2, $zero, -4
5990; MIPS32-NEXT:    and $3, $4, $2
5991; MIPS32-NEXT:    andi $2, $4, 3
5992; MIPS32-NEXT:    sll $4, $2, 3
5993; MIPS32-NEXT:    ori $2, $zero, 65535
5994; MIPS32-NEXT:    sllv $5, $2, $4
5995; MIPS32-NEXT:    nor $6, $zero, $5
5996; MIPS32-NEXT:    andi $2, $1, 65535
5997; MIPS32-NEXT:    sllv $8, $2, $4
5998; MIPS32-NEXT:    andi $2, $7, 65535
5999; MIPS32-NEXT:    sllv $7, $2, $4
6000; MIPS32-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6001; MIPS32-NEXT:    ll $9, 0($3)
6002; MIPS32-NEXT:    and $10, $9, $5
6003; MIPS32-NEXT:    bne $10, $8, $BB15_3
6004; MIPS32-NEXT:    nop
6005; MIPS32-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6006; MIPS32-NEXT:    and $9, $9, $6
6007; MIPS32-NEXT:    or $9, $9, $7
6008; MIPS32-NEXT:    sc $9, 0($3)
6009; MIPS32-NEXT:    beqz $9, $BB15_1
6010; MIPS32-NEXT:    nop
6011; MIPS32-NEXT:  $BB15_3:
6012; MIPS32-NEXT:    srlv $2, $10, $4
6013; MIPS32-NEXT:    sll $2, $2, 16
6014; MIPS32-NEXT:    sra $2, $2, 16
6015; MIPS32-NEXT:  # %bb.4:
6016; MIPS32-NEXT:    sll $1, $1, 16
6017; MIPS32-NEXT:    sra $1, $1, 16
6018; MIPS32-NEXT:    xor $1, $2, $1
6019; MIPS32-NEXT:    sltiu $3, $1, 1
6020; MIPS32-NEXT:    sync
6021; MIPS32-NEXT:    jr $ra
6022; MIPS32-NEXT:    nop
6023;
6024; MIPS32O0-LABEL: foo:
6025; MIPS32O0:       # %bb.0:
6026; MIPS32O0-NEXT:    addiu $sp, $sp, -8
6027; MIPS32O0-NEXT:    .cfi_def_cfa_offset 8
6028; MIPS32O0-NEXT:    addu $1, $5, $6
6029; MIPS32O0-NEXT:    sync
6030; MIPS32O0-NEXT:    addiu $2, $zero, -4
6031; MIPS32O0-NEXT:    and $2, $4, $2
6032; MIPS32O0-NEXT:    andi $3, $4, 3
6033; MIPS32O0-NEXT:    sll $3, $3, 3
6034; MIPS32O0-NEXT:    ori $4, $zero, 65535
6035; MIPS32O0-NEXT:    sllv $4, $4, $3
6036; MIPS32O0-NEXT:    nor $5, $zero, $4
6037; MIPS32O0-NEXT:    andi $6, $1, 65535
6038; MIPS32O0-NEXT:    sllv $6, $6, $3
6039; MIPS32O0-NEXT:    andi $7, $7, 65535
6040; MIPS32O0-NEXT:    sllv $7, $7, $3
6041; MIPS32O0-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6042; MIPS32O0-NEXT:    ll $9, 0($2)
6043; MIPS32O0-NEXT:    and $10, $9, $4
6044; MIPS32O0-NEXT:    bne $10, $6, $BB15_3
6045; MIPS32O0-NEXT:    nop
6046; MIPS32O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6047; MIPS32O0-NEXT:    and $9, $9, $5
6048; MIPS32O0-NEXT:    or $9, $9, $7
6049; MIPS32O0-NEXT:    sc $9, 0($2)
6050; MIPS32O0-NEXT:    beqz $9, $BB15_1
6051; MIPS32O0-NEXT:    nop
6052; MIPS32O0-NEXT:  $BB15_3:
6053; MIPS32O0-NEXT:    srlv $8, $10, $3
6054; MIPS32O0-NEXT:    sll $8, $8, 16
6055; MIPS32O0-NEXT:    sra $8, $8, 16
6056; MIPS32O0-NEXT:  # %bb.4:
6057; MIPS32O0-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
6058; MIPS32O0-NEXT:    sw $8, 0($sp) # 4-byte Folded Spill
6059; MIPS32O0-NEXT:  # %bb.5:
6060; MIPS32O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
6061; MIPS32O0-NEXT:    sll $2, $1, 16
6062; MIPS32O0-NEXT:    sra $2, $2, 16
6063; MIPS32O0-NEXT:    lw $3, 0($sp) # 4-byte Folded Reload
6064; MIPS32O0-NEXT:    xor $2, $3, $2
6065; MIPS32O0-NEXT:    sltiu $3, $2, 1
6066; MIPS32O0-NEXT:    sync
6067; MIPS32O0-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
6068; MIPS32O0-NEXT:    addiu $sp, $sp, 8
6069; MIPS32O0-NEXT:    jr $ra
6070; MIPS32O0-NEXT:    nop
6071;
6072; MIPS32R2-LABEL: foo:
6073; MIPS32R2:       # %bb.0:
6074; MIPS32R2-NEXT:    addu $1, $5, $6
6075; MIPS32R2-NEXT:    sync
6076; MIPS32R2-NEXT:    addiu $2, $zero, -4
6077; MIPS32R2-NEXT:    and $3, $4, $2
6078; MIPS32R2-NEXT:    andi $2, $4, 3
6079; MIPS32R2-NEXT:    sll $4, $2, 3
6080; MIPS32R2-NEXT:    ori $2, $zero, 65535
6081; MIPS32R2-NEXT:    sllv $5, $2, $4
6082; MIPS32R2-NEXT:    nor $6, $zero, $5
6083; MIPS32R2-NEXT:    andi $2, $1, 65535
6084; MIPS32R2-NEXT:    sllv $8, $2, $4
6085; MIPS32R2-NEXT:    andi $2, $7, 65535
6086; MIPS32R2-NEXT:    sllv $7, $2, $4
6087; MIPS32R2-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6088; MIPS32R2-NEXT:    ll $9, 0($3)
6089; MIPS32R2-NEXT:    and $10, $9, $5
6090; MIPS32R2-NEXT:    bne $10, $8, $BB15_3
6091; MIPS32R2-NEXT:    nop
6092; MIPS32R2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6093; MIPS32R2-NEXT:    and $9, $9, $6
6094; MIPS32R2-NEXT:    or $9, $9, $7
6095; MIPS32R2-NEXT:    sc $9, 0($3)
6096; MIPS32R2-NEXT:    beqz $9, $BB15_1
6097; MIPS32R2-NEXT:    nop
6098; MIPS32R2-NEXT:  $BB15_3:
6099; MIPS32R2-NEXT:    srlv $2, $10, $4
6100; MIPS32R2-NEXT:    seh $2, $2
6101; MIPS32R2-NEXT:  # %bb.4:
6102; MIPS32R2-NEXT:    seh $1, $1
6103; MIPS32R2-NEXT:    xor $1, $2, $1
6104; MIPS32R2-NEXT:    sltiu $3, $1, 1
6105; MIPS32R2-NEXT:    sync
6106; MIPS32R2-NEXT:    jr $ra
6107; MIPS32R2-NEXT:    nop
6108;
6109; MIPS32R6-LABEL: foo:
6110; MIPS32R6:       # %bb.0:
6111; MIPS32R6-NEXT:    addu $1, $5, $6
6112; MIPS32R6-NEXT:    sync
6113; MIPS32R6-NEXT:    addiu $2, $zero, -4
6114; MIPS32R6-NEXT:    and $3, $4, $2
6115; MIPS32R6-NEXT:    andi $2, $4, 3
6116; MIPS32R6-NEXT:    sll $4, $2, 3
6117; MIPS32R6-NEXT:    ori $2, $zero, 65535
6118; MIPS32R6-NEXT:    sllv $5, $2, $4
6119; MIPS32R6-NEXT:    nor $6, $zero, $5
6120; MIPS32R6-NEXT:    andi $2, $1, 65535
6121; MIPS32R6-NEXT:    sllv $8, $2, $4
6122; MIPS32R6-NEXT:    andi $2, $7, 65535
6123; MIPS32R6-NEXT:    sllv $7, $2, $4
6124; MIPS32R6-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6125; MIPS32R6-NEXT:    ll $9, 0($3)
6126; MIPS32R6-NEXT:    and $10, $9, $5
6127; MIPS32R6-NEXT:    bnec $10, $8, $BB15_3
6128; MIPS32R6-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6129; MIPS32R6-NEXT:    and $9, $9, $6
6130; MIPS32R6-NEXT:    or $9, $9, $7
6131; MIPS32R6-NEXT:    sc $9, 0($3)
6132; MIPS32R6-NEXT:    beqzc $9, $BB15_1
6133; MIPS32R6-NEXT:  $BB15_3:
6134; MIPS32R6-NEXT:    srlv $2, $10, $4
6135; MIPS32R6-NEXT:    seh $2, $2
6136; MIPS32R6-NEXT:  # %bb.4:
6137; MIPS32R6-NEXT:    seh $1, $1
6138; MIPS32R6-NEXT:    xor $1, $2, $1
6139; MIPS32R6-NEXT:    sltiu $3, $1, 1
6140; MIPS32R6-NEXT:    sync
6141; MIPS32R6-NEXT:    jrc $ra
6142;
6143; MIPS32R6O0-LABEL: foo:
6144; MIPS32R6O0:       # %bb.0:
6145; MIPS32R6O0-NEXT:    addiu $sp, $sp, -8
6146; MIPS32R6O0-NEXT:    .cfi_def_cfa_offset 8
6147; MIPS32R6O0-NEXT:    move $1, $7
6148; MIPS32R6O0-NEXT:    move $2, $6
6149; MIPS32R6O0-NEXT:    move $3, $5
6150; MIPS32R6O0-NEXT:    addu $5, $5, $6
6151; MIPS32R6O0-NEXT:    sync
6152; MIPS32R6O0-NEXT:    addiu $6, $zero, -4
6153; MIPS32R6O0-NEXT:    and $6, $4, $6
6154; MIPS32R6O0-NEXT:    andi $4, $4, 3
6155; MIPS32R6O0-NEXT:    sll $4, $4, 3
6156; MIPS32R6O0-NEXT:    ori $8, $zero, 65535
6157; MIPS32R6O0-NEXT:    sllv $8, $8, $4
6158; MIPS32R6O0-NEXT:    nor $9, $zero, $8
6159; MIPS32R6O0-NEXT:    andi $10, $5, 65535
6160; MIPS32R6O0-NEXT:    sllv $10, $10, $4
6161; MIPS32R6O0-NEXT:    andi $7, $7, 65535
6162; MIPS32R6O0-NEXT:    sllv $7, $7, $4
6163; MIPS32R6O0-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6164; MIPS32R6O0-NEXT:    ll $12, 0($6)
6165; MIPS32R6O0-NEXT:    and $13, $12, $8
6166; MIPS32R6O0-NEXT:    bnec $13, $10, $BB15_3
6167; MIPS32R6O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6168; MIPS32R6O0-NEXT:    and $12, $12, $9
6169; MIPS32R6O0-NEXT:    or $12, $12, $7
6170; MIPS32R6O0-NEXT:    sc $12, 0($6)
6171; MIPS32R6O0-NEXT:    beqzc $12, $BB15_1
6172; MIPS32R6O0-NEXT:  $BB15_3:
6173; MIPS32R6O0-NEXT:    srlv $11, $13, $4
6174; MIPS32R6O0-NEXT:    seh $11, $11
6175; MIPS32R6O0-NEXT:  # %bb.4:
6176; MIPS32R6O0-NEXT:    sw $5, 4($sp) # 4-byte Folded Spill
6177; MIPS32R6O0-NEXT:    sw $11, 0($sp) # 4-byte Folded Spill
6178; MIPS32R6O0-NEXT:  # %bb.5:
6179; MIPS32R6O0-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
6180; MIPS32R6O0-NEXT:    seh $2, $1
6181; MIPS32R6O0-NEXT:    lw $3, 0($sp) # 4-byte Folded Reload
6182; MIPS32R6O0-NEXT:    xor $2, $3, $2
6183; MIPS32R6O0-NEXT:    sltiu $3, $2, 1
6184; MIPS32R6O0-NEXT:    sync
6185; MIPS32R6O0-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
6186; MIPS32R6O0-NEXT:    addiu $sp, $sp, 8
6187; MIPS32R6O0-NEXT:    jrc $ra
6188;
6189; MIPS4-LABEL: foo:
6190; MIPS4:       # %bb.0:
6191; MIPS4-NEXT:    sll $1, $6, 0
6192; MIPS4-NEXT:    sll $2, $5, 0
6193; MIPS4-NEXT:    addu $1, $2, $1
6194; MIPS4-NEXT:    sync
6195; MIPS4-NEXT:    sll $2, $7, 0
6196; MIPS4-NEXT:    daddiu $3, $zero, -4
6197; MIPS4-NEXT:    and $3, $4, $3
6198; MIPS4-NEXT:    andi $4, $4, 3
6199; MIPS4-NEXT:    sll $4, $4, 3
6200; MIPS4-NEXT:    ori $5, $zero, 65535
6201; MIPS4-NEXT:    sllv $5, $5, $4
6202; MIPS4-NEXT:    nor $6, $zero, $5
6203; MIPS4-NEXT:    andi $7, $1, 65535
6204; MIPS4-NEXT:    sllv $7, $7, $4
6205; MIPS4-NEXT:    andi $2, $2, 65535
6206; MIPS4-NEXT:    sllv $8, $2, $4
6207; MIPS4-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6208; MIPS4-NEXT:    ll $9, 0($3)
6209; MIPS4-NEXT:    and $10, $9, $5
6210; MIPS4-NEXT:    bne $10, $7, .LBB15_3
6211; MIPS4-NEXT:    nop
6212; MIPS4-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6213; MIPS4-NEXT:    and $9, $9, $6
6214; MIPS4-NEXT:    or $9, $9, $8
6215; MIPS4-NEXT:    sc $9, 0($3)
6216; MIPS4-NEXT:    beqz $9, .LBB15_1
6217; MIPS4-NEXT:    nop
6218; MIPS4-NEXT:  .LBB15_3:
6219; MIPS4-NEXT:    srlv $2, $10, $4
6220; MIPS4-NEXT:    sll $2, $2, 16
6221; MIPS4-NEXT:    sra $2, $2, 16
6222; MIPS4-NEXT:  # %bb.4:
6223; MIPS4-NEXT:    sll $1, $1, 16
6224; MIPS4-NEXT:    sra $1, $1, 16
6225; MIPS4-NEXT:    xor $1, $2, $1
6226; MIPS4-NEXT:    sltiu $3, $1, 1
6227; MIPS4-NEXT:    sync
6228; MIPS4-NEXT:    jr $ra
6229; MIPS4-NEXT:    nop
6230;
6231; MIPS64-LABEL: foo:
6232; MIPS64:       # %bb.0:
6233; MIPS64-NEXT:    sll $1, $6, 0
6234; MIPS64-NEXT:    sll $2, $5, 0
6235; MIPS64-NEXT:    addu $1, $2, $1
6236; MIPS64-NEXT:    sync
6237; MIPS64-NEXT:    sll $2, $7, 0
6238; MIPS64-NEXT:    daddiu $3, $zero, -4
6239; MIPS64-NEXT:    and $3, $4, $3
6240; MIPS64-NEXT:    andi $4, $4, 3
6241; MIPS64-NEXT:    sll $4, $4, 3
6242; MIPS64-NEXT:    ori $5, $zero, 65535
6243; MIPS64-NEXT:    sllv $5, $5, $4
6244; MIPS64-NEXT:    nor $6, $zero, $5
6245; MIPS64-NEXT:    andi $7, $1, 65535
6246; MIPS64-NEXT:    sllv $7, $7, $4
6247; MIPS64-NEXT:    andi $2, $2, 65535
6248; MIPS64-NEXT:    sllv $8, $2, $4
6249; MIPS64-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6250; MIPS64-NEXT:    ll $9, 0($3)
6251; MIPS64-NEXT:    and $10, $9, $5
6252; MIPS64-NEXT:    bne $10, $7, .LBB15_3
6253; MIPS64-NEXT:    nop
6254; MIPS64-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6255; MIPS64-NEXT:    and $9, $9, $6
6256; MIPS64-NEXT:    or $9, $9, $8
6257; MIPS64-NEXT:    sc $9, 0($3)
6258; MIPS64-NEXT:    beqz $9, .LBB15_1
6259; MIPS64-NEXT:    nop
6260; MIPS64-NEXT:  .LBB15_3:
6261; MIPS64-NEXT:    srlv $2, $10, $4
6262; MIPS64-NEXT:    sll $2, $2, 16
6263; MIPS64-NEXT:    sra $2, $2, 16
6264; MIPS64-NEXT:  # %bb.4:
6265; MIPS64-NEXT:    sll $1, $1, 16
6266; MIPS64-NEXT:    sra $1, $1, 16
6267; MIPS64-NEXT:    xor $1, $2, $1
6268; MIPS64-NEXT:    sltiu $3, $1, 1
6269; MIPS64-NEXT:    sync
6270; MIPS64-NEXT:    jr $ra
6271; MIPS64-NEXT:    nop
6272;
6273; MIPS64R2-LABEL: foo:
6274; MIPS64R2:       # %bb.0:
6275; MIPS64R2-NEXT:    sll $1, $6, 0
6276; MIPS64R2-NEXT:    sll $2, $5, 0
6277; MIPS64R2-NEXT:    addu $1, $2, $1
6278; MIPS64R2-NEXT:    sync
6279; MIPS64R2-NEXT:    sll $2, $7, 0
6280; MIPS64R2-NEXT:    daddiu $3, $zero, -4
6281; MIPS64R2-NEXT:    and $3, $4, $3
6282; MIPS64R2-NEXT:    andi $4, $4, 3
6283; MIPS64R2-NEXT:    sll $4, $4, 3
6284; MIPS64R2-NEXT:    ori $5, $zero, 65535
6285; MIPS64R2-NEXT:    sllv $5, $5, $4
6286; MIPS64R2-NEXT:    nor $6, $zero, $5
6287; MIPS64R2-NEXT:    andi $7, $1, 65535
6288; MIPS64R2-NEXT:    sllv $7, $7, $4
6289; MIPS64R2-NEXT:    andi $2, $2, 65535
6290; MIPS64R2-NEXT:    sllv $8, $2, $4
6291; MIPS64R2-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6292; MIPS64R2-NEXT:    ll $9, 0($3)
6293; MIPS64R2-NEXT:    and $10, $9, $5
6294; MIPS64R2-NEXT:    bne $10, $7, .LBB15_3
6295; MIPS64R2-NEXT:    nop
6296; MIPS64R2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6297; MIPS64R2-NEXT:    and $9, $9, $6
6298; MIPS64R2-NEXT:    or $9, $9, $8
6299; MIPS64R2-NEXT:    sc $9, 0($3)
6300; MIPS64R2-NEXT:    beqz $9, .LBB15_1
6301; MIPS64R2-NEXT:    nop
6302; MIPS64R2-NEXT:  .LBB15_3:
6303; MIPS64R2-NEXT:    srlv $2, $10, $4
6304; MIPS64R2-NEXT:    seh $2, $2
6305; MIPS64R2-NEXT:  # %bb.4:
6306; MIPS64R2-NEXT:    seh $1, $1
6307; MIPS64R2-NEXT:    xor $1, $2, $1
6308; MIPS64R2-NEXT:    sltiu $3, $1, 1
6309; MIPS64R2-NEXT:    sync
6310; MIPS64R2-NEXT:    jr $ra
6311; MIPS64R2-NEXT:    nop
6312;
6313; MIPS64R6-LABEL: foo:
6314; MIPS64R6:       # %bb.0:
6315; MIPS64R6-NEXT:    sll $1, $6, 0
6316; MIPS64R6-NEXT:    sll $2, $5, 0
6317; MIPS64R6-NEXT:    addu $1, $2, $1
6318; MIPS64R6-NEXT:    sync
6319; MIPS64R6-NEXT:    sll $2, $7, 0
6320; MIPS64R6-NEXT:    daddiu $3, $zero, -4
6321; MIPS64R6-NEXT:    and $3, $4, $3
6322; MIPS64R6-NEXT:    andi $4, $4, 3
6323; MIPS64R6-NEXT:    sll $4, $4, 3
6324; MIPS64R6-NEXT:    ori $5, $zero, 65535
6325; MIPS64R6-NEXT:    sllv $5, $5, $4
6326; MIPS64R6-NEXT:    nor $6, $zero, $5
6327; MIPS64R6-NEXT:    andi $7, $1, 65535
6328; MIPS64R6-NEXT:    sllv $7, $7, $4
6329; MIPS64R6-NEXT:    andi $2, $2, 65535
6330; MIPS64R6-NEXT:    sllv $8, $2, $4
6331; MIPS64R6-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6332; MIPS64R6-NEXT:    ll $9, 0($3)
6333; MIPS64R6-NEXT:    and $10, $9, $5
6334; MIPS64R6-NEXT:    bnec $10, $7, .LBB15_3
6335; MIPS64R6-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6336; MIPS64R6-NEXT:    and $9, $9, $6
6337; MIPS64R6-NEXT:    or $9, $9, $8
6338; MIPS64R6-NEXT:    sc $9, 0($3)
6339; MIPS64R6-NEXT:    beqzc $9, .LBB15_1
6340; MIPS64R6-NEXT:  .LBB15_3:
6341; MIPS64R6-NEXT:    srlv $2, $10, $4
6342; MIPS64R6-NEXT:    seh $2, $2
6343; MIPS64R6-NEXT:  # %bb.4:
6344; MIPS64R6-NEXT:    seh $1, $1
6345; MIPS64R6-NEXT:    xor $1, $2, $1
6346; MIPS64R6-NEXT:    sltiu $3, $1, 1
6347; MIPS64R6-NEXT:    sync
6348; MIPS64R6-NEXT:    jrc $ra
6349;
6350; MIPS64R6O0-LABEL: foo:
6351; MIPS64R6O0:       # %bb.0:
6352; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
6353; MIPS64R6O0-NEXT:    .cfi_def_cfa_offset 16
6354; MIPS64R6O0-NEXT:    # kill: def $a3 killed $a3 killed $a3_64
6355; MIPS64R6O0-NEXT:    sll $1, $7, 0
6356; MIPS64R6O0-NEXT:    # kill: def $a2 killed $a2 killed $a2_64
6357; MIPS64R6O0-NEXT:    sll $2, $6, 0
6358; MIPS64R6O0-NEXT:    # kill: def $a1 killed $a1 killed $a1_64
6359; MIPS64R6O0-NEXT:    sll $3, $5, 0
6360; MIPS64R6O0-NEXT:    addu $2, $3, $2
6361; MIPS64R6O0-NEXT:    sync
6362; MIPS64R6O0-NEXT:    daddiu $3, $zero, -4
6363; MIPS64R6O0-NEXT:    and $3, $4, $3
6364; MIPS64R6O0-NEXT:    andi $4, $4, 3
6365; MIPS64R6O0-NEXT:    xori $4, $4, 2
6366; MIPS64R6O0-NEXT:    sll $4, $4, 3
6367; MIPS64R6O0-NEXT:    ori $5, $zero, 65535
6368; MIPS64R6O0-NEXT:    sllv $5, $5, $4
6369; MIPS64R6O0-NEXT:    nor $6, $zero, $5
6370; MIPS64R6O0-NEXT:    andi $7, $2, 65535
6371; MIPS64R6O0-NEXT:    sllv $7, $7, $4
6372; MIPS64R6O0-NEXT:    andi $1, $1, 65535
6373; MIPS64R6O0-NEXT:    sllv $1, $1, $4
6374; MIPS64R6O0-NEXT:  .LBB15_1: # =>This Inner Loop Header: Depth=1
6375; MIPS64R6O0-NEXT:    ll $9, 0($3)
6376; MIPS64R6O0-NEXT:    and $10, $9, $5
6377; MIPS64R6O0-NEXT:    bnec $10, $7, .LBB15_3
6378; MIPS64R6O0-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6379; MIPS64R6O0-NEXT:    and $9, $9, $6
6380; MIPS64R6O0-NEXT:    or $9, $9, $1
6381; MIPS64R6O0-NEXT:    sc $9, 0($3)
6382; MIPS64R6O0-NEXT:    beqzc $9, .LBB15_1
6383; MIPS64R6O0-NEXT:  .LBB15_3:
6384; MIPS64R6O0-NEXT:    srlv $8, $10, $4
6385; MIPS64R6O0-NEXT:    seh $8, $8
6386; MIPS64R6O0-NEXT:  # %bb.4:
6387; MIPS64R6O0-NEXT:    sw $2, 12($sp) # 4-byte Folded Spill
6388; MIPS64R6O0-NEXT:    sw $8, 8($sp) # 4-byte Folded Spill
6389; MIPS64R6O0-NEXT:  # %bb.5:
6390; MIPS64R6O0-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
6391; MIPS64R6O0-NEXT:    seh $2, $1
6392; MIPS64R6O0-NEXT:    lw $3, 8($sp) # 4-byte Folded Reload
6393; MIPS64R6O0-NEXT:    xor $2, $3, $2
6394; MIPS64R6O0-NEXT:    sltiu $3, $2, 1
6395; MIPS64R6O0-NEXT:    sync
6396; MIPS64R6O0-NEXT:    lw $2, 8($sp) # 4-byte Folded Reload
6397; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
6398; MIPS64R6O0-NEXT:    jrc $ra
6399;
6400; MM32-LABEL: foo:
6401; MM32:       # %bb.0:
6402; MM32-NEXT:    addu16 $3, $5, $6
6403; MM32-NEXT:    sync
6404; MM32-NEXT:    addiu $1, $zero, -4
6405; MM32-NEXT:    and $1, $4, $1
6406; MM32-NEXT:    andi $2, $4, 3
6407; MM32-NEXT:    sll $4, $2, 3
6408; MM32-NEXT:    ori $2, $zero, 65535
6409; MM32-NEXT:    sllv $5, $2, $4
6410; MM32-NEXT:    nor $6, $zero, $5
6411; MM32-NEXT:    andi $2, $3, 65535
6412; MM32-NEXT:    sllv $8, $2, $4
6413; MM32-NEXT:    andi $2, $7, 65535
6414; MM32-NEXT:    sllv $7, $2, $4
6415; MM32-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6416; MM32-NEXT:    ll $9, 0($1)
6417; MM32-NEXT:    and $10, $9, $5
6418; MM32-NEXT:    bne $10, $8, $BB15_3
6419; MM32-NEXT:    nop
6420; MM32-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6421; MM32-NEXT:    and $9, $9, $6
6422; MM32-NEXT:    or $9, $9, $7
6423; MM32-NEXT:    sc $9, 0($1)
6424; MM32-NEXT:    beqzc $9, $BB15_1
6425; MM32-NEXT:  $BB15_3:
6426; MM32-NEXT:    srlv $2, $10, $4
6427; MM32-NEXT:    seh $2, $2
6428; MM32-NEXT:  # %bb.4:
6429; MM32-NEXT:    seh $1, $3
6430; MM32-NEXT:    xor $1, $2, $1
6431; MM32-NEXT:    sltiu $3, $1, 1
6432; MM32-NEXT:    sync
6433; MM32-NEXT:    jrc $ra
6434;
6435; O1-LABEL: foo:
6436; O1:       # %bb.0:
6437; O1-NEXT:    addu $1, $5, $6
6438; O1-NEXT:    sync
6439; O1-NEXT:    addiu $2, $zero, -4
6440; O1-NEXT:    and $3, $4, $2
6441; O1-NEXT:    andi $2, $4, 3
6442; O1-NEXT:    sll $4, $2, 3
6443; O1-NEXT:    ori $2, $zero, 65535
6444; O1-NEXT:    sllv $5, $2, $4
6445; O1-NEXT:    nor $6, $zero, $5
6446; O1-NEXT:    andi $2, $1, 65535
6447; O1-NEXT:    sllv $8, $2, $4
6448; O1-NEXT:    andi $2, $7, 65535
6449; O1-NEXT:    sllv $7, $2, $4
6450; O1-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6451; O1-NEXT:    ll $9, 0($3)
6452; O1-NEXT:    and $10, $9, $5
6453; O1-NEXT:    bne $10, $8, $BB15_3
6454; O1-NEXT:    nop
6455; O1-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6456; O1-NEXT:    and $9, $9, $6
6457; O1-NEXT:    or $9, $9, $7
6458; O1-NEXT:    sc $9, 0($3)
6459; O1-NEXT:    beqz $9, $BB15_1
6460; O1-NEXT:    nop
6461; O1-NEXT:  $BB15_3:
6462; O1-NEXT:    srlv $2, $10, $4
6463; O1-NEXT:    sll $2, $2, 16
6464; O1-NEXT:    sra $2, $2, 16
6465; O1-NEXT:  # %bb.4:
6466; O1-NEXT:    sll $1, $1, 16
6467; O1-NEXT:    sra $1, $1, 16
6468; O1-NEXT:    xor $1, $2, $1
6469; O1-NEXT:    sltiu $3, $1, 1
6470; O1-NEXT:    sync
6471; O1-NEXT:    jr $ra
6472; O1-NEXT:    nop
6473;
6474; O2-LABEL: foo:
6475; O2:       # %bb.0:
6476; O2-NEXT:    addu $1, $5, $6
6477; O2-NEXT:    sync
6478; O2-NEXT:    addiu $2, $zero, -4
6479; O2-NEXT:    and $3, $4, $2
6480; O2-NEXT:    andi $2, $4, 3
6481; O2-NEXT:    sll $4, $2, 3
6482; O2-NEXT:    ori $2, $zero, 65535
6483; O2-NEXT:    sllv $5, $2, $4
6484; O2-NEXT:    nor $6, $zero, $5
6485; O2-NEXT:    andi $2, $1, 65535
6486; O2-NEXT:    sllv $8, $2, $4
6487; O2-NEXT:    andi $2, $7, 65535
6488; O2-NEXT:    sllv $7, $2, $4
6489; O2-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6490; O2-NEXT:    ll $9, 0($3)
6491; O2-NEXT:    and $10, $9, $5
6492; O2-NEXT:    bne $10, $8, $BB15_3
6493; O2-NEXT:    nop
6494; O2-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6495; O2-NEXT:    and $9, $9, $6
6496; O2-NEXT:    or $9, $9, $7
6497; O2-NEXT:    sc $9, 0($3)
6498; O2-NEXT:    beqz $9, $BB15_1
6499; O2-NEXT:    nop
6500; O2-NEXT:  $BB15_3:
6501; O2-NEXT:    srlv $2, $10, $4
6502; O2-NEXT:    sll $2, $2, 16
6503; O2-NEXT:    sra $2, $2, 16
6504; O2-NEXT:  # %bb.4:
6505; O2-NEXT:    sll $1, $1, 16
6506; O2-NEXT:    sra $1, $1, 16
6507; O2-NEXT:    xor $1, $2, $1
6508; O2-NEXT:    sltiu $3, $1, 1
6509; O2-NEXT:    sync
6510; O2-NEXT:    jr $ra
6511; O2-NEXT:    nop
6512;
6513; O3-LABEL: foo:
6514; O3:       # %bb.0:
6515; O3-NEXT:    addiu $2, $zero, -4
6516; O3-NEXT:    addu $1, $5, $6
6517; O3-NEXT:    sync
6518; O3-NEXT:    and $3, $4, $2
6519; O3-NEXT:    andi $2, $4, 3
6520; O3-NEXT:    sll $4, $2, 3
6521; O3-NEXT:    ori $2, $zero, 65535
6522; O3-NEXT:    sllv $5, $2, $4
6523; O3-NEXT:    andi $2, $1, 65535
6524; O3-NEXT:    sll $1, $1, 16
6525; O3-NEXT:    sllv $8, $2, $4
6526; O3-NEXT:    andi $2, $7, 65535
6527; O3-NEXT:    nor $6, $zero, $5
6528; O3-NEXT:    sra $1, $1, 16
6529; O3-NEXT:    sllv $7, $2, $4
6530; O3-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6531; O3-NEXT:    ll $9, 0($3)
6532; O3-NEXT:    and $10, $9, $5
6533; O3-NEXT:    bne $10, $8, $BB15_3
6534; O3-NEXT:    nop
6535; O3-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6536; O3-NEXT:    and $9, $9, $6
6537; O3-NEXT:    or $9, $9, $7
6538; O3-NEXT:    sc $9, 0($3)
6539; O3-NEXT:    beqz $9, $BB15_1
6540; O3-NEXT:    nop
6541; O3-NEXT:  $BB15_3:
6542; O3-NEXT:    srlv $2, $10, $4
6543; O3-NEXT:    sll $2, $2, 16
6544; O3-NEXT:    sra $2, $2, 16
6545; O3-NEXT:  # %bb.4:
6546; O3-NEXT:    sync
6547; O3-NEXT:    xor $1, $2, $1
6548; O3-NEXT:    jr $ra
6549; O3-NEXT:    sltiu $3, $1, 1
6550;
6551; MIPS32EB-LABEL: foo:
6552; MIPS32EB:       # %bb.0:
6553; MIPS32EB-NEXT:    addu $1, $5, $6
6554; MIPS32EB-NEXT:    sync
6555; MIPS32EB-NEXT:    addiu $2, $zero, -4
6556; MIPS32EB-NEXT:    and $3, $4, $2
6557; MIPS32EB-NEXT:    andi $2, $4, 3
6558; MIPS32EB-NEXT:    xori $2, $2, 2
6559; MIPS32EB-NEXT:    sll $4, $2, 3
6560; MIPS32EB-NEXT:    ori $2, $zero, 65535
6561; MIPS32EB-NEXT:    sllv $5, $2, $4
6562; MIPS32EB-NEXT:    nor $6, $zero, $5
6563; MIPS32EB-NEXT:    andi $2, $1, 65535
6564; MIPS32EB-NEXT:    sllv $8, $2, $4
6565; MIPS32EB-NEXT:    andi $2, $7, 65535
6566; MIPS32EB-NEXT:    sllv $7, $2, $4
6567; MIPS32EB-NEXT:  $BB15_1: # =>This Inner Loop Header: Depth=1
6568; MIPS32EB-NEXT:    ll $9, 0($3)
6569; MIPS32EB-NEXT:    and $10, $9, $5
6570; MIPS32EB-NEXT:    bne $10, $8, $BB15_3
6571; MIPS32EB-NEXT:    nop
6572; MIPS32EB-NEXT:  # %bb.2: # in Loop: Header=BB15_1 Depth=1
6573; MIPS32EB-NEXT:    and $9, $9, $6
6574; MIPS32EB-NEXT:    or $9, $9, $7
6575; MIPS32EB-NEXT:    sc $9, 0($3)
6576; MIPS32EB-NEXT:    beqz $9, $BB15_1
6577; MIPS32EB-NEXT:    nop
6578; MIPS32EB-NEXT:  $BB15_3:
6579; MIPS32EB-NEXT:    srlv $2, $10, $4
6580; MIPS32EB-NEXT:    sll $2, $2, 16
6581; MIPS32EB-NEXT:    sra $2, $2, 16
6582; MIPS32EB-NEXT:  # %bb.4:
6583; MIPS32EB-NEXT:    sll $1, $1, 16
6584; MIPS32EB-NEXT:    sra $1, $1, 16
6585; MIPS32EB-NEXT:    xor $1, $2, $1
6586; MIPS32EB-NEXT:    sltiu $3, $1, 1
6587; MIPS32EB-NEXT:    sync
6588; MIPS32EB-NEXT:    jr $ra
6589; MIPS32EB-NEXT:    nop
6590  %desired = add i16 %l, %r
6591  %res = cmpxchg i16* %addr, i16 %desired, i16 %new seq_cst seq_cst
6592  ret {i16, i1} %res
6593}
6594
6595@countsint = common global i32 0, align 4
6596
6597define i32 @CheckSync(i32 signext %v) nounwind noinline {
6598; MIPS32-LABEL: CheckSync:
6599; MIPS32:       # %bb.0: # %entry
6600; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
6601; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6602; MIPS32-NEXT:    addu $1, $2, $25
6603; MIPS32-NEXT:    sync
6604; MIPS32-NEXT:    lw $1, %got(countsint)($1)
6605; MIPS32-NEXT:  $BB16_1: # %entry
6606; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
6607; MIPS32-NEXT:    ll $2, 0($1)
6608; MIPS32-NEXT:    addu $3, $2, $4
6609; MIPS32-NEXT:    sc $3, 0($1)
6610; MIPS32-NEXT:    beqz $3, $BB16_1
6611; MIPS32-NEXT:    nop
6612; MIPS32-NEXT:  # %bb.2: # %entry
6613; MIPS32-NEXT:    sync
6614; MIPS32-NEXT:    jr $ra
6615; MIPS32-NEXT:    nop
6616;
6617; MIPS32O0-LABEL: CheckSync:
6618; MIPS32O0:       # %bb.0: # %entry
6619; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
6620; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6621; MIPS32O0-NEXT:    addu $1, $2, $25
6622; MIPS32O0-NEXT:    sync
6623; MIPS32O0-NEXT:    lw $1, %got(countsint)($1)
6624; MIPS32O0-NEXT:  $BB16_1: # %entry
6625; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
6626; MIPS32O0-NEXT:    ll $2, 0($1)
6627; MIPS32O0-NEXT:    addu $3, $2, $4
6628; MIPS32O0-NEXT:    sc $3, 0($1)
6629; MIPS32O0-NEXT:    beqz $3, $BB16_1
6630; MIPS32O0-NEXT:    nop
6631; MIPS32O0-NEXT:  # %bb.2: # %entry
6632; MIPS32O0-NEXT:    sync
6633; MIPS32O0-NEXT:    jr $ra
6634; MIPS32O0-NEXT:    nop
6635;
6636; MIPS32R2-LABEL: CheckSync:
6637; MIPS32R2:       # %bb.0: # %entry
6638; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
6639; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6640; MIPS32R2-NEXT:    addu $1, $2, $25
6641; MIPS32R2-NEXT:    sync
6642; MIPS32R2-NEXT:    lw $1, %got(countsint)($1)
6643; MIPS32R2-NEXT:  $BB16_1: # %entry
6644; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
6645; MIPS32R2-NEXT:    ll $2, 0($1)
6646; MIPS32R2-NEXT:    addu $3, $2, $4
6647; MIPS32R2-NEXT:    sc $3, 0($1)
6648; MIPS32R2-NEXT:    beqz $3, $BB16_1
6649; MIPS32R2-NEXT:    nop
6650; MIPS32R2-NEXT:  # %bb.2: # %entry
6651; MIPS32R2-NEXT:    sync
6652; MIPS32R2-NEXT:    jr $ra
6653; MIPS32R2-NEXT:    nop
6654;
6655; MIPS32R6-LABEL: CheckSync:
6656; MIPS32R6:       # %bb.0: # %entry
6657; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
6658; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
6659; MIPS32R6-NEXT:    addu $1, $2, $25
6660; MIPS32R6-NEXT:    sync
6661; MIPS32R6-NEXT:    lw $1, %got(countsint)($1)
6662; MIPS32R6-NEXT:  $BB16_1: # %entry
6663; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
6664; MIPS32R6-NEXT:    ll $2, 0($1)
6665; MIPS32R6-NEXT:    addu $3, $2, $4
6666; MIPS32R6-NEXT:    sc $3, 0($1)
6667; MIPS32R6-NEXT:    beqzc $3, $BB16_1
6668; MIPS32R6-NEXT:  # %bb.2: # %entry
6669; MIPS32R6-NEXT:    sync
6670; MIPS32R6-NEXT:    jrc $ra
6671;
6672; MIPS32R6O0-LABEL: CheckSync:
6673; MIPS32R6O0:       # %bb.0: # %entry
6674; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
6675; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6676; MIPS32R6O0-NEXT:    addu $1, $2, $25
6677; MIPS32R6O0-NEXT:    sync
6678; MIPS32R6O0-NEXT:    lw $1, %got(countsint)($1)
6679; MIPS32R6O0-NEXT:  $BB16_1: # %entry
6680; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
6681; MIPS32R6O0-NEXT:    ll $2, 0($1)
6682; MIPS32R6O0-NEXT:    addu $3, $2, $4
6683; MIPS32R6O0-NEXT:    sc $3, 0($1)
6684; MIPS32R6O0-NEXT:    beqzc $3, $BB16_1
6685; MIPS32R6O0-NEXT:  # %bb.2: # %entry
6686; MIPS32R6O0-NEXT:    sync
6687; MIPS32R6O0-NEXT:    jrc $ra
6688;
6689; MIPS4-LABEL: CheckSync:
6690; MIPS4:       # %bb.0: # %entry
6691; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6692; MIPS4-NEXT:    daddu $1, $1, $25
6693; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6694; MIPS4-NEXT:    sync
6695; MIPS4-NEXT:    ld $1, %got_disp(countsint)($1)
6696; MIPS4-NEXT:  .LBB16_1: # %entry
6697; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
6698; MIPS4-NEXT:    ll $2, 0($1)
6699; MIPS4-NEXT:    addu $3, $2, $4
6700; MIPS4-NEXT:    sc $3, 0($1)
6701; MIPS4-NEXT:    beqz $3, .LBB16_1
6702; MIPS4-NEXT:    nop
6703; MIPS4-NEXT:  # %bb.2: # %entry
6704; MIPS4-NEXT:    sync
6705; MIPS4-NEXT:    jr $ra
6706; MIPS4-NEXT:    nop
6707;
6708; MIPS64-LABEL: CheckSync:
6709; MIPS64:       # %bb.0: # %entry
6710; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6711; MIPS64-NEXT:    daddu $1, $1, $25
6712; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6713; MIPS64-NEXT:    sync
6714; MIPS64-NEXT:    ld $1, %got_disp(countsint)($1)
6715; MIPS64-NEXT:  .LBB16_1: # %entry
6716; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
6717; MIPS64-NEXT:    ll $2, 0($1)
6718; MIPS64-NEXT:    addu $3, $2, $4
6719; MIPS64-NEXT:    sc $3, 0($1)
6720; MIPS64-NEXT:    beqz $3, .LBB16_1
6721; MIPS64-NEXT:    nop
6722; MIPS64-NEXT:  # %bb.2: # %entry
6723; MIPS64-NEXT:    sync
6724; MIPS64-NEXT:    jr $ra
6725; MIPS64-NEXT:    nop
6726;
6727; MIPS64R2-LABEL: CheckSync:
6728; MIPS64R2:       # %bb.0: # %entry
6729; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6730; MIPS64R2-NEXT:    daddu $1, $1, $25
6731; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6732; MIPS64R2-NEXT:    sync
6733; MIPS64R2-NEXT:    ld $1, %got_disp(countsint)($1)
6734; MIPS64R2-NEXT:  .LBB16_1: # %entry
6735; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
6736; MIPS64R2-NEXT:    ll $2, 0($1)
6737; MIPS64R2-NEXT:    addu $3, $2, $4
6738; MIPS64R2-NEXT:    sc $3, 0($1)
6739; MIPS64R2-NEXT:    beqz $3, .LBB16_1
6740; MIPS64R2-NEXT:    nop
6741; MIPS64R2-NEXT:  # %bb.2: # %entry
6742; MIPS64R2-NEXT:    sync
6743; MIPS64R2-NEXT:    jr $ra
6744; MIPS64R2-NEXT:    nop
6745;
6746; MIPS64R6-LABEL: CheckSync:
6747; MIPS64R6:       # %bb.0: # %entry
6748; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6749; MIPS64R6-NEXT:    daddu $1, $1, $25
6750; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6751; MIPS64R6-NEXT:    sync
6752; MIPS64R6-NEXT:    ld $1, %got_disp(countsint)($1)
6753; MIPS64R6-NEXT:  .LBB16_1: # %entry
6754; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
6755; MIPS64R6-NEXT:    ll $2, 0($1)
6756; MIPS64R6-NEXT:    addu $3, $2, $4
6757; MIPS64R6-NEXT:    sc $3, 0($1)
6758; MIPS64R6-NEXT:    beqzc $3, .LBB16_1
6759; MIPS64R6-NEXT:  # %bb.2: # %entry
6760; MIPS64R6-NEXT:    sync
6761; MIPS64R6-NEXT:    jrc $ra
6762;
6763; MIPS64R6O0-LABEL: CheckSync:
6764; MIPS64R6O0:       # %bb.0: # %entry
6765; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(CheckSync)))
6766; MIPS64R6O0-NEXT:    daddu $1, $1, $25
6767; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(CheckSync)))
6768; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
6769; MIPS64R6O0-NEXT:    sync
6770; MIPS64R6O0-NEXT:    ld $1, %got_disp(countsint)($1)
6771; MIPS64R6O0-NEXT:  .LBB16_1: # %entry
6772; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
6773; MIPS64R6O0-NEXT:    ll $2, 0($1)
6774; MIPS64R6O0-NEXT:    addu $3, $2, $4
6775; MIPS64R6O0-NEXT:    sc $3, 0($1)
6776; MIPS64R6O0-NEXT:    beqzc $3, .LBB16_1
6777; MIPS64R6O0-NEXT:  # %bb.2: # %entry
6778; MIPS64R6O0-NEXT:    sync
6779; MIPS64R6O0-NEXT:    jrc $ra
6780;
6781; MM32-LABEL: CheckSync:
6782; MM32:       # %bb.0: # %entry
6783; MM32-NEXT:    lui $2, %hi(_gp_disp)
6784; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6785; MM32-NEXT:    addu $2, $2, $25
6786; MM32-NEXT:    sync
6787; MM32-NEXT:    lw $1, %got(countsint)($2)
6788; MM32-NEXT:  $BB16_1: # %entry
6789; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
6790; MM32-NEXT:    ll $2, 0($1)
6791; MM32-NEXT:    addu16 $3, $2, $4
6792; MM32-NEXT:    sc $3, 0($1)
6793; MM32-NEXT:    beqzc $3, $BB16_1
6794; MM32-NEXT:  # %bb.2: # %entry
6795; MM32-NEXT:    sync
6796; MM32-NEXT:    jrc $ra
6797;
6798; O1-LABEL: CheckSync:
6799; O1:       # %bb.0: # %entry
6800; O1-NEXT:    lui $2, %hi(_gp_disp)
6801; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
6802; O1-NEXT:    addu $1, $2, $25
6803; O1-NEXT:    sync
6804; O1-NEXT:    lw $1, %got(countsint)($1)
6805; O1-NEXT:  $BB16_1: # %entry
6806; O1-NEXT:    # =>This Inner Loop Header: Depth=1
6807; O1-NEXT:    ll $2, 0($1)
6808; O1-NEXT:    addu $3, $2, $4
6809; O1-NEXT:    sc $3, 0($1)
6810; O1-NEXT:    beqz $3, $BB16_1
6811; O1-NEXT:    nop
6812; O1-NEXT:  # %bb.2: # %entry
6813; O1-NEXT:    sync
6814; O1-NEXT:    jr $ra
6815; O1-NEXT:    nop
6816;
6817; O2-LABEL: CheckSync:
6818; O2:       # %bb.0: # %entry
6819; O2-NEXT:    lui $2, %hi(_gp_disp)
6820; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6821; O2-NEXT:    addu $1, $2, $25
6822; O2-NEXT:    sync
6823; O2-NEXT:    lw $1, %got(countsint)($1)
6824; O2-NEXT:  $BB16_1: # %entry
6825; O2-NEXT:    # =>This Inner Loop Header: Depth=1
6826; O2-NEXT:    ll $2, 0($1)
6827; O2-NEXT:    addu $3, $2, $4
6828; O2-NEXT:    sc $3, 0($1)
6829; O2-NEXT:    beqz $3, $BB16_1
6830; O2-NEXT:    nop
6831; O2-NEXT:  # %bb.2: # %entry
6832; O2-NEXT:    sync
6833; O2-NEXT:    jr $ra
6834; O2-NEXT:    nop
6835;
6836; O3-LABEL: CheckSync:
6837; O3:       # %bb.0: # %entry
6838; O3-NEXT:    lui $2, %hi(_gp_disp)
6839; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
6840; O3-NEXT:    addu $1, $2, $25
6841; O3-NEXT:    sync
6842; O3-NEXT:    lw $1, %got(countsint)($1)
6843; O3-NEXT:  $BB16_1: # %entry
6844; O3-NEXT:    # =>This Inner Loop Header: Depth=1
6845; O3-NEXT:    ll $2, 0($1)
6846; O3-NEXT:    addu $3, $2, $4
6847; O3-NEXT:    sc $3, 0($1)
6848; O3-NEXT:    beqz $3, $BB16_1
6849; O3-NEXT:    nop
6850; O3-NEXT:  # %bb.2: # %entry
6851; O3-NEXT:    sync
6852; O3-NEXT:    jr $ra
6853; O3-NEXT:    nop
6854;
6855; MIPS32EB-LABEL: CheckSync:
6856; MIPS32EB:       # %bb.0: # %entry
6857; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
6858; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
6859; MIPS32EB-NEXT:    addu $1, $2, $25
6860; MIPS32EB-NEXT:    sync
6861; MIPS32EB-NEXT:    lw $1, %got(countsint)($1)
6862; MIPS32EB-NEXT:  $BB16_1: # %entry
6863; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
6864; MIPS32EB-NEXT:    ll $2, 0($1)
6865; MIPS32EB-NEXT:    addu $3, $2, $4
6866; MIPS32EB-NEXT:    sc $3, 0($1)
6867; MIPS32EB-NEXT:    beqz $3, $BB16_1
6868; MIPS32EB-NEXT:    nop
6869; MIPS32EB-NEXT:  # %bb.2: # %entry
6870; MIPS32EB-NEXT:    sync
6871; MIPS32EB-NEXT:    jr $ra
6872; MIPS32EB-NEXT:    nop
6873entry:
6874  %0 = atomicrmw add i32* @countsint, i32 %v seq_cst
6875  ret i32 %0
6876}
6877
6878; make sure that this assertion in
6879; TwoAddressInstructionPass::TryInstructionTransform does not fail:
6880;
6881; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) &&
6882;
6883; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an
6884; operand of an atomic instruction with register $zero.
6885@a = external global i32
6886
6887define i32 @zeroreg() nounwind {
6888; MIPS32-LABEL: zeroreg:
6889; MIPS32:       # %bb.0: # %entry
6890; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
6891; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
6892; MIPS32-NEXT:    addu $1, $2, $25
6893; MIPS32-NEXT:    sync
6894; MIPS32-NEXT:    addiu $2, $zero, 0
6895; MIPS32-NEXT:    addiu $3, $zero, 1
6896; MIPS32-NEXT:    lw $1, %got(a)($1)
6897; MIPS32-NEXT:  $BB17_1: # %entry
6898; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
6899; MIPS32-NEXT:    ll $4, 0($1)
6900; MIPS32-NEXT:    bne $4, $3, $BB17_3
6901; MIPS32-NEXT:    nop
6902; MIPS32-NEXT:  # %bb.2: # %entry
6903; MIPS32-NEXT:    # in Loop: Header=BB17_1 Depth=1
6904; MIPS32-NEXT:    move $5, $2
6905; MIPS32-NEXT:    sc $5, 0($1)
6906; MIPS32-NEXT:    beqz $5, $BB17_1
6907; MIPS32-NEXT:    nop
6908; MIPS32-NEXT:  $BB17_3: # %entry
6909; MIPS32-NEXT:    xor $1, $4, $3
6910; MIPS32-NEXT:    sltiu $2, $1, 1
6911; MIPS32-NEXT:    sync
6912; MIPS32-NEXT:    jr $ra
6913; MIPS32-NEXT:    nop
6914;
6915; MIPS32O0-LABEL: zeroreg:
6916; MIPS32O0:       # %bb.0: # %entry
6917; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
6918; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
6919; MIPS32O0-NEXT:    addu $1, $2, $25
6920; MIPS32O0-NEXT:    sync
6921; MIPS32O0-NEXT:    lw $1, %got(a)($1)
6922; MIPS32O0-NEXT:    addiu $2, $zero, 0
6923; MIPS32O0-NEXT:    addiu $3, $zero, 1
6924; MIPS32O0-NEXT:    move $4, $3
6925; MIPS32O0-NEXT:  $BB17_1: # %entry
6926; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
6927; MIPS32O0-NEXT:    ll $5, 0($1)
6928; MIPS32O0-NEXT:    bne $5, $4, $BB17_3
6929; MIPS32O0-NEXT:    nop
6930; MIPS32O0-NEXT:  # %bb.2: # %entry
6931; MIPS32O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
6932; MIPS32O0-NEXT:    move $6, $2
6933; MIPS32O0-NEXT:    sc $6, 0($1)
6934; MIPS32O0-NEXT:    beqz $6, $BB17_1
6935; MIPS32O0-NEXT:    nop
6936; MIPS32O0-NEXT:  $BB17_3: # %entry
6937; MIPS32O0-NEXT:    xor $1, $5, $3
6938; MIPS32O0-NEXT:    sltiu $1, $1, 1
6939; MIPS32O0-NEXT:    sync
6940; MIPS32O0-NEXT:    addiu $2, $zero, 1
6941; MIPS32O0-NEXT:    xor $2, $5, $2
6942; MIPS32O0-NEXT:    sltiu $2, $2, 1
6943; MIPS32O0-NEXT:    andi $2, $2, 1
6944; MIPS32O0-NEXT:    jr $ra
6945; MIPS32O0-NEXT:    nop
6946;
6947; MIPS32R2-LABEL: zeroreg:
6948; MIPS32R2:       # %bb.0: # %entry
6949; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
6950; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
6951; MIPS32R2-NEXT:    addu $1, $2, $25
6952; MIPS32R2-NEXT:    sync
6953; MIPS32R2-NEXT:    addiu $2, $zero, 0
6954; MIPS32R2-NEXT:    addiu $3, $zero, 1
6955; MIPS32R2-NEXT:    lw $1, %got(a)($1)
6956; MIPS32R2-NEXT:  $BB17_1: # %entry
6957; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
6958; MIPS32R2-NEXT:    ll $4, 0($1)
6959; MIPS32R2-NEXT:    bne $4, $3, $BB17_3
6960; MIPS32R2-NEXT:    nop
6961; MIPS32R2-NEXT:  # %bb.2: # %entry
6962; MIPS32R2-NEXT:    # in Loop: Header=BB17_1 Depth=1
6963; MIPS32R2-NEXT:    move $5, $2
6964; MIPS32R2-NEXT:    sc $5, 0($1)
6965; MIPS32R2-NEXT:    beqz $5, $BB17_1
6966; MIPS32R2-NEXT:    nop
6967; MIPS32R2-NEXT:  $BB17_3: # %entry
6968; MIPS32R2-NEXT:    xor $1, $4, $3
6969; MIPS32R2-NEXT:    sltiu $2, $1, 1
6970; MIPS32R2-NEXT:    sync
6971; MIPS32R2-NEXT:    jr $ra
6972; MIPS32R2-NEXT:    nop
6973;
6974; MIPS32R6-LABEL: zeroreg:
6975; MIPS32R6:       # %bb.0: # %entry
6976; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
6977; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
6978; MIPS32R6-NEXT:    addu $1, $2, $25
6979; MIPS32R6-NEXT:    sync
6980; MIPS32R6-NEXT:    addiu $2, $zero, 0
6981; MIPS32R6-NEXT:    addiu $3, $zero, 1
6982; MIPS32R6-NEXT:    lw $1, %got(a)($1)
6983; MIPS32R6-NEXT:  $BB17_1: # %entry
6984; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
6985; MIPS32R6-NEXT:    ll $4, 0($1)
6986; MIPS32R6-NEXT:    bnec $4, $3, $BB17_3
6987; MIPS32R6-NEXT:  # %bb.2: # %entry
6988; MIPS32R6-NEXT:    # in Loop: Header=BB17_1 Depth=1
6989; MIPS32R6-NEXT:    move $5, $2
6990; MIPS32R6-NEXT:    sc $5, 0($1)
6991; MIPS32R6-NEXT:    beqzc $5, $BB17_1
6992; MIPS32R6-NEXT:  $BB17_3: # %entry
6993; MIPS32R6-NEXT:    xor $1, $4, $3
6994; MIPS32R6-NEXT:    sltiu $2, $1, 1
6995; MIPS32R6-NEXT:    sync
6996; MIPS32R6-NEXT:    jrc $ra
6997;
6998; MIPS32R6O0-LABEL: zeroreg:
6999; MIPS32R6O0:       # %bb.0: # %entry
7000; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
7001; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7002; MIPS32R6O0-NEXT:    addu $1, $2, $25
7003; MIPS32R6O0-NEXT:    sync
7004; MIPS32R6O0-NEXT:    lw $1, %got(a)($1)
7005; MIPS32R6O0-NEXT:    addiu $2, $zero, 0
7006; MIPS32R6O0-NEXT:    addiu $3, $zero, 1
7007; MIPS32R6O0-NEXT:    move $4, $3
7008; MIPS32R6O0-NEXT:  $BB17_1: # %entry
7009; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7010; MIPS32R6O0-NEXT:    ll $5, 0($1)
7011; MIPS32R6O0-NEXT:    bnec $5, $4, $BB17_3
7012; MIPS32R6O0-NEXT:  # %bb.2: # %entry
7013; MIPS32R6O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
7014; MIPS32R6O0-NEXT:    move $6, $2
7015; MIPS32R6O0-NEXT:    sc $6, 0($1)
7016; MIPS32R6O0-NEXT:    beqzc $6, $BB17_1
7017; MIPS32R6O0-NEXT:  $BB17_3: # %entry
7018; MIPS32R6O0-NEXT:    xor $1, $5, $3
7019; MIPS32R6O0-NEXT:    sltiu $2, $1, 1
7020; MIPS32R6O0-NEXT:    sync
7021; MIPS32R6O0-NEXT:    jrc $ra
7022;
7023; MIPS4-LABEL: zeroreg:
7024; MIPS4:       # %bb.0: # %entry
7025; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7026; MIPS4-NEXT:    daddu $1, $1, $25
7027; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7028; MIPS4-NEXT:    sync
7029; MIPS4-NEXT:    addiu $2, $zero, 0
7030; MIPS4-NEXT:    addiu $3, $zero, 1
7031; MIPS4-NEXT:    ld $1, %got_disp(a)($1)
7032; MIPS4-NEXT:  .LBB17_1: # %entry
7033; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
7034; MIPS4-NEXT:    ll $4, 0($1)
7035; MIPS4-NEXT:    bne $4, $3, .LBB17_3
7036; MIPS4-NEXT:    nop
7037; MIPS4-NEXT:  # %bb.2: # %entry
7038; MIPS4-NEXT:    # in Loop: Header=BB17_1 Depth=1
7039; MIPS4-NEXT:    move $5, $2
7040; MIPS4-NEXT:    sc $5, 0($1)
7041; MIPS4-NEXT:    beqz $5, .LBB17_1
7042; MIPS4-NEXT:    nop
7043; MIPS4-NEXT:  .LBB17_3: # %entry
7044; MIPS4-NEXT:    xor $1, $4, $3
7045; MIPS4-NEXT:    sltiu $2, $1, 1
7046; MIPS4-NEXT:    sync
7047; MIPS4-NEXT:    jr $ra
7048; MIPS4-NEXT:    nop
7049;
7050; MIPS64-LABEL: zeroreg:
7051; MIPS64:       # %bb.0: # %entry
7052; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7053; MIPS64-NEXT:    daddu $1, $1, $25
7054; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7055; MIPS64-NEXT:    sync
7056; MIPS64-NEXT:    addiu $2, $zero, 0
7057; MIPS64-NEXT:    addiu $3, $zero, 1
7058; MIPS64-NEXT:    ld $1, %got_disp(a)($1)
7059; MIPS64-NEXT:  .LBB17_1: # %entry
7060; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
7061; MIPS64-NEXT:    ll $4, 0($1)
7062; MIPS64-NEXT:    bne $4, $3, .LBB17_3
7063; MIPS64-NEXT:    nop
7064; MIPS64-NEXT:  # %bb.2: # %entry
7065; MIPS64-NEXT:    # in Loop: Header=BB17_1 Depth=1
7066; MIPS64-NEXT:    move $5, $2
7067; MIPS64-NEXT:    sc $5, 0($1)
7068; MIPS64-NEXT:    beqz $5, .LBB17_1
7069; MIPS64-NEXT:    nop
7070; MIPS64-NEXT:  .LBB17_3: # %entry
7071; MIPS64-NEXT:    xor $1, $4, $3
7072; MIPS64-NEXT:    sltiu $2, $1, 1
7073; MIPS64-NEXT:    sync
7074; MIPS64-NEXT:    jr $ra
7075; MIPS64-NEXT:    nop
7076;
7077; MIPS64R2-LABEL: zeroreg:
7078; MIPS64R2:       # %bb.0: # %entry
7079; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7080; MIPS64R2-NEXT:    daddu $1, $1, $25
7081; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7082; MIPS64R2-NEXT:    sync
7083; MIPS64R2-NEXT:    addiu $2, $zero, 0
7084; MIPS64R2-NEXT:    addiu $3, $zero, 1
7085; MIPS64R2-NEXT:    ld $1, %got_disp(a)($1)
7086; MIPS64R2-NEXT:  .LBB17_1: # %entry
7087; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
7088; MIPS64R2-NEXT:    ll $4, 0($1)
7089; MIPS64R2-NEXT:    bne $4, $3, .LBB17_3
7090; MIPS64R2-NEXT:    nop
7091; MIPS64R2-NEXT:  # %bb.2: # %entry
7092; MIPS64R2-NEXT:    # in Loop: Header=BB17_1 Depth=1
7093; MIPS64R2-NEXT:    move $5, $2
7094; MIPS64R2-NEXT:    sc $5, 0($1)
7095; MIPS64R2-NEXT:    beqz $5, .LBB17_1
7096; MIPS64R2-NEXT:    nop
7097; MIPS64R2-NEXT:  .LBB17_3: # %entry
7098; MIPS64R2-NEXT:    xor $1, $4, $3
7099; MIPS64R2-NEXT:    sltiu $2, $1, 1
7100; MIPS64R2-NEXT:    sync
7101; MIPS64R2-NEXT:    jr $ra
7102; MIPS64R2-NEXT:    nop
7103;
7104; MIPS64R6-LABEL: zeroreg:
7105; MIPS64R6:       # %bb.0: # %entry
7106; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7107; MIPS64R6-NEXT:    daddu $1, $1, $25
7108; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7109; MIPS64R6-NEXT:    sync
7110; MIPS64R6-NEXT:    addiu $2, $zero, 0
7111; MIPS64R6-NEXT:    addiu $3, $zero, 1
7112; MIPS64R6-NEXT:    ld $1, %got_disp(a)($1)
7113; MIPS64R6-NEXT:  .LBB17_1: # %entry
7114; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
7115; MIPS64R6-NEXT:    ll $4, 0($1)
7116; MIPS64R6-NEXT:    bnec $4, $3, .LBB17_3
7117; MIPS64R6-NEXT:  # %bb.2: # %entry
7118; MIPS64R6-NEXT:    # in Loop: Header=BB17_1 Depth=1
7119; MIPS64R6-NEXT:    move $5, $2
7120; MIPS64R6-NEXT:    sc $5, 0($1)
7121; MIPS64R6-NEXT:    beqzc $5, .LBB17_1
7122; MIPS64R6-NEXT:  .LBB17_3: # %entry
7123; MIPS64R6-NEXT:    xor $1, $4, $3
7124; MIPS64R6-NEXT:    sltiu $2, $1, 1
7125; MIPS64R6-NEXT:    sync
7126; MIPS64R6-NEXT:    jrc $ra
7127;
7128; MIPS64R6O0-LABEL: zeroreg:
7129; MIPS64R6O0:       # %bb.0: # %entry
7130; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(zeroreg)))
7131; MIPS64R6O0-NEXT:    daddu $1, $1, $25
7132; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(zeroreg)))
7133; MIPS64R6O0-NEXT:    sync
7134; MIPS64R6O0-NEXT:    ld $1, %got_disp(a)($1)
7135; MIPS64R6O0-NEXT:    addiu $2, $zero, 0
7136; MIPS64R6O0-NEXT:    addiu $3, $zero, 1
7137; MIPS64R6O0-NEXT:    move $4, $3
7138; MIPS64R6O0-NEXT:  .LBB17_1: # %entry
7139; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7140; MIPS64R6O0-NEXT:    ll $5, 0($1)
7141; MIPS64R6O0-NEXT:    bnec $5, $4, .LBB17_3
7142; MIPS64R6O0-NEXT:  # %bb.2: # %entry
7143; MIPS64R6O0-NEXT:    # in Loop: Header=BB17_1 Depth=1
7144; MIPS64R6O0-NEXT:    move $6, $2
7145; MIPS64R6O0-NEXT:    sc $6, 0($1)
7146; MIPS64R6O0-NEXT:    beqzc $6, .LBB17_1
7147; MIPS64R6O0-NEXT:  .LBB17_3: # %entry
7148; MIPS64R6O0-NEXT:    xor $1, $5, $3
7149; MIPS64R6O0-NEXT:    sltiu $2, $1, 1
7150; MIPS64R6O0-NEXT:    sync
7151; MIPS64R6O0-NEXT:    jrc $ra
7152;
7153; MM32-LABEL: zeroreg:
7154; MM32:       # %bb.0: # %entry
7155; MM32-NEXT:    lui $2, %hi(_gp_disp)
7156; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7157; MM32-NEXT:    addu $2, $2, $25
7158; MM32-NEXT:    sync
7159; MM32-NEXT:    li16 $3, 0
7160; MM32-NEXT:    li16 $4, 1
7161; MM32-NEXT:    lw $1, %got(a)($2)
7162; MM32-NEXT:  $BB17_1: # %entry
7163; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
7164; MM32-NEXT:    ll $2, 0($1)
7165; MM32-NEXT:    bne $2, $4, $BB17_3
7166; MM32-NEXT:    nop
7167; MM32-NEXT:  # %bb.2: # %entry
7168; MM32-NEXT:    # in Loop: Header=BB17_1 Depth=1
7169; MM32-NEXT:    move $5, $3
7170; MM32-NEXT:    sc $5, 0($1)
7171; MM32-NEXT:    beqzc $5, $BB17_1
7172; MM32-NEXT:  $BB17_3: # %entry
7173; MM32-NEXT:    xor $1, $2, $4
7174; MM32-NEXT:    sltiu $2, $1, 1
7175; MM32-NEXT:    sync
7176; MM32-NEXT:    jrc $ra
7177;
7178; O1-LABEL: zeroreg:
7179; O1:       # %bb.0: # %entry
7180; O1-NEXT:    lui $2, %hi(_gp_disp)
7181; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
7182; O1-NEXT:    addu $1, $2, $25
7183; O1-NEXT:    sync
7184; O1-NEXT:    addiu $2, $zero, 0
7185; O1-NEXT:    addiu $3, $zero, 1
7186; O1-NEXT:    lw $1, %got(a)($1)
7187; O1-NEXT:  $BB17_1: # %entry
7188; O1-NEXT:    # =>This Inner Loop Header: Depth=1
7189; O1-NEXT:    ll $4, 0($1)
7190; O1-NEXT:    bne $4, $3, $BB17_3
7191; O1-NEXT:    nop
7192; O1-NEXT:  # %bb.2: # %entry
7193; O1-NEXT:    # in Loop: Header=BB17_1 Depth=1
7194; O1-NEXT:    move $5, $2
7195; O1-NEXT:    sc $5, 0($1)
7196; O1-NEXT:    beqz $5, $BB17_1
7197; O1-NEXT:    nop
7198; O1-NEXT:  $BB17_3: # %entry
7199; O1-NEXT:    xor $1, $4, $3
7200; O1-NEXT:    sltiu $2, $1, 1
7201; O1-NEXT:    sync
7202; O1-NEXT:    jr $ra
7203; O1-NEXT:    nop
7204;
7205; O2-LABEL: zeroreg:
7206; O2:       # %bb.0: # %entry
7207; O2-NEXT:    lui $2, %hi(_gp_disp)
7208; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7209; O2-NEXT:    addu $1, $2, $25
7210; O2-NEXT:    sync
7211; O2-NEXT:    addiu $2, $zero, 0
7212; O2-NEXT:    addiu $3, $zero, 1
7213; O2-NEXT:    lw $1, %got(a)($1)
7214; O2-NEXT:  $BB17_1: # %entry
7215; O2-NEXT:    # =>This Inner Loop Header: Depth=1
7216; O2-NEXT:    ll $4, 0($1)
7217; O2-NEXT:    bne $4, $3, $BB17_3
7218; O2-NEXT:    nop
7219; O2-NEXT:  # %bb.2: # %entry
7220; O2-NEXT:    # in Loop: Header=BB17_1 Depth=1
7221; O2-NEXT:    move $5, $2
7222; O2-NEXT:    sc $5, 0($1)
7223; O2-NEXT:    beqz $5, $BB17_1
7224; O2-NEXT:    nop
7225; O2-NEXT:  $BB17_3: # %entry
7226; O2-NEXT:    xor $1, $4, $3
7227; O2-NEXT:    sltiu $2, $1, 1
7228; O2-NEXT:    sync
7229; O2-NEXT:    jr $ra
7230; O2-NEXT:    nop
7231;
7232; O3-LABEL: zeroreg:
7233; O3:       # %bb.0: # %entry
7234; O3-NEXT:    lui $2, %hi(_gp_disp)
7235; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
7236; O3-NEXT:    addu $1, $2, $25
7237; O3-NEXT:    addiu $2, $zero, 0
7238; O3-NEXT:    addiu $3, $zero, 1
7239; O3-NEXT:    sync
7240; O3-NEXT:    lw $1, %got(a)($1)
7241; O3-NEXT:  $BB17_1: # %entry
7242; O3-NEXT:    # =>This Inner Loop Header: Depth=1
7243; O3-NEXT:    ll $4, 0($1)
7244; O3-NEXT:    bne $4, $3, $BB17_3
7245; O3-NEXT:    nop
7246; O3-NEXT:  # %bb.2: # %entry
7247; O3-NEXT:    # in Loop: Header=BB17_1 Depth=1
7248; O3-NEXT:    move $5, $2
7249; O3-NEXT:    sc $5, 0($1)
7250; O3-NEXT:    beqz $5, $BB17_1
7251; O3-NEXT:    nop
7252; O3-NEXT:  $BB17_3: # %entry
7253; O3-NEXT:    sync
7254; O3-NEXT:    xor $1, $4, $3
7255; O3-NEXT:    jr $ra
7256; O3-NEXT:    sltiu $2, $1, 1
7257;
7258; MIPS32EB-LABEL: zeroreg:
7259; MIPS32EB:       # %bb.0: # %entry
7260; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
7261; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
7262; MIPS32EB-NEXT:    addu $1, $2, $25
7263; MIPS32EB-NEXT:    sync
7264; MIPS32EB-NEXT:    addiu $2, $zero, 0
7265; MIPS32EB-NEXT:    addiu $3, $zero, 1
7266; MIPS32EB-NEXT:    lw $1, %got(a)($1)
7267; MIPS32EB-NEXT:  $BB17_1: # %entry
7268; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
7269; MIPS32EB-NEXT:    ll $4, 0($1)
7270; MIPS32EB-NEXT:    bne $4, $3, $BB17_3
7271; MIPS32EB-NEXT:    nop
7272; MIPS32EB-NEXT:  # %bb.2: # %entry
7273; MIPS32EB-NEXT:    # in Loop: Header=BB17_1 Depth=1
7274; MIPS32EB-NEXT:    move $5, $2
7275; MIPS32EB-NEXT:    sc $5, 0($1)
7276; MIPS32EB-NEXT:    beqz $5, $BB17_1
7277; MIPS32EB-NEXT:    nop
7278; MIPS32EB-NEXT:  $BB17_3: # %entry
7279; MIPS32EB-NEXT:    xor $1, $4, $3
7280; MIPS32EB-NEXT:    sltiu $2, $1, 1
7281; MIPS32EB-NEXT:    sync
7282; MIPS32EB-NEXT:    jr $ra
7283; MIPS32EB-NEXT:    nop
7284entry:
7285  %pair0 = cmpxchg i32* @a, i32 1, i32 0 seq_cst seq_cst
7286  %0 = extractvalue { i32, i1 } %pair0, 0
7287  %1 = icmp eq i32 %0, 1
7288  %conv = zext i1 %1 to i32
7289  ret i32 %conv
7290}
7291
7292; Check that MIPS32R6 has the correct offset range.
7293; FIXME: At the moment, we don't seem to do addr+offset for any atomic load/store.
7294define i32 @AtomicLoadAdd32_OffGt9Bit(i32 signext %incr) nounwind {
7295; MIPS32-LABEL: AtomicLoadAdd32_OffGt9Bit:
7296; MIPS32:       # %bb.0: # %entry
7297; MIPS32-NEXT:    lui $2, %hi(_gp_disp)
7298; MIPS32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7299; MIPS32-NEXT:    addu $1, $2, $25
7300; MIPS32-NEXT:    lw $1, %got(x)($1)
7301; MIPS32-NEXT:    addiu $1, $1, 1024
7302; MIPS32-NEXT:  $BB18_1: # %entry
7303; MIPS32-NEXT:    # =>This Inner Loop Header: Depth=1
7304; MIPS32-NEXT:    ll $2, 0($1)
7305; MIPS32-NEXT:    addu $3, $2, $4
7306; MIPS32-NEXT:    sc $3, 0($1)
7307; MIPS32-NEXT:    beqz $3, $BB18_1
7308; MIPS32-NEXT:    nop
7309; MIPS32-NEXT:  # %bb.2: # %entry
7310; MIPS32-NEXT:    jr $ra
7311; MIPS32-NEXT:    nop
7312;
7313; MIPS32O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7314; MIPS32O0:       # %bb.0: # %entry
7315; MIPS32O0-NEXT:    lui $2, %hi(_gp_disp)
7316; MIPS32O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7317; MIPS32O0-NEXT:    addu $1, $2, $25
7318; MIPS32O0-NEXT:    lw $1, %got(x)($1)
7319; MIPS32O0-NEXT:    addiu $1, $1, 1024
7320; MIPS32O0-NEXT:  $BB18_1: # %entry
7321; MIPS32O0-NEXT:    # =>This Inner Loop Header: Depth=1
7322; MIPS32O0-NEXT:    ll $2, 0($1)
7323; MIPS32O0-NEXT:    addu $3, $2, $4
7324; MIPS32O0-NEXT:    sc $3, 0($1)
7325; MIPS32O0-NEXT:    beqz $3, $BB18_1
7326; MIPS32O0-NEXT:    nop
7327; MIPS32O0-NEXT:  # %bb.2: # %entry
7328; MIPS32O0-NEXT:    jr $ra
7329; MIPS32O0-NEXT:    nop
7330;
7331; MIPS32R2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7332; MIPS32R2:       # %bb.0: # %entry
7333; MIPS32R2-NEXT:    lui $2, %hi(_gp_disp)
7334; MIPS32R2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7335; MIPS32R2-NEXT:    addu $1, $2, $25
7336; MIPS32R2-NEXT:    lw $1, %got(x)($1)
7337; MIPS32R2-NEXT:    addiu $1, $1, 1024
7338; MIPS32R2-NEXT:  $BB18_1: # %entry
7339; MIPS32R2-NEXT:    # =>This Inner Loop Header: Depth=1
7340; MIPS32R2-NEXT:    ll $2, 0($1)
7341; MIPS32R2-NEXT:    addu $3, $2, $4
7342; MIPS32R2-NEXT:    sc $3, 0($1)
7343; MIPS32R2-NEXT:    beqz $3, $BB18_1
7344; MIPS32R2-NEXT:    nop
7345; MIPS32R2-NEXT:  # %bb.2: # %entry
7346; MIPS32R2-NEXT:    jr $ra
7347; MIPS32R2-NEXT:    nop
7348;
7349; MIPS32R6-LABEL: AtomicLoadAdd32_OffGt9Bit:
7350; MIPS32R6:       # %bb.0: # %entry
7351; MIPS32R6-NEXT:    lui $2, %hi(_gp_disp)
7352; MIPS32R6-NEXT:    addiu $2, $2, %lo(_gp_disp)
7353; MIPS32R6-NEXT:    addu $1, $2, $25
7354; MIPS32R6-NEXT:    lw $1, %got(x)($1)
7355; MIPS32R6-NEXT:    addiu $1, $1, 1024
7356; MIPS32R6-NEXT:  $BB18_1: # %entry
7357; MIPS32R6-NEXT:    # =>This Inner Loop Header: Depth=1
7358; MIPS32R6-NEXT:    ll $2, 0($1)
7359; MIPS32R6-NEXT:    addu $3, $2, $4
7360; MIPS32R6-NEXT:    sc $3, 0($1)
7361; MIPS32R6-NEXT:    beqzc $3, $BB18_1
7362; MIPS32R6-NEXT:    nop
7363; MIPS32R6-NEXT:  # %bb.2: # %entry
7364; MIPS32R6-NEXT:    jrc $ra
7365;
7366; MIPS32R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7367; MIPS32R6O0:       # %bb.0: # %entry
7368; MIPS32R6O0-NEXT:    lui $2, %hi(_gp_disp)
7369; MIPS32R6O0-NEXT:    addiu $2, $2, %lo(_gp_disp)
7370; MIPS32R6O0-NEXT:    addu $1, $2, $25
7371; MIPS32R6O0-NEXT:    lw $1, %got(x)($1)
7372; MIPS32R6O0-NEXT:    addiu $1, $1, 1024
7373; MIPS32R6O0-NEXT:  $BB18_1: # %entry
7374; MIPS32R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7375; MIPS32R6O0-NEXT:    ll $2, 0($1)
7376; MIPS32R6O0-NEXT:    addu $3, $2, $4
7377; MIPS32R6O0-NEXT:    sc $3, 0($1)
7378; MIPS32R6O0-NEXT:    beqzc $3, $BB18_1
7379; MIPS32R6O0-NEXT:    nop
7380; MIPS32R6O0-NEXT:  # %bb.2: # %entry
7381; MIPS32R6O0-NEXT:    jrc $ra
7382;
7383; MIPS4-LABEL: AtomicLoadAdd32_OffGt9Bit:
7384; MIPS4:       # %bb.0: # %entry
7385; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7386; MIPS4-NEXT:    daddu $1, $1, $25
7387; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7388; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
7389; MIPS4-NEXT:    daddiu $1, $1, 1024
7390; MIPS4-NEXT:  .LBB18_1: # %entry
7391; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
7392; MIPS4-NEXT:    ll $2, 0($1)
7393; MIPS4-NEXT:    addu $3, $2, $4
7394; MIPS4-NEXT:    sc $3, 0($1)
7395; MIPS4-NEXT:    beqz $3, .LBB18_1
7396; MIPS4-NEXT:    nop
7397; MIPS4-NEXT:  # %bb.2: # %entry
7398; MIPS4-NEXT:    jr $ra
7399; MIPS4-NEXT:    nop
7400;
7401; MIPS64-LABEL: AtomicLoadAdd32_OffGt9Bit:
7402; MIPS64:       # %bb.0: # %entry
7403; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7404; MIPS64-NEXT:    daddu $1, $1, $25
7405; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7406; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
7407; MIPS64-NEXT:    daddiu $1, $1, 1024
7408; MIPS64-NEXT:  .LBB18_1: # %entry
7409; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
7410; MIPS64-NEXT:    ll $2, 0($1)
7411; MIPS64-NEXT:    addu $3, $2, $4
7412; MIPS64-NEXT:    sc $3, 0($1)
7413; MIPS64-NEXT:    beqz $3, .LBB18_1
7414; MIPS64-NEXT:    nop
7415; MIPS64-NEXT:  # %bb.2: # %entry
7416; MIPS64-NEXT:    jr $ra
7417; MIPS64-NEXT:    nop
7418;
7419; MIPS64R2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7420; MIPS64R2:       # %bb.0: # %entry
7421; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7422; MIPS64R2-NEXT:    daddu $1, $1, $25
7423; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7424; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
7425; MIPS64R2-NEXT:    daddiu $1, $1, 1024
7426; MIPS64R2-NEXT:  .LBB18_1: # %entry
7427; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
7428; MIPS64R2-NEXT:    ll $2, 0($1)
7429; MIPS64R2-NEXT:    addu $3, $2, $4
7430; MIPS64R2-NEXT:    sc $3, 0($1)
7431; MIPS64R2-NEXT:    beqz $3, .LBB18_1
7432; MIPS64R2-NEXT:    nop
7433; MIPS64R2-NEXT:  # %bb.2: # %entry
7434; MIPS64R2-NEXT:    jr $ra
7435; MIPS64R2-NEXT:    nop
7436;
7437; MIPS64R6-LABEL: AtomicLoadAdd32_OffGt9Bit:
7438; MIPS64R6:       # %bb.0: # %entry
7439; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7440; MIPS64R6-NEXT:    daddu $1, $1, $25
7441; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7442; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
7443; MIPS64R6-NEXT:    daddiu $1, $1, 1024
7444; MIPS64R6-NEXT:  .LBB18_1: # %entry
7445; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
7446; MIPS64R6-NEXT:    ll $2, 0($1)
7447; MIPS64R6-NEXT:    addu $3, $2, $4
7448; MIPS64R6-NEXT:    sc $3, 0($1)
7449; MIPS64R6-NEXT:    beqzc $3, .LBB18_1
7450; MIPS64R6-NEXT:    nop
7451; MIPS64R6-NEXT:  # %bb.2: # %entry
7452; MIPS64R6-NEXT:    jrc $ra
7453;
7454; MIPS64R6O0-LABEL: AtomicLoadAdd32_OffGt9Bit:
7455; MIPS64R6O0:       # %bb.0: # %entry
7456; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7457; MIPS64R6O0-NEXT:    daddu $1, $1, $25
7458; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd32_OffGt9Bit)))
7459; MIPS64R6O0-NEXT:    # kill: def $a0 killed $a0 killed $a0_64
7460; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
7461; MIPS64R6O0-NEXT:    daddiu $1, $1, 1024
7462; MIPS64R6O0-NEXT:  .LBB18_1: # %entry
7463; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
7464; MIPS64R6O0-NEXT:    ll $2, 0($1)
7465; MIPS64R6O0-NEXT:    addu $3, $2, $4
7466; MIPS64R6O0-NEXT:    sc $3, 0($1)
7467; MIPS64R6O0-NEXT:    beqzc $3, .LBB18_1
7468; MIPS64R6O0-NEXT:    nop
7469; MIPS64R6O0-NEXT:  # %bb.2: # %entry
7470; MIPS64R6O0-NEXT:    jrc $ra
7471;
7472; MM32-LABEL: AtomicLoadAdd32_OffGt9Bit:
7473; MM32:       # %bb.0: # %entry
7474; MM32-NEXT:    lui $2, %hi(_gp_disp)
7475; MM32-NEXT:    addiu $2, $2, %lo(_gp_disp)
7476; MM32-NEXT:    addu $2, $2, $25
7477; MM32-NEXT:    lw $1, %got(x)($2)
7478; MM32-NEXT:    addiu $1, $1, 1024
7479; MM32-NEXT:  $BB18_1: # %entry
7480; MM32-NEXT:    # =>This Inner Loop Header: Depth=1
7481; MM32-NEXT:    ll $2, 0($1)
7482; MM32-NEXT:    addu16 $3, $2, $4
7483; MM32-NEXT:    sc $3, 0($1)
7484; MM32-NEXT:    beqzc $3, $BB18_1
7485; MM32-NEXT:  # %bb.2: # %entry
7486; MM32-NEXT:    jrc $ra
7487;
7488; O1-LABEL: AtomicLoadAdd32_OffGt9Bit:
7489; O1:       # %bb.0: # %entry
7490; O1-NEXT:    lui $2, %hi(_gp_disp)
7491; O1-NEXT:    addiu $2, $2, %lo(_gp_disp)
7492; O1-NEXT:    addu $1, $2, $25
7493; O1-NEXT:    lw $1, %got(x)($1)
7494; O1-NEXT:    addiu $1, $1, 1024
7495; O1-NEXT:  $BB18_1: # %entry
7496; O1-NEXT:    # =>This Inner Loop Header: Depth=1
7497; O1-NEXT:    ll $2, 0($1)
7498; O1-NEXT:    addu $3, $2, $4
7499; O1-NEXT:    sc $3, 0($1)
7500; O1-NEXT:    beqz $3, $BB18_1
7501; O1-NEXT:    nop
7502; O1-NEXT:  # %bb.2: # %entry
7503; O1-NEXT:    jr $ra
7504; O1-NEXT:    nop
7505;
7506; O2-LABEL: AtomicLoadAdd32_OffGt9Bit:
7507; O2:       # %bb.0: # %entry
7508; O2-NEXT:    lui $2, %hi(_gp_disp)
7509; O2-NEXT:    addiu $2, $2, %lo(_gp_disp)
7510; O2-NEXT:    addu $1, $2, $25
7511; O2-NEXT:    lw $1, %got(x)($1)
7512; O2-NEXT:    addiu $1, $1, 1024
7513; O2-NEXT:  $BB18_1: # %entry
7514; O2-NEXT:    # =>This Inner Loop Header: Depth=1
7515; O2-NEXT:    ll $2, 0($1)
7516; O2-NEXT:    addu $3, $2, $4
7517; O2-NEXT:    sc $3, 0($1)
7518; O2-NEXT:    beqz $3, $BB18_1
7519; O2-NEXT:    nop
7520; O2-NEXT:  # %bb.2: # %entry
7521; O2-NEXT:    jr $ra
7522; O2-NEXT:    nop
7523;
7524; O3-LABEL: AtomicLoadAdd32_OffGt9Bit:
7525; O3:       # %bb.0: # %entry
7526; O3-NEXT:    lui $2, %hi(_gp_disp)
7527; O3-NEXT:    addiu $2, $2, %lo(_gp_disp)
7528; O3-NEXT:    addu $1, $2, $25
7529; O3-NEXT:    lw $1, %got(x)($1)
7530; O3-NEXT:    addiu $1, $1, 1024
7531; O3-NEXT:  $BB18_1: # %entry
7532; O3-NEXT:    # =>This Inner Loop Header: Depth=1
7533; O3-NEXT:    ll $2, 0($1)
7534; O3-NEXT:    addu $3, $2, $4
7535; O3-NEXT:    sc $3, 0($1)
7536; O3-NEXT:    beqz $3, $BB18_1
7537; O3-NEXT:    nop
7538; O3-NEXT:  # %bb.2: # %entry
7539; O3-NEXT:    jr $ra
7540; O3-NEXT:    nop
7541;
7542; MIPS32EB-LABEL: AtomicLoadAdd32_OffGt9Bit:
7543; MIPS32EB:       # %bb.0: # %entry
7544; MIPS32EB-NEXT:    lui $2, %hi(_gp_disp)
7545; MIPS32EB-NEXT:    addiu $2, $2, %lo(_gp_disp)
7546; MIPS32EB-NEXT:    addu $1, $2, $25
7547; MIPS32EB-NEXT:    lw $1, %got(x)($1)
7548; MIPS32EB-NEXT:    addiu $1, $1, 1024
7549; MIPS32EB-NEXT:  $BB18_1: # %entry
7550; MIPS32EB-NEXT:    # =>This Inner Loop Header: Depth=1
7551; MIPS32EB-NEXT:    ll $2, 0($1)
7552; MIPS32EB-NEXT:    addu $3, $2, $4
7553; MIPS32EB-NEXT:    sc $3, 0($1)
7554; MIPS32EB-NEXT:    beqz $3, $BB18_1
7555; MIPS32EB-NEXT:    nop
7556; MIPS32EB-NEXT:  # %bb.2: # %entry
7557; MIPS32EB-NEXT:    jr $ra
7558; MIPS32EB-NEXT:    nop
7559entry:
7560  %0 = atomicrmw add i32* getelementptr(i32, i32* @x, i32 256), i32 %incr monotonic
7561  ret i32 %0
7562
7563}
7564