1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips4 -relocation-model=pic -verify-machineinstrs < %s | \
3; RUN:   FileCheck %s -check-prefix=MIPS4
4; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | \
5; RUN:   FileCheck %s -check-prefix=MIPS64
6; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r2 -relocation-model=pic -verify-machineinstrs < %s | \
7; RUN:   FileCheck %s -check-prefix=MIPS64R2
8; RUN: llc -mtriple=mips64el-unknown-linux-gnu --disable-machine-licm -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs < %s | \
9; RUN:   FileCheck %s -check-prefix=MIPS64R6
10; RUN: llc -mtriple=mips64-unknown-linux-gnu -O0 -mcpu=mips64r6 -relocation-model=pic -verify-machineinstrs -verify-machineinstrs < %s | \
11; RUN:   FileCheck %s -check-prefix=MIPS64R6O0
12
13; We want to verify the produced code is well formed all optimization levels, the rest of the test which ensure correctness.
14; RUN: llc -mtriple=mips64el-unknown-linux-gnu -O1 --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O1
15; RUN: llc -mtriple=mips64el-unknown-linux-gnu -O2 --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O2
16; RUN: llc -mtriple=mips64el-unknown-linux-gnu -O3 --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | FileCheck %s --check-prefix=O3
17
18; Keep one big-endian check so that we don't reduce testing, but don't add more
19; since endianness doesn't affect the body of the atomic operations.
20; RUN: llc -mtriple=mips64-unknown-linux-gnu --disable-machine-licm -mcpu=mips64 -relocation-model=pic -verify-machineinstrs < %s | \
21; RUN:   FileCheck %s -check-prefix=MIPS64EB
22
23@x = common global i64 0, align 4
24
25define i64 @AtomicLoadAdd(i64 signext %incr) nounwind {
26; MIPS4-LABEL: AtomicLoadAdd:
27; MIPS4:       # %bb.0: # %entry
28; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd)))
29; MIPS4-NEXT:    daddu $1, $1, $25
30; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd)))
31; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
32; MIPS4-NEXT:  .LBB0_1: # %entry
33; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
34; MIPS4-NEXT:    lld $2, 0($1)
35; MIPS4-NEXT:    daddu $3, $2, $4
36; MIPS4-NEXT:    scd $3, 0($1)
37; MIPS4-NEXT:    beqz $3, .LBB0_1
38; MIPS4-NEXT:    nop
39; MIPS4-NEXT:  # %bb.2: # %entry
40; MIPS4-NEXT:    jr $ra
41; MIPS4-NEXT:    nop
42;
43; MIPS64-LABEL: AtomicLoadAdd:
44; MIPS64:       # %bb.0: # %entry
45; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd)))
46; MIPS64-NEXT:    daddu $1, $1, $25
47; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd)))
48; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
49; MIPS64-NEXT:  .LBB0_1: # %entry
50; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
51; MIPS64-NEXT:    lld $2, 0($1)
52; MIPS64-NEXT:    daddu $3, $2, $4
53; MIPS64-NEXT:    scd $3, 0($1)
54; MIPS64-NEXT:    beqz $3, .LBB0_1
55; MIPS64-NEXT:    nop
56; MIPS64-NEXT:  # %bb.2: # %entry
57; MIPS64-NEXT:    jr $ra
58; MIPS64-NEXT:    nop
59;
60; MIPS64R2-LABEL: AtomicLoadAdd:
61; MIPS64R2:       # %bb.0: # %entry
62; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd)))
63; MIPS64R2-NEXT:    daddu $1, $1, $25
64; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd)))
65; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
66; MIPS64R2-NEXT:  .LBB0_1: # %entry
67; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
68; MIPS64R2-NEXT:    lld $2, 0($1)
69; MIPS64R2-NEXT:    daddu $3, $2, $4
70; MIPS64R2-NEXT:    scd $3, 0($1)
71; MIPS64R2-NEXT:    beqz $3, .LBB0_1
72; MIPS64R2-NEXT:    nop
73; MIPS64R2-NEXT:  # %bb.2: # %entry
74; MIPS64R2-NEXT:    jr $ra
75; MIPS64R2-NEXT:    nop
76;
77; MIPS64R6-LABEL: AtomicLoadAdd:
78; MIPS64R6:       # %bb.0: # %entry
79; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd)))
80; MIPS64R6-NEXT:    daddu $1, $1, $25
81; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd)))
82; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
83; MIPS64R6-NEXT:  .LBB0_1: # %entry
84; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
85; MIPS64R6-NEXT:    lld $2, 0($1)
86; MIPS64R6-NEXT:    daddu $3, $2, $4
87; MIPS64R6-NEXT:    scd $3, 0($1)
88; MIPS64R6-NEXT:    beqzc $3, .LBB0_1
89; MIPS64R6-NEXT:    nop
90; MIPS64R6-NEXT:  # %bb.2: # %entry
91; MIPS64R6-NEXT:    jrc $ra
92;
93; MIPS64R6O0-LABEL: AtomicLoadAdd:
94; MIPS64R6O0:       # %bb.0: # %entry
95; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
96; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd)))
97; MIPS64R6O0-NEXT:    daddu $1, $1, $25
98; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd)))
99; MIPS64R6O0-NEXT:    move $2, $4
100; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
101; MIPS64R6O0-NEXT:  .LBB0_1: # %entry
102; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
103; MIPS64R6O0-NEXT:    lld $3, 0($1)
104; MIPS64R6O0-NEXT:    daddu $5, $3, $4
105; MIPS64R6O0-NEXT:    scd $5, 0($1)
106; MIPS64R6O0-NEXT:    beqzc $5, .LBB0_1
107; MIPS64R6O0-NEXT:  # %bb.2: # %entry
108; MIPS64R6O0-NEXT:    sd $2, 8($sp) # 8-byte Folded Spill
109; MIPS64R6O0-NEXT:    move $2, $3
110; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
111; MIPS64R6O0-NEXT:    jrc $ra
112;
113; O1-LABEL: AtomicLoadAdd:
114; O1:       # %bb.0: # %entry
115; O1-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd)))
116; O1-NEXT:    daddu $1, $1, $25
117; O1-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd)))
118; O1-NEXT:    ld $1, %got_disp(x)($1)
119; O1-NEXT:  .LBB0_1: # %entry
120; O1-NEXT:    # =>This Inner Loop Header: Depth=1
121; O1-NEXT:    lld $2, 0($1)
122; O1-NEXT:    daddu $3, $2, $4
123; O1-NEXT:    scd $3, 0($1)
124; O1-NEXT:    beqz $3, .LBB0_1
125; O1-NEXT:    nop
126; O1-NEXT:  # %bb.2: # %entry
127; O1-NEXT:    jr $ra
128; O1-NEXT:    nop
129;
130; O2-LABEL: AtomicLoadAdd:
131; O2:       # %bb.0: # %entry
132; O2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd)))
133; O2-NEXT:    daddu $1, $1, $25
134; O2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd)))
135; O2-NEXT:    ld $1, %got_disp(x)($1)
136; O2-NEXT:  .LBB0_1: # %entry
137; O2-NEXT:    # =>This Inner Loop Header: Depth=1
138; O2-NEXT:    lld $2, 0($1)
139; O2-NEXT:    daddu $3, $2, $4
140; O2-NEXT:    scd $3, 0($1)
141; O2-NEXT:    beqz $3, .LBB0_1
142; O2-NEXT:    nop
143; O2-NEXT:  # %bb.2: # %entry
144; O2-NEXT:    jr $ra
145; O2-NEXT:    nop
146;
147; O3-LABEL: AtomicLoadAdd:
148; O3:       # %bb.0: # %entry
149; O3-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd)))
150; O3-NEXT:    daddu $1, $1, $25
151; O3-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd)))
152; O3-NEXT:    ld $1, %got_disp(x)($1)
153; O3-NEXT:  .LBB0_1: # %entry
154; O3-NEXT:    # =>This Inner Loop Header: Depth=1
155; O3-NEXT:    lld $2, 0($1)
156; O3-NEXT:    daddu $3, $2, $4
157; O3-NEXT:    scd $3, 0($1)
158; O3-NEXT:    beqz $3, .LBB0_1
159; O3-NEXT:    nop
160; O3-NEXT:  # %bb.2: # %entry
161; O3-NEXT:    jr $ra
162; O3-NEXT:    nop
163;
164; MIPS64EB-LABEL: AtomicLoadAdd:
165; MIPS64EB:       # %bb.0: # %entry
166; MIPS64EB-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAdd)))
167; MIPS64EB-NEXT:    daddu $1, $1, $25
168; MIPS64EB-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAdd)))
169; MIPS64EB-NEXT:    ld $1, %got_disp(x)($1)
170; MIPS64EB-NEXT:  .LBB0_1: # %entry
171; MIPS64EB-NEXT:    # =>This Inner Loop Header: Depth=1
172; MIPS64EB-NEXT:    lld $2, 0($1)
173; MIPS64EB-NEXT:    daddu $3, $2, $4
174; MIPS64EB-NEXT:    scd $3, 0($1)
175; MIPS64EB-NEXT:    beqz $3, .LBB0_1
176; MIPS64EB-NEXT:    nop
177; MIPS64EB-NEXT:  # %bb.2: # %entry
178; MIPS64EB-NEXT:    jr $ra
179; MIPS64EB-NEXT:    nop
180entry:
181  %0 = atomicrmw add i64* @x, i64 %incr monotonic
182  ret i64 %0
183
184}
185
186define i64 @AtomicLoadSub(i64 signext %incr) nounwind {
187; MIPS4-LABEL: AtomicLoadSub:
188; MIPS4:       # %bb.0: # %entry
189; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub)))
190; MIPS4-NEXT:    daddu $1, $1, $25
191; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub)))
192; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
193; MIPS4-NEXT:  .LBB1_1: # %entry
194; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
195; MIPS4-NEXT:    lld $2, 0($1)
196; MIPS4-NEXT:    dsubu $3, $2, $4
197; MIPS4-NEXT:    scd $3, 0($1)
198; MIPS4-NEXT:    beqz $3, .LBB1_1
199; MIPS4-NEXT:    nop
200; MIPS4-NEXT:  # %bb.2: # %entry
201; MIPS4-NEXT:    jr $ra
202; MIPS4-NEXT:    nop
203;
204; MIPS64-LABEL: AtomicLoadSub:
205; MIPS64:       # %bb.0: # %entry
206; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub)))
207; MIPS64-NEXT:    daddu $1, $1, $25
208; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub)))
209; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
210; MIPS64-NEXT:  .LBB1_1: # %entry
211; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
212; MIPS64-NEXT:    lld $2, 0($1)
213; MIPS64-NEXT:    dsubu $3, $2, $4
214; MIPS64-NEXT:    scd $3, 0($1)
215; MIPS64-NEXT:    beqz $3, .LBB1_1
216; MIPS64-NEXT:    nop
217; MIPS64-NEXT:  # %bb.2: # %entry
218; MIPS64-NEXT:    jr $ra
219; MIPS64-NEXT:    nop
220;
221; MIPS64R2-LABEL: AtomicLoadSub:
222; MIPS64R2:       # %bb.0: # %entry
223; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub)))
224; MIPS64R2-NEXT:    daddu $1, $1, $25
225; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub)))
226; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
227; MIPS64R2-NEXT:  .LBB1_1: # %entry
228; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
229; MIPS64R2-NEXT:    lld $2, 0($1)
230; MIPS64R2-NEXT:    dsubu $3, $2, $4
231; MIPS64R2-NEXT:    scd $3, 0($1)
232; MIPS64R2-NEXT:    beqz $3, .LBB1_1
233; MIPS64R2-NEXT:    nop
234; MIPS64R2-NEXT:  # %bb.2: # %entry
235; MIPS64R2-NEXT:    jr $ra
236; MIPS64R2-NEXT:    nop
237;
238; MIPS64R6-LABEL: AtomicLoadSub:
239; MIPS64R6:       # %bb.0: # %entry
240; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub)))
241; MIPS64R6-NEXT:    daddu $1, $1, $25
242; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub)))
243; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
244; MIPS64R6-NEXT:  .LBB1_1: # %entry
245; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
246; MIPS64R6-NEXT:    lld $2, 0($1)
247; MIPS64R6-NEXT:    dsubu $3, $2, $4
248; MIPS64R6-NEXT:    scd $3, 0($1)
249; MIPS64R6-NEXT:    beqzc $3, .LBB1_1
250; MIPS64R6-NEXT:    nop
251; MIPS64R6-NEXT:  # %bb.2: # %entry
252; MIPS64R6-NEXT:    jrc $ra
253;
254; MIPS64R6O0-LABEL: AtomicLoadSub:
255; MIPS64R6O0:       # %bb.0: # %entry
256; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
257; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub)))
258; MIPS64R6O0-NEXT:    daddu $1, $1, $25
259; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub)))
260; MIPS64R6O0-NEXT:    move $2, $4
261; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
262; MIPS64R6O0-NEXT:  .LBB1_1: # %entry
263; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
264; MIPS64R6O0-NEXT:    lld $3, 0($1)
265; MIPS64R6O0-NEXT:    dsubu $5, $3, $4
266; MIPS64R6O0-NEXT:    scd $5, 0($1)
267; MIPS64R6O0-NEXT:    beqzc $5, .LBB1_1
268; MIPS64R6O0-NEXT:  # %bb.2: # %entry
269; MIPS64R6O0-NEXT:    sd $2, 8($sp) # 8-byte Folded Spill
270; MIPS64R6O0-NEXT:    move $2, $3
271; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
272; MIPS64R6O0-NEXT:    jrc $ra
273;
274; O1-LABEL: AtomicLoadSub:
275; O1:       # %bb.0: # %entry
276; O1-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub)))
277; O1-NEXT:    daddu $1, $1, $25
278; O1-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub)))
279; O1-NEXT:    ld $1, %got_disp(x)($1)
280; O1-NEXT:  .LBB1_1: # %entry
281; O1-NEXT:    # =>This Inner Loop Header: Depth=1
282; O1-NEXT:    lld $2, 0($1)
283; O1-NEXT:    dsubu $3, $2, $4
284; O1-NEXT:    scd $3, 0($1)
285; O1-NEXT:    beqz $3, .LBB1_1
286; O1-NEXT:    nop
287; O1-NEXT:  # %bb.2: # %entry
288; O1-NEXT:    jr $ra
289; O1-NEXT:    nop
290;
291; O2-LABEL: AtomicLoadSub:
292; O2:       # %bb.0: # %entry
293; O2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub)))
294; O2-NEXT:    daddu $1, $1, $25
295; O2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub)))
296; O2-NEXT:    ld $1, %got_disp(x)($1)
297; O2-NEXT:  .LBB1_1: # %entry
298; O2-NEXT:    # =>This Inner Loop Header: Depth=1
299; O2-NEXT:    lld $2, 0($1)
300; O2-NEXT:    dsubu $3, $2, $4
301; O2-NEXT:    scd $3, 0($1)
302; O2-NEXT:    beqz $3, .LBB1_1
303; O2-NEXT:    nop
304; O2-NEXT:  # %bb.2: # %entry
305; O2-NEXT:    jr $ra
306; O2-NEXT:    nop
307;
308; O3-LABEL: AtomicLoadSub:
309; O3:       # %bb.0: # %entry
310; O3-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub)))
311; O3-NEXT:    daddu $1, $1, $25
312; O3-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub)))
313; O3-NEXT:    ld $1, %got_disp(x)($1)
314; O3-NEXT:  .LBB1_1: # %entry
315; O3-NEXT:    # =>This Inner Loop Header: Depth=1
316; O3-NEXT:    lld $2, 0($1)
317; O3-NEXT:    dsubu $3, $2, $4
318; O3-NEXT:    scd $3, 0($1)
319; O3-NEXT:    beqz $3, .LBB1_1
320; O3-NEXT:    nop
321; O3-NEXT:  # %bb.2: # %entry
322; O3-NEXT:    jr $ra
323; O3-NEXT:    nop
324;
325; MIPS64EB-LABEL: AtomicLoadSub:
326; MIPS64EB:       # %bb.0: # %entry
327; MIPS64EB-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadSub)))
328; MIPS64EB-NEXT:    daddu $1, $1, $25
329; MIPS64EB-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadSub)))
330; MIPS64EB-NEXT:    ld $1, %got_disp(x)($1)
331; MIPS64EB-NEXT:  .LBB1_1: # %entry
332; MIPS64EB-NEXT:    # =>This Inner Loop Header: Depth=1
333; MIPS64EB-NEXT:    lld $2, 0($1)
334; MIPS64EB-NEXT:    dsubu $3, $2, $4
335; MIPS64EB-NEXT:    scd $3, 0($1)
336; MIPS64EB-NEXT:    beqz $3, .LBB1_1
337; MIPS64EB-NEXT:    nop
338; MIPS64EB-NEXT:  # %bb.2: # %entry
339; MIPS64EB-NEXT:    jr $ra
340; MIPS64EB-NEXT:    nop
341entry:
342  %0 = atomicrmw sub i64* @x, i64 %incr monotonic
343  ret i64 %0
344
345}
346
347define i64 @AtomicLoadAnd(i64 signext %incr) nounwind {
348; MIPS4-LABEL: AtomicLoadAnd:
349; MIPS4:       # %bb.0: # %entry
350; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd)))
351; MIPS4-NEXT:    daddu $1, $1, $25
352; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd)))
353; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
354; MIPS4-NEXT:  .LBB2_1: # %entry
355; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
356; MIPS4-NEXT:    lld $2, 0($1)
357; MIPS4-NEXT:    and $3, $2, $4
358; MIPS4-NEXT:    scd $3, 0($1)
359; MIPS4-NEXT:    beqz $3, .LBB2_1
360; MIPS4-NEXT:    nop
361; MIPS4-NEXT:  # %bb.2: # %entry
362; MIPS4-NEXT:    jr $ra
363; MIPS4-NEXT:    nop
364;
365; MIPS64-LABEL: AtomicLoadAnd:
366; MIPS64:       # %bb.0: # %entry
367; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd)))
368; MIPS64-NEXT:    daddu $1, $1, $25
369; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd)))
370; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
371; MIPS64-NEXT:  .LBB2_1: # %entry
372; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
373; MIPS64-NEXT:    lld $2, 0($1)
374; MIPS64-NEXT:    and $3, $2, $4
375; MIPS64-NEXT:    scd $3, 0($1)
376; MIPS64-NEXT:    beqz $3, .LBB2_1
377; MIPS64-NEXT:    nop
378; MIPS64-NEXT:  # %bb.2: # %entry
379; MIPS64-NEXT:    jr $ra
380; MIPS64-NEXT:    nop
381;
382; MIPS64R2-LABEL: AtomicLoadAnd:
383; MIPS64R2:       # %bb.0: # %entry
384; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd)))
385; MIPS64R2-NEXT:    daddu $1, $1, $25
386; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd)))
387; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
388; MIPS64R2-NEXT:  .LBB2_1: # %entry
389; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
390; MIPS64R2-NEXT:    lld $2, 0($1)
391; MIPS64R2-NEXT:    and $3, $2, $4
392; MIPS64R2-NEXT:    scd $3, 0($1)
393; MIPS64R2-NEXT:    beqz $3, .LBB2_1
394; MIPS64R2-NEXT:    nop
395; MIPS64R2-NEXT:  # %bb.2: # %entry
396; MIPS64R2-NEXT:    jr $ra
397; MIPS64R2-NEXT:    nop
398;
399; MIPS64R6-LABEL: AtomicLoadAnd:
400; MIPS64R6:       # %bb.0: # %entry
401; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd)))
402; MIPS64R6-NEXT:    daddu $1, $1, $25
403; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd)))
404; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
405; MIPS64R6-NEXT:  .LBB2_1: # %entry
406; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
407; MIPS64R6-NEXT:    lld $2, 0($1)
408; MIPS64R6-NEXT:    and $3, $2, $4
409; MIPS64R6-NEXT:    scd $3, 0($1)
410; MIPS64R6-NEXT:    beqzc $3, .LBB2_1
411; MIPS64R6-NEXT:    nop
412; MIPS64R6-NEXT:  # %bb.2: # %entry
413; MIPS64R6-NEXT:    jrc $ra
414;
415; MIPS64R6O0-LABEL: AtomicLoadAnd:
416; MIPS64R6O0:       # %bb.0: # %entry
417; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
418; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd)))
419; MIPS64R6O0-NEXT:    daddu $1, $1, $25
420; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd)))
421; MIPS64R6O0-NEXT:    move $2, $4
422; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
423; MIPS64R6O0-NEXT:  .LBB2_1: # %entry
424; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
425; MIPS64R6O0-NEXT:    lld $3, 0($1)
426; MIPS64R6O0-NEXT:    and $5, $3, $4
427; MIPS64R6O0-NEXT:    scd $5, 0($1)
428; MIPS64R6O0-NEXT:    beqzc $5, .LBB2_1
429; MIPS64R6O0-NEXT:  # %bb.2: # %entry
430; MIPS64R6O0-NEXT:    sd $2, 8($sp) # 8-byte Folded Spill
431; MIPS64R6O0-NEXT:    move $2, $3
432; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
433; MIPS64R6O0-NEXT:    jrc $ra
434;
435; O1-LABEL: AtomicLoadAnd:
436; O1:       # %bb.0: # %entry
437; O1-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd)))
438; O1-NEXT:    daddu $1, $1, $25
439; O1-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd)))
440; O1-NEXT:    ld $1, %got_disp(x)($1)
441; O1-NEXT:  .LBB2_1: # %entry
442; O1-NEXT:    # =>This Inner Loop Header: Depth=1
443; O1-NEXT:    lld $2, 0($1)
444; O1-NEXT:    and $3, $2, $4
445; O1-NEXT:    scd $3, 0($1)
446; O1-NEXT:    beqz $3, .LBB2_1
447; O1-NEXT:    nop
448; O1-NEXT:  # %bb.2: # %entry
449; O1-NEXT:    jr $ra
450; O1-NEXT:    nop
451;
452; O2-LABEL: AtomicLoadAnd:
453; O2:       # %bb.0: # %entry
454; O2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd)))
455; O2-NEXT:    daddu $1, $1, $25
456; O2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd)))
457; O2-NEXT:    ld $1, %got_disp(x)($1)
458; O2-NEXT:  .LBB2_1: # %entry
459; O2-NEXT:    # =>This Inner Loop Header: Depth=1
460; O2-NEXT:    lld $2, 0($1)
461; O2-NEXT:    and $3, $2, $4
462; O2-NEXT:    scd $3, 0($1)
463; O2-NEXT:    beqz $3, .LBB2_1
464; O2-NEXT:    nop
465; O2-NEXT:  # %bb.2: # %entry
466; O2-NEXT:    jr $ra
467; O2-NEXT:    nop
468;
469; O3-LABEL: AtomicLoadAnd:
470; O3:       # %bb.0: # %entry
471; O3-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd)))
472; O3-NEXT:    daddu $1, $1, $25
473; O3-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd)))
474; O3-NEXT:    ld $1, %got_disp(x)($1)
475; O3-NEXT:  .LBB2_1: # %entry
476; O3-NEXT:    # =>This Inner Loop Header: Depth=1
477; O3-NEXT:    lld $2, 0($1)
478; O3-NEXT:    and $3, $2, $4
479; O3-NEXT:    scd $3, 0($1)
480; O3-NEXT:    beqz $3, .LBB2_1
481; O3-NEXT:    nop
482; O3-NEXT:  # %bb.2: # %entry
483; O3-NEXT:    jr $ra
484; O3-NEXT:    nop
485;
486; MIPS64EB-LABEL: AtomicLoadAnd:
487; MIPS64EB:       # %bb.0: # %entry
488; MIPS64EB-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadAnd)))
489; MIPS64EB-NEXT:    daddu $1, $1, $25
490; MIPS64EB-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadAnd)))
491; MIPS64EB-NEXT:    ld $1, %got_disp(x)($1)
492; MIPS64EB-NEXT:  .LBB2_1: # %entry
493; MIPS64EB-NEXT:    # =>This Inner Loop Header: Depth=1
494; MIPS64EB-NEXT:    lld $2, 0($1)
495; MIPS64EB-NEXT:    and $3, $2, $4
496; MIPS64EB-NEXT:    scd $3, 0($1)
497; MIPS64EB-NEXT:    beqz $3, .LBB2_1
498; MIPS64EB-NEXT:    nop
499; MIPS64EB-NEXT:  # %bb.2: # %entry
500; MIPS64EB-NEXT:    jr $ra
501; MIPS64EB-NEXT:    nop
502entry:
503  %0 = atomicrmw and i64* @x, i64 %incr monotonic
504  ret i64 %0
505
506}
507
508define i64 @AtomicLoadOr(i64 signext %incr) nounwind {
509; MIPS4-LABEL: AtomicLoadOr:
510; MIPS4:       # %bb.0: # %entry
511; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr)))
512; MIPS4-NEXT:    daddu $1, $1, $25
513; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr)))
514; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
515; MIPS4-NEXT:  .LBB3_1: # %entry
516; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
517; MIPS4-NEXT:    lld $2, 0($1)
518; MIPS4-NEXT:    or $3, $2, $4
519; MIPS4-NEXT:    scd $3, 0($1)
520; MIPS4-NEXT:    beqz $3, .LBB3_1
521; MIPS4-NEXT:    nop
522; MIPS4-NEXT:  # %bb.2: # %entry
523; MIPS4-NEXT:    jr $ra
524; MIPS4-NEXT:    nop
525;
526; MIPS64-LABEL: AtomicLoadOr:
527; MIPS64:       # %bb.0: # %entry
528; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr)))
529; MIPS64-NEXT:    daddu $1, $1, $25
530; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr)))
531; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
532; MIPS64-NEXT:  .LBB3_1: # %entry
533; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
534; MIPS64-NEXT:    lld $2, 0($1)
535; MIPS64-NEXT:    or $3, $2, $4
536; MIPS64-NEXT:    scd $3, 0($1)
537; MIPS64-NEXT:    beqz $3, .LBB3_1
538; MIPS64-NEXT:    nop
539; MIPS64-NEXT:  # %bb.2: # %entry
540; MIPS64-NEXT:    jr $ra
541; MIPS64-NEXT:    nop
542;
543; MIPS64R2-LABEL: AtomicLoadOr:
544; MIPS64R2:       # %bb.0: # %entry
545; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr)))
546; MIPS64R2-NEXT:    daddu $1, $1, $25
547; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr)))
548; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
549; MIPS64R2-NEXT:  .LBB3_1: # %entry
550; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
551; MIPS64R2-NEXT:    lld $2, 0($1)
552; MIPS64R2-NEXT:    or $3, $2, $4
553; MIPS64R2-NEXT:    scd $3, 0($1)
554; MIPS64R2-NEXT:    beqz $3, .LBB3_1
555; MIPS64R2-NEXT:    nop
556; MIPS64R2-NEXT:  # %bb.2: # %entry
557; MIPS64R2-NEXT:    jr $ra
558; MIPS64R2-NEXT:    nop
559;
560; MIPS64R6-LABEL: AtomicLoadOr:
561; MIPS64R6:       # %bb.0: # %entry
562; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr)))
563; MIPS64R6-NEXT:    daddu $1, $1, $25
564; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr)))
565; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
566; MIPS64R6-NEXT:  .LBB3_1: # %entry
567; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
568; MIPS64R6-NEXT:    lld $2, 0($1)
569; MIPS64R6-NEXT:    or $3, $2, $4
570; MIPS64R6-NEXT:    scd $3, 0($1)
571; MIPS64R6-NEXT:    beqzc $3, .LBB3_1
572; MIPS64R6-NEXT:    nop
573; MIPS64R6-NEXT:  # %bb.2: # %entry
574; MIPS64R6-NEXT:    jrc $ra
575;
576; MIPS64R6O0-LABEL: AtomicLoadOr:
577; MIPS64R6O0:       # %bb.0: # %entry
578; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
579; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr)))
580; MIPS64R6O0-NEXT:    daddu $1, $1, $25
581; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr)))
582; MIPS64R6O0-NEXT:    move $2, $4
583; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
584; MIPS64R6O0-NEXT:  .LBB3_1: # %entry
585; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
586; MIPS64R6O0-NEXT:    lld $3, 0($1)
587; MIPS64R6O0-NEXT:    or $5, $3, $4
588; MIPS64R6O0-NEXT:    scd $5, 0($1)
589; MIPS64R6O0-NEXT:    beqzc $5, .LBB3_1
590; MIPS64R6O0-NEXT:  # %bb.2: # %entry
591; MIPS64R6O0-NEXT:    sd $2, 8($sp) # 8-byte Folded Spill
592; MIPS64R6O0-NEXT:    move $2, $3
593; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
594; MIPS64R6O0-NEXT:    jrc $ra
595;
596; O1-LABEL: AtomicLoadOr:
597; O1:       # %bb.0: # %entry
598; O1-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr)))
599; O1-NEXT:    daddu $1, $1, $25
600; O1-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr)))
601; O1-NEXT:    ld $1, %got_disp(x)($1)
602; O1-NEXT:  .LBB3_1: # %entry
603; O1-NEXT:    # =>This Inner Loop Header: Depth=1
604; O1-NEXT:    lld $2, 0($1)
605; O1-NEXT:    or $3, $2, $4
606; O1-NEXT:    scd $3, 0($1)
607; O1-NEXT:    beqz $3, .LBB3_1
608; O1-NEXT:    nop
609; O1-NEXT:  # %bb.2: # %entry
610; O1-NEXT:    jr $ra
611; O1-NEXT:    nop
612;
613; O2-LABEL: AtomicLoadOr:
614; O2:       # %bb.0: # %entry
615; O2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr)))
616; O2-NEXT:    daddu $1, $1, $25
617; O2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr)))
618; O2-NEXT:    ld $1, %got_disp(x)($1)
619; O2-NEXT:  .LBB3_1: # %entry
620; O2-NEXT:    # =>This Inner Loop Header: Depth=1
621; O2-NEXT:    lld $2, 0($1)
622; O2-NEXT:    or $3, $2, $4
623; O2-NEXT:    scd $3, 0($1)
624; O2-NEXT:    beqz $3, .LBB3_1
625; O2-NEXT:    nop
626; O2-NEXT:  # %bb.2: # %entry
627; O2-NEXT:    jr $ra
628; O2-NEXT:    nop
629;
630; O3-LABEL: AtomicLoadOr:
631; O3:       # %bb.0: # %entry
632; O3-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr)))
633; O3-NEXT:    daddu $1, $1, $25
634; O3-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr)))
635; O3-NEXT:    ld $1, %got_disp(x)($1)
636; O3-NEXT:  .LBB3_1: # %entry
637; O3-NEXT:    # =>This Inner Loop Header: Depth=1
638; O3-NEXT:    lld $2, 0($1)
639; O3-NEXT:    or $3, $2, $4
640; O3-NEXT:    scd $3, 0($1)
641; O3-NEXT:    beqz $3, .LBB3_1
642; O3-NEXT:    nop
643; O3-NEXT:  # %bb.2: # %entry
644; O3-NEXT:    jr $ra
645; O3-NEXT:    nop
646;
647; MIPS64EB-LABEL: AtomicLoadOr:
648; MIPS64EB:       # %bb.0: # %entry
649; MIPS64EB-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadOr)))
650; MIPS64EB-NEXT:    daddu $1, $1, $25
651; MIPS64EB-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadOr)))
652; MIPS64EB-NEXT:    ld $1, %got_disp(x)($1)
653; MIPS64EB-NEXT:  .LBB3_1: # %entry
654; MIPS64EB-NEXT:    # =>This Inner Loop Header: Depth=1
655; MIPS64EB-NEXT:    lld $2, 0($1)
656; MIPS64EB-NEXT:    or $3, $2, $4
657; MIPS64EB-NEXT:    scd $3, 0($1)
658; MIPS64EB-NEXT:    beqz $3, .LBB3_1
659; MIPS64EB-NEXT:    nop
660; MIPS64EB-NEXT:  # %bb.2: # %entry
661; MIPS64EB-NEXT:    jr $ra
662; MIPS64EB-NEXT:    nop
663entry:
664  %0 = atomicrmw or i64* @x, i64 %incr monotonic
665  ret i64 %0
666
667}
668
669define i64 @AtomicLoadXor(i64 signext %incr) nounwind {
670; MIPS4-LABEL: AtomicLoadXor:
671; MIPS4:       # %bb.0: # %entry
672; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor)))
673; MIPS4-NEXT:    daddu $1, $1, $25
674; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor)))
675; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
676; MIPS4-NEXT:  .LBB4_1: # %entry
677; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
678; MIPS4-NEXT:    lld $2, 0($1)
679; MIPS4-NEXT:    xor $3, $2, $4
680; MIPS4-NEXT:    scd $3, 0($1)
681; MIPS4-NEXT:    beqz $3, .LBB4_1
682; MIPS4-NEXT:    nop
683; MIPS4-NEXT:  # %bb.2: # %entry
684; MIPS4-NEXT:    jr $ra
685; MIPS4-NEXT:    nop
686;
687; MIPS64-LABEL: AtomicLoadXor:
688; MIPS64:       # %bb.0: # %entry
689; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor)))
690; MIPS64-NEXT:    daddu $1, $1, $25
691; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor)))
692; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
693; MIPS64-NEXT:  .LBB4_1: # %entry
694; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
695; MIPS64-NEXT:    lld $2, 0($1)
696; MIPS64-NEXT:    xor $3, $2, $4
697; MIPS64-NEXT:    scd $3, 0($1)
698; MIPS64-NEXT:    beqz $3, .LBB4_1
699; MIPS64-NEXT:    nop
700; MIPS64-NEXT:  # %bb.2: # %entry
701; MIPS64-NEXT:    jr $ra
702; MIPS64-NEXT:    nop
703;
704; MIPS64R2-LABEL: AtomicLoadXor:
705; MIPS64R2:       # %bb.0: # %entry
706; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor)))
707; MIPS64R2-NEXT:    daddu $1, $1, $25
708; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor)))
709; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
710; MIPS64R2-NEXT:  .LBB4_1: # %entry
711; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
712; MIPS64R2-NEXT:    lld $2, 0($1)
713; MIPS64R2-NEXT:    xor $3, $2, $4
714; MIPS64R2-NEXT:    scd $3, 0($1)
715; MIPS64R2-NEXT:    beqz $3, .LBB4_1
716; MIPS64R2-NEXT:    nop
717; MIPS64R2-NEXT:  # %bb.2: # %entry
718; MIPS64R2-NEXT:    jr $ra
719; MIPS64R2-NEXT:    nop
720;
721; MIPS64R6-LABEL: AtomicLoadXor:
722; MIPS64R6:       # %bb.0: # %entry
723; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor)))
724; MIPS64R6-NEXT:    daddu $1, $1, $25
725; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor)))
726; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
727; MIPS64R6-NEXT:  .LBB4_1: # %entry
728; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
729; MIPS64R6-NEXT:    lld $2, 0($1)
730; MIPS64R6-NEXT:    xor $3, $2, $4
731; MIPS64R6-NEXT:    scd $3, 0($1)
732; MIPS64R6-NEXT:    beqzc $3, .LBB4_1
733; MIPS64R6-NEXT:    nop
734; MIPS64R6-NEXT:  # %bb.2: # %entry
735; MIPS64R6-NEXT:    jrc $ra
736;
737; MIPS64R6O0-LABEL: AtomicLoadXor:
738; MIPS64R6O0:       # %bb.0: # %entry
739; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
740; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor)))
741; MIPS64R6O0-NEXT:    daddu $1, $1, $25
742; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor)))
743; MIPS64R6O0-NEXT:    move $2, $4
744; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
745; MIPS64R6O0-NEXT:  .LBB4_1: # %entry
746; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
747; MIPS64R6O0-NEXT:    lld $3, 0($1)
748; MIPS64R6O0-NEXT:    xor $5, $3, $4
749; MIPS64R6O0-NEXT:    scd $5, 0($1)
750; MIPS64R6O0-NEXT:    beqzc $5, .LBB4_1
751; MIPS64R6O0-NEXT:  # %bb.2: # %entry
752; MIPS64R6O0-NEXT:    sd $2, 8($sp) # 8-byte Folded Spill
753; MIPS64R6O0-NEXT:    move $2, $3
754; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
755; MIPS64R6O0-NEXT:    jrc $ra
756;
757; O1-LABEL: AtomicLoadXor:
758; O1:       # %bb.0: # %entry
759; O1-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor)))
760; O1-NEXT:    daddu $1, $1, $25
761; O1-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor)))
762; O1-NEXT:    ld $1, %got_disp(x)($1)
763; O1-NEXT:  .LBB4_1: # %entry
764; O1-NEXT:    # =>This Inner Loop Header: Depth=1
765; O1-NEXT:    lld $2, 0($1)
766; O1-NEXT:    xor $3, $2, $4
767; O1-NEXT:    scd $3, 0($1)
768; O1-NEXT:    beqz $3, .LBB4_1
769; O1-NEXT:    nop
770; O1-NEXT:  # %bb.2: # %entry
771; O1-NEXT:    jr $ra
772; O1-NEXT:    nop
773;
774; O2-LABEL: AtomicLoadXor:
775; O2:       # %bb.0: # %entry
776; O2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor)))
777; O2-NEXT:    daddu $1, $1, $25
778; O2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor)))
779; O2-NEXT:    ld $1, %got_disp(x)($1)
780; O2-NEXT:  .LBB4_1: # %entry
781; O2-NEXT:    # =>This Inner Loop Header: Depth=1
782; O2-NEXT:    lld $2, 0($1)
783; O2-NEXT:    xor $3, $2, $4
784; O2-NEXT:    scd $3, 0($1)
785; O2-NEXT:    beqz $3, .LBB4_1
786; O2-NEXT:    nop
787; O2-NEXT:  # %bb.2: # %entry
788; O2-NEXT:    jr $ra
789; O2-NEXT:    nop
790;
791; O3-LABEL: AtomicLoadXor:
792; O3:       # %bb.0: # %entry
793; O3-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor)))
794; O3-NEXT:    daddu $1, $1, $25
795; O3-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor)))
796; O3-NEXT:    ld $1, %got_disp(x)($1)
797; O3-NEXT:  .LBB4_1: # %entry
798; O3-NEXT:    # =>This Inner Loop Header: Depth=1
799; O3-NEXT:    lld $2, 0($1)
800; O3-NEXT:    xor $3, $2, $4
801; O3-NEXT:    scd $3, 0($1)
802; O3-NEXT:    beqz $3, .LBB4_1
803; O3-NEXT:    nop
804; O3-NEXT:  # %bb.2: # %entry
805; O3-NEXT:    jr $ra
806; O3-NEXT:    nop
807;
808; MIPS64EB-LABEL: AtomicLoadXor:
809; MIPS64EB:       # %bb.0: # %entry
810; MIPS64EB-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadXor)))
811; MIPS64EB-NEXT:    daddu $1, $1, $25
812; MIPS64EB-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadXor)))
813; MIPS64EB-NEXT:    ld $1, %got_disp(x)($1)
814; MIPS64EB-NEXT:  .LBB4_1: # %entry
815; MIPS64EB-NEXT:    # =>This Inner Loop Header: Depth=1
816; MIPS64EB-NEXT:    lld $2, 0($1)
817; MIPS64EB-NEXT:    xor $3, $2, $4
818; MIPS64EB-NEXT:    scd $3, 0($1)
819; MIPS64EB-NEXT:    beqz $3, .LBB4_1
820; MIPS64EB-NEXT:    nop
821; MIPS64EB-NEXT:  # %bb.2: # %entry
822; MIPS64EB-NEXT:    jr $ra
823; MIPS64EB-NEXT:    nop
824entry:
825  %0 = atomicrmw xor i64* @x, i64 %incr monotonic
826  ret i64 %0
827
828}
829
830define i64 @AtomicLoadNand(i64 signext %incr) nounwind {
831; MIPS4-LABEL: AtomicLoadNand:
832; MIPS4:       # %bb.0: # %entry
833; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand)))
834; MIPS4-NEXT:    daddu $1, $1, $25
835; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand)))
836; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
837; MIPS4-NEXT:  .LBB5_1: # %entry
838; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
839; MIPS4-NEXT:    lld $2, 0($1)
840; MIPS4-NEXT:    and $3, $2, $4
841; MIPS4-NEXT:    nor $3, $zero, $3
842; MIPS4-NEXT:    scd $3, 0($1)
843; MIPS4-NEXT:    beqz $3, .LBB5_1
844; MIPS4-NEXT:    nop
845; MIPS4-NEXT:  # %bb.2: # %entry
846; MIPS4-NEXT:    jr $ra
847; MIPS4-NEXT:    nop
848;
849; MIPS64-LABEL: AtomicLoadNand:
850; MIPS64:       # %bb.0: # %entry
851; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand)))
852; MIPS64-NEXT:    daddu $1, $1, $25
853; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand)))
854; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
855; MIPS64-NEXT:  .LBB5_1: # %entry
856; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
857; MIPS64-NEXT:    lld $2, 0($1)
858; MIPS64-NEXT:    and $3, $2, $4
859; MIPS64-NEXT:    nor $3, $zero, $3
860; MIPS64-NEXT:    scd $3, 0($1)
861; MIPS64-NEXT:    beqz $3, .LBB5_1
862; MIPS64-NEXT:    nop
863; MIPS64-NEXT:  # %bb.2: # %entry
864; MIPS64-NEXT:    jr $ra
865; MIPS64-NEXT:    nop
866;
867; MIPS64R2-LABEL: AtomicLoadNand:
868; MIPS64R2:       # %bb.0: # %entry
869; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand)))
870; MIPS64R2-NEXT:    daddu $1, $1, $25
871; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand)))
872; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
873; MIPS64R2-NEXT:  .LBB5_1: # %entry
874; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
875; MIPS64R2-NEXT:    lld $2, 0($1)
876; MIPS64R2-NEXT:    and $3, $2, $4
877; MIPS64R2-NEXT:    nor $3, $zero, $3
878; MIPS64R2-NEXT:    scd $3, 0($1)
879; MIPS64R2-NEXT:    beqz $3, .LBB5_1
880; MIPS64R2-NEXT:    nop
881; MIPS64R2-NEXT:  # %bb.2: # %entry
882; MIPS64R2-NEXT:    jr $ra
883; MIPS64R2-NEXT:    nop
884;
885; MIPS64R6-LABEL: AtomicLoadNand:
886; MIPS64R6:       # %bb.0: # %entry
887; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand)))
888; MIPS64R6-NEXT:    daddu $1, $1, $25
889; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand)))
890; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
891; MIPS64R6-NEXT:  .LBB5_1: # %entry
892; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
893; MIPS64R6-NEXT:    lld $2, 0($1)
894; MIPS64R6-NEXT:    and $3, $2, $4
895; MIPS64R6-NEXT:    nor $3, $zero, $3
896; MIPS64R6-NEXT:    scd $3, 0($1)
897; MIPS64R6-NEXT:    beqzc $3, .LBB5_1
898; MIPS64R6-NEXT:    nop
899; MIPS64R6-NEXT:  # %bb.2: # %entry
900; MIPS64R6-NEXT:    jrc $ra
901;
902; MIPS64R6O0-LABEL: AtomicLoadNand:
903; MIPS64R6O0:       # %bb.0: # %entry
904; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
905; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand)))
906; MIPS64R6O0-NEXT:    daddu $1, $1, $25
907; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand)))
908; MIPS64R6O0-NEXT:    move $2, $4
909; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
910; MIPS64R6O0-NEXT:  .LBB5_1: # %entry
911; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
912; MIPS64R6O0-NEXT:    lld $3, 0($1)
913; MIPS64R6O0-NEXT:    and $5, $3, $4
914; MIPS64R6O0-NEXT:    nor $5, $zero, $5
915; MIPS64R6O0-NEXT:    scd $5, 0($1)
916; MIPS64R6O0-NEXT:    beqzc $5, .LBB5_1
917; MIPS64R6O0-NEXT:  # %bb.2: # %entry
918; MIPS64R6O0-NEXT:    sd $2, 8($sp) # 8-byte Folded Spill
919; MIPS64R6O0-NEXT:    move $2, $3
920; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
921; MIPS64R6O0-NEXT:    jrc $ra
922;
923; O1-LABEL: AtomicLoadNand:
924; O1:       # %bb.0: # %entry
925; O1-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand)))
926; O1-NEXT:    daddu $1, $1, $25
927; O1-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand)))
928; O1-NEXT:    ld $1, %got_disp(x)($1)
929; O1-NEXT:  .LBB5_1: # %entry
930; O1-NEXT:    # =>This Inner Loop Header: Depth=1
931; O1-NEXT:    lld $2, 0($1)
932; O1-NEXT:    and $3, $2, $4
933; O1-NEXT:    nor $3, $zero, $3
934; O1-NEXT:    scd $3, 0($1)
935; O1-NEXT:    beqz $3, .LBB5_1
936; O1-NEXT:    nop
937; O1-NEXT:  # %bb.2: # %entry
938; O1-NEXT:    jr $ra
939; O1-NEXT:    nop
940;
941; O2-LABEL: AtomicLoadNand:
942; O2:       # %bb.0: # %entry
943; O2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand)))
944; O2-NEXT:    daddu $1, $1, $25
945; O2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand)))
946; O2-NEXT:    ld $1, %got_disp(x)($1)
947; O2-NEXT:  .LBB5_1: # %entry
948; O2-NEXT:    # =>This Inner Loop Header: Depth=1
949; O2-NEXT:    lld $2, 0($1)
950; O2-NEXT:    and $3, $2, $4
951; O2-NEXT:    nor $3, $zero, $3
952; O2-NEXT:    scd $3, 0($1)
953; O2-NEXT:    beqz $3, .LBB5_1
954; O2-NEXT:    nop
955; O2-NEXT:  # %bb.2: # %entry
956; O2-NEXT:    jr $ra
957; O2-NEXT:    nop
958;
959; O3-LABEL: AtomicLoadNand:
960; O3:       # %bb.0: # %entry
961; O3-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand)))
962; O3-NEXT:    daddu $1, $1, $25
963; O3-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand)))
964; O3-NEXT:    ld $1, %got_disp(x)($1)
965; O3-NEXT:  .LBB5_1: # %entry
966; O3-NEXT:    # =>This Inner Loop Header: Depth=1
967; O3-NEXT:    lld $2, 0($1)
968; O3-NEXT:    and $3, $2, $4
969; O3-NEXT:    nor $3, $zero, $3
970; O3-NEXT:    scd $3, 0($1)
971; O3-NEXT:    beqz $3, .LBB5_1
972; O3-NEXT:    nop
973; O3-NEXT:  # %bb.2: # %entry
974; O3-NEXT:    jr $ra
975; O3-NEXT:    nop
976;
977; MIPS64EB-LABEL: AtomicLoadNand:
978; MIPS64EB:       # %bb.0: # %entry
979; MIPS64EB-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicLoadNand)))
980; MIPS64EB-NEXT:    daddu $1, $1, $25
981; MIPS64EB-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicLoadNand)))
982; MIPS64EB-NEXT:    ld $1, %got_disp(x)($1)
983; MIPS64EB-NEXT:  .LBB5_1: # %entry
984; MIPS64EB-NEXT:    # =>This Inner Loop Header: Depth=1
985; MIPS64EB-NEXT:    lld $2, 0($1)
986; MIPS64EB-NEXT:    and $3, $2, $4
987; MIPS64EB-NEXT:    nor $3, $zero, $3
988; MIPS64EB-NEXT:    scd $3, 0($1)
989; MIPS64EB-NEXT:    beqz $3, .LBB5_1
990; MIPS64EB-NEXT:    nop
991; MIPS64EB-NEXT:  # %bb.2: # %entry
992; MIPS64EB-NEXT:    jr $ra
993; MIPS64EB-NEXT:    nop
994entry:
995  %0 = atomicrmw nand i64* @x, i64 %incr monotonic
996  ret i64 %0
997
998}
999
1000define i64 @AtomicSwap64(i64 signext %newval) nounwind {
1001; MIPS4-LABEL: AtomicSwap64:
1002; MIPS4:       # %bb.0: # %entry
1003; MIPS4-NEXT:    daddiu $sp, $sp, -16
1004; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap64)))
1005; MIPS4-NEXT:    daddu $1, $1, $25
1006; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64)))
1007; MIPS4-NEXT:    sd $4, 8($sp)
1008; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1009; MIPS4-NEXT:  .LBB6_1: # %entry
1010; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1011; MIPS4-NEXT:    lld $2, 0($1)
1012; MIPS4-NEXT:    move $3, $4
1013; MIPS4-NEXT:    scd $3, 0($1)
1014; MIPS4-NEXT:    beqz $3, .LBB6_1
1015; MIPS4-NEXT:    nop
1016; MIPS4-NEXT:  # %bb.2: # %entry
1017; MIPS4-NEXT:    jr $ra
1018; MIPS4-NEXT:    daddiu $sp, $sp, 16
1019;
1020; MIPS64-LABEL: AtomicSwap64:
1021; MIPS64:       # %bb.0: # %entry
1022; MIPS64-NEXT:    daddiu $sp, $sp, -16
1023; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap64)))
1024; MIPS64-NEXT:    daddu $1, $1, $25
1025; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64)))
1026; MIPS64-NEXT:    sd $4, 8($sp)
1027; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1028; MIPS64-NEXT:  .LBB6_1: # %entry
1029; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1030; MIPS64-NEXT:    lld $2, 0($1)
1031; MIPS64-NEXT:    move $3, $4
1032; MIPS64-NEXT:    scd $3, 0($1)
1033; MIPS64-NEXT:    beqz $3, .LBB6_1
1034; MIPS64-NEXT:    nop
1035; MIPS64-NEXT:  # %bb.2: # %entry
1036; MIPS64-NEXT:    jr $ra
1037; MIPS64-NEXT:    daddiu $sp, $sp, 16
1038;
1039; MIPS64R2-LABEL: AtomicSwap64:
1040; MIPS64R2:       # %bb.0: # %entry
1041; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
1042; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap64)))
1043; MIPS64R2-NEXT:    daddu $1, $1, $25
1044; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64)))
1045; MIPS64R2-NEXT:    sd $4, 8($sp)
1046; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1047; MIPS64R2-NEXT:  .LBB6_1: # %entry
1048; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1049; MIPS64R2-NEXT:    lld $2, 0($1)
1050; MIPS64R2-NEXT:    move $3, $4
1051; MIPS64R2-NEXT:    scd $3, 0($1)
1052; MIPS64R2-NEXT:    beqz $3, .LBB6_1
1053; MIPS64R2-NEXT:    nop
1054; MIPS64R2-NEXT:  # %bb.2: # %entry
1055; MIPS64R2-NEXT:    jr $ra
1056; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
1057;
1058; MIPS64R6-LABEL: AtomicSwap64:
1059; MIPS64R6:       # %bb.0: # %entry
1060; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
1061; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap64)))
1062; MIPS64R6-NEXT:    daddu $1, $1, $25
1063; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64)))
1064; MIPS64R6-NEXT:    sd $4, 8($sp)
1065; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1066; MIPS64R6-NEXT:  .LBB6_1: # %entry
1067; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1068; MIPS64R6-NEXT:    lld $2, 0($1)
1069; MIPS64R6-NEXT:    move $3, $4
1070; MIPS64R6-NEXT:    scd $3, 0($1)
1071; MIPS64R6-NEXT:    beqzc $3, .LBB6_1
1072; MIPS64R6-NEXT:    nop
1073; MIPS64R6-NEXT:  # %bb.2: # %entry
1074; MIPS64R6-NEXT:    jr $ra
1075; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
1076;
1077; MIPS64R6O0-LABEL: AtomicSwap64:
1078; MIPS64R6O0:       # %bb.0: # %entry
1079; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -16
1080; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap64)))
1081; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1082; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64)))
1083; MIPS64R6O0-NEXT:    move $2, $4
1084; MIPS64R6O0-NEXT:    sd $4, 8($sp)
1085; MIPS64R6O0-NEXT:    ld $3, 8($sp)
1086; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
1087; MIPS64R6O0-NEXT:  .LBB6_1: # %entry
1088; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1089; MIPS64R6O0-NEXT:    lld $4, 0($1)
1090; MIPS64R6O0-NEXT:    move $5, $3
1091; MIPS64R6O0-NEXT:    scd $5, 0($1)
1092; MIPS64R6O0-NEXT:    beqzc $5, .LBB6_1
1093; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1094; MIPS64R6O0-NEXT:    sd $2, 0($sp) # 8-byte Folded Spill
1095; MIPS64R6O0-NEXT:    move $2, $4
1096; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 16
1097; MIPS64R6O0-NEXT:    jrc $ra
1098;
1099; O1-LABEL: AtomicSwap64:
1100; O1:       # %bb.0: # %entry
1101; O1-NEXT:    daddiu $sp, $sp, -16
1102; O1-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap64)))
1103; O1-NEXT:    daddu $1, $1, $25
1104; O1-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64)))
1105; O1-NEXT:    sd $4, 8($sp)
1106; O1-NEXT:    ld $1, %got_disp(x)($1)
1107; O1-NEXT:  .LBB6_1: # %entry
1108; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1109; O1-NEXT:    lld $2, 0($1)
1110; O1-NEXT:    move $3, $4
1111; O1-NEXT:    scd $3, 0($1)
1112; O1-NEXT:    beqz $3, .LBB6_1
1113; O1-NEXT:    nop
1114; O1-NEXT:  # %bb.2: # %entry
1115; O1-NEXT:    jr $ra
1116; O1-NEXT:    daddiu $sp, $sp, 16
1117;
1118; O2-LABEL: AtomicSwap64:
1119; O2:       # %bb.0: # %entry
1120; O2-NEXT:    daddiu $sp, $sp, -16
1121; O2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap64)))
1122; O2-NEXT:    daddu $1, $1, $25
1123; O2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64)))
1124; O2-NEXT:    sd $4, 8($sp)
1125; O2-NEXT:    ld $1, %got_disp(x)($1)
1126; O2-NEXT:  .LBB6_1: # %entry
1127; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1128; O2-NEXT:    lld $2, 0($1)
1129; O2-NEXT:    move $3, $4
1130; O2-NEXT:    scd $3, 0($1)
1131; O2-NEXT:    beqz $3, .LBB6_1
1132; O2-NEXT:    nop
1133; O2-NEXT:  # %bb.2: # %entry
1134; O2-NEXT:    jr $ra
1135; O2-NEXT:    daddiu $sp, $sp, 16
1136;
1137; O3-LABEL: AtomicSwap64:
1138; O3:       # %bb.0: # %entry
1139; O3-NEXT:    daddiu $sp, $sp, -16
1140; O3-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap64)))
1141; O3-NEXT:    sd $4, 8($sp)
1142; O3-NEXT:    daddu $1, $1, $25
1143; O3-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64)))
1144; O3-NEXT:    ld $1, %got_disp(x)($1)
1145; O3-NEXT:  .LBB6_1: # %entry
1146; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1147; O3-NEXT:    lld $2, 0($1)
1148; O3-NEXT:    move $3, $4
1149; O3-NEXT:    scd $3, 0($1)
1150; O3-NEXT:    beqz $3, .LBB6_1
1151; O3-NEXT:    nop
1152; O3-NEXT:  # %bb.2: # %entry
1153; O3-NEXT:    jr $ra
1154; O3-NEXT:    daddiu $sp, $sp, 16
1155;
1156; MIPS64EB-LABEL: AtomicSwap64:
1157; MIPS64EB:       # %bb.0: # %entry
1158; MIPS64EB-NEXT:    daddiu $sp, $sp, -16
1159; MIPS64EB-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicSwap64)))
1160; MIPS64EB-NEXT:    daddu $1, $1, $25
1161; MIPS64EB-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicSwap64)))
1162; MIPS64EB-NEXT:    sd $4, 8($sp)
1163; MIPS64EB-NEXT:    ld $1, %got_disp(x)($1)
1164; MIPS64EB-NEXT:  .LBB6_1: # %entry
1165; MIPS64EB-NEXT:    # =>This Inner Loop Header: Depth=1
1166; MIPS64EB-NEXT:    lld $2, 0($1)
1167; MIPS64EB-NEXT:    move $3, $4
1168; MIPS64EB-NEXT:    scd $3, 0($1)
1169; MIPS64EB-NEXT:    beqz $3, .LBB6_1
1170; MIPS64EB-NEXT:    nop
1171; MIPS64EB-NEXT:  # %bb.2: # %entry
1172; MIPS64EB-NEXT:    jr $ra
1173; MIPS64EB-NEXT:    daddiu $sp, $sp, 16
1174entry:
1175  %newval.addr = alloca i64, align 4
1176  store i64 %newval, i64* %newval.addr, align 4
1177  %tmp = load i64, i64* %newval.addr, align 4
1178  %0 = atomicrmw xchg i64* @x, i64 %tmp monotonic
1179  ret i64 %0
1180
1181}
1182
1183define i64 @AtomicCmpSwap64(i64 signext %oldval, i64 signext %newval) nounwind {
1184; MIPS4-LABEL: AtomicCmpSwap64:
1185; MIPS4:       # %bb.0: # %entry
1186; MIPS4-NEXT:    daddiu $sp, $sp, -16
1187; MIPS4-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64)))
1188; MIPS4-NEXT:    daddu $1, $1, $25
1189; MIPS4-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64)))
1190; MIPS4-NEXT:    sd $5, 8($sp)
1191; MIPS4-NEXT:    ld $1, %got_disp(x)($1)
1192; MIPS4-NEXT:  .LBB7_1: # %entry
1193; MIPS4-NEXT:    # =>This Inner Loop Header: Depth=1
1194; MIPS4-NEXT:    lld $2, 0($1)
1195; MIPS4-NEXT:    bne $2, $4, .LBB7_3
1196; MIPS4-NEXT:    nop
1197; MIPS4-NEXT:  # %bb.2: # %entry
1198; MIPS4-NEXT:    # in Loop: Header=BB7_1 Depth=1
1199; MIPS4-NEXT:    move $3, $5
1200; MIPS4-NEXT:    scd $3, 0($1)
1201; MIPS4-NEXT:    beqz $3, .LBB7_1
1202; MIPS4-NEXT:    nop
1203; MIPS4-NEXT:  .LBB7_3: # %entry
1204; MIPS4-NEXT:    jr $ra
1205; MIPS4-NEXT:    daddiu $sp, $sp, 16
1206;
1207; MIPS64-LABEL: AtomicCmpSwap64:
1208; MIPS64:       # %bb.0: # %entry
1209; MIPS64-NEXT:    daddiu $sp, $sp, -16
1210; MIPS64-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64)))
1211; MIPS64-NEXT:    daddu $1, $1, $25
1212; MIPS64-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64)))
1213; MIPS64-NEXT:    sd $5, 8($sp)
1214; MIPS64-NEXT:    ld $1, %got_disp(x)($1)
1215; MIPS64-NEXT:  .LBB7_1: # %entry
1216; MIPS64-NEXT:    # =>This Inner Loop Header: Depth=1
1217; MIPS64-NEXT:    lld $2, 0($1)
1218; MIPS64-NEXT:    bne $2, $4, .LBB7_3
1219; MIPS64-NEXT:    nop
1220; MIPS64-NEXT:  # %bb.2: # %entry
1221; MIPS64-NEXT:    # in Loop: Header=BB7_1 Depth=1
1222; MIPS64-NEXT:    move $3, $5
1223; MIPS64-NEXT:    scd $3, 0($1)
1224; MIPS64-NEXT:    beqz $3, .LBB7_1
1225; MIPS64-NEXT:    nop
1226; MIPS64-NEXT:  .LBB7_3: # %entry
1227; MIPS64-NEXT:    jr $ra
1228; MIPS64-NEXT:    daddiu $sp, $sp, 16
1229;
1230; MIPS64R2-LABEL: AtomicCmpSwap64:
1231; MIPS64R2:       # %bb.0: # %entry
1232; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
1233; MIPS64R2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64)))
1234; MIPS64R2-NEXT:    daddu $1, $1, $25
1235; MIPS64R2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64)))
1236; MIPS64R2-NEXT:    sd $5, 8($sp)
1237; MIPS64R2-NEXT:    ld $1, %got_disp(x)($1)
1238; MIPS64R2-NEXT:  .LBB7_1: # %entry
1239; MIPS64R2-NEXT:    # =>This Inner Loop Header: Depth=1
1240; MIPS64R2-NEXT:    lld $2, 0($1)
1241; MIPS64R2-NEXT:    bne $2, $4, .LBB7_3
1242; MIPS64R2-NEXT:    nop
1243; MIPS64R2-NEXT:  # %bb.2: # %entry
1244; MIPS64R2-NEXT:    # in Loop: Header=BB7_1 Depth=1
1245; MIPS64R2-NEXT:    move $3, $5
1246; MIPS64R2-NEXT:    scd $3, 0($1)
1247; MIPS64R2-NEXT:    beqz $3, .LBB7_1
1248; MIPS64R2-NEXT:    nop
1249; MIPS64R2-NEXT:  .LBB7_3: # %entry
1250; MIPS64R2-NEXT:    jr $ra
1251; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
1252;
1253; MIPS64R6-LABEL: AtomicCmpSwap64:
1254; MIPS64R6:       # %bb.0: # %entry
1255; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
1256; MIPS64R6-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64)))
1257; MIPS64R6-NEXT:    daddu $1, $1, $25
1258; MIPS64R6-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64)))
1259; MIPS64R6-NEXT:    sd $5, 8($sp)
1260; MIPS64R6-NEXT:    ld $1, %got_disp(x)($1)
1261; MIPS64R6-NEXT:  .LBB7_1: # %entry
1262; MIPS64R6-NEXT:    # =>This Inner Loop Header: Depth=1
1263; MIPS64R6-NEXT:    lld $2, 0($1)
1264; MIPS64R6-NEXT:    bnec $2, $4, .LBB7_3
1265; MIPS64R6-NEXT:  # %bb.2: # %entry
1266; MIPS64R6-NEXT:    # in Loop: Header=BB7_1 Depth=1
1267; MIPS64R6-NEXT:    move $3, $5
1268; MIPS64R6-NEXT:    scd $3, 0($1)
1269; MIPS64R6-NEXT:    beqzc $3, .LBB7_1
1270; MIPS64R6-NEXT:    nop
1271; MIPS64R6-NEXT:  .LBB7_3: # %entry
1272; MIPS64R6-NEXT:    jr $ra
1273; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
1274;
1275; MIPS64R6O0-LABEL: AtomicCmpSwap64:
1276; MIPS64R6O0:       # %bb.0: # %entry
1277; MIPS64R6O0-NEXT:    daddiu $sp, $sp, -32
1278; MIPS64R6O0-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64)))
1279; MIPS64R6O0-NEXT:    daddu $1, $1, $25
1280; MIPS64R6O0-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64)))
1281; MIPS64R6O0-NEXT:    move $2, $5
1282; MIPS64R6O0-NEXT:    move $3, $4
1283; MIPS64R6O0-NEXT:    sd $5, 24($sp)
1284; MIPS64R6O0-NEXT:    ld $5, 24($sp)
1285; MIPS64R6O0-NEXT:    ld $1, %got_disp(x)($1)
1286; MIPS64R6O0-NEXT:  .LBB7_1: # %entry
1287; MIPS64R6O0-NEXT:    # =>This Inner Loop Header: Depth=1
1288; MIPS64R6O0-NEXT:    lld $6, 0($1)
1289; MIPS64R6O0-NEXT:    bnec $6, $4, .LBB7_3
1290; MIPS64R6O0-NEXT:  # %bb.2: # %entry
1291; MIPS64R6O0-NEXT:    # in Loop: Header=BB7_1 Depth=1
1292; MIPS64R6O0-NEXT:    move $7, $5
1293; MIPS64R6O0-NEXT:    scd $7, 0($1)
1294; MIPS64R6O0-NEXT:    beqzc $7, .LBB7_1
1295; MIPS64R6O0-NEXT:  .LBB7_3: # %entry
1296; MIPS64R6O0-NEXT:    sd $2, 16($sp) # 8-byte Folded Spill
1297; MIPS64R6O0-NEXT:    move $2, $6
1298; MIPS64R6O0-NEXT:    sd $3, 8($sp) # 8-byte Folded Spill
1299; MIPS64R6O0-NEXT:    daddiu $sp, $sp, 32
1300; MIPS64R6O0-NEXT:    jrc $ra
1301;
1302; O1-LABEL: AtomicCmpSwap64:
1303; O1:       # %bb.0: # %entry
1304; O1-NEXT:    daddiu $sp, $sp, -16
1305; O1-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64)))
1306; O1-NEXT:    daddu $1, $1, $25
1307; O1-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64)))
1308; O1-NEXT:    sd $5, 8($sp)
1309; O1-NEXT:    ld $1, %got_disp(x)($1)
1310; O1-NEXT:  .LBB7_1: # %entry
1311; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1312; O1-NEXT:    lld $2, 0($1)
1313; O1-NEXT:    bne $2, $4, .LBB7_3
1314; O1-NEXT:    nop
1315; O1-NEXT:  # %bb.2: # %entry
1316; O1-NEXT:    # in Loop: Header=BB7_1 Depth=1
1317; O1-NEXT:    move $3, $5
1318; O1-NEXT:    scd $3, 0($1)
1319; O1-NEXT:    beqz $3, .LBB7_1
1320; O1-NEXT:    nop
1321; O1-NEXT:  .LBB7_3: # %entry
1322; O1-NEXT:    jr $ra
1323; O1-NEXT:    daddiu $sp, $sp, 16
1324;
1325; O2-LABEL: AtomicCmpSwap64:
1326; O2:       # %bb.0: # %entry
1327; O2-NEXT:    daddiu $sp, $sp, -16
1328; O2-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64)))
1329; O2-NEXT:    daddu $1, $1, $25
1330; O2-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64)))
1331; O2-NEXT:    sd $5, 8($sp)
1332; O2-NEXT:    ld $1, %got_disp(x)($1)
1333; O2-NEXT:  .LBB7_1: # %entry
1334; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1335; O2-NEXT:    lld $2, 0($1)
1336; O2-NEXT:    bne $2, $4, .LBB7_3
1337; O2-NEXT:    nop
1338; O2-NEXT:  # %bb.2: # %entry
1339; O2-NEXT:    # in Loop: Header=BB7_1 Depth=1
1340; O2-NEXT:    move $3, $5
1341; O2-NEXT:    scd $3, 0($1)
1342; O2-NEXT:    beqz $3, .LBB7_1
1343; O2-NEXT:    nop
1344; O2-NEXT:  .LBB7_3: # %entry
1345; O2-NEXT:    jr $ra
1346; O2-NEXT:    daddiu $sp, $sp, 16
1347;
1348; O3-LABEL: AtomicCmpSwap64:
1349; O3:       # %bb.0: # %entry
1350; O3-NEXT:    daddiu $sp, $sp, -16
1351; O3-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64)))
1352; O3-NEXT:    sd $5, 8($sp)
1353; O3-NEXT:    daddu $1, $1, $25
1354; O3-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64)))
1355; O3-NEXT:    ld $1, %got_disp(x)($1)
1356; O3-NEXT:  .LBB7_1: # %entry
1357; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1358; O3-NEXT:    lld $2, 0($1)
1359; O3-NEXT:    bne $2, $4, .LBB7_3
1360; O3-NEXT:    nop
1361; O3-NEXT:  # %bb.2: # %entry
1362; O3-NEXT:    # in Loop: Header=BB7_1 Depth=1
1363; O3-NEXT:    move $3, $5
1364; O3-NEXT:    scd $3, 0($1)
1365; O3-NEXT:    beqz $3, .LBB7_1
1366; O3-NEXT:    nop
1367; O3-NEXT:  .LBB7_3: # %entry
1368; O3-NEXT:    jr $ra
1369; O3-NEXT:    daddiu $sp, $sp, 16
1370;
1371; MIPS64EB-LABEL: AtomicCmpSwap64:
1372; MIPS64EB:       # %bb.0: # %entry
1373; MIPS64EB-NEXT:    daddiu $sp, $sp, -16
1374; MIPS64EB-NEXT:    lui $1, %hi(%neg(%gp_rel(AtomicCmpSwap64)))
1375; MIPS64EB-NEXT:    daddu $1, $1, $25
1376; MIPS64EB-NEXT:    daddiu $1, $1, %lo(%neg(%gp_rel(AtomicCmpSwap64)))
1377; MIPS64EB-NEXT:    sd $5, 8($sp)
1378; MIPS64EB-NEXT:    ld $1, %got_disp(x)($1)
1379; MIPS64EB-NEXT:  .LBB7_1: # %entry
1380; MIPS64EB-NEXT:    # =>This Inner Loop Header: Depth=1
1381; MIPS64EB-NEXT:    lld $2, 0($1)
1382; MIPS64EB-NEXT:    bne $2, $4, .LBB7_3
1383; MIPS64EB-NEXT:    nop
1384; MIPS64EB-NEXT:  # %bb.2: # %entry
1385; MIPS64EB-NEXT:    # in Loop: Header=BB7_1 Depth=1
1386; MIPS64EB-NEXT:    move $3, $5
1387; MIPS64EB-NEXT:    scd $3, 0($1)
1388; MIPS64EB-NEXT:    beqz $3, .LBB7_1
1389; MIPS64EB-NEXT:    nop
1390; MIPS64EB-NEXT:  .LBB7_3: # %entry
1391; MIPS64EB-NEXT:    jr $ra
1392; MIPS64EB-NEXT:    daddiu $sp, $sp, 16
1393entry:
1394  %newval.addr = alloca i64, align 4
1395  store i64 %newval, i64* %newval.addr, align 4
1396  %tmp = load i64, i64* %newval.addr, align 4
1397  %0 = cmpxchg i64* @x, i64 %oldval, i64 %tmp monotonic monotonic
1398  %1 = extractvalue { i64, i1 } %0, 0
1399  ret i64 %1
1400
1401}
1402