blob: 0e60fe1fbfbc5048abcb63548de41aec290ed565 [file] [log] [blame]
Akira Hatanakaaffed7e2013-05-31 03:25:44 +00001; RUN: llc -march=mipsel --disable-machine-licm < %s | FileCheck %s -check-prefix=CHECK-EL
2; RUN: llc -march=mips --disable-machine-licm < %s | FileCheck %s -check-prefix=CHECK-EB
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +00003
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +00004@x = common global i32 0, align 4
5
6define i32 @AtomicLoadAdd32(i32 %incr) nounwind {
7entry:
Eli Friedmanad2d46d2011-09-26 20:27:49 +00008 %0 = atomicrmw add i32* @x, i32 %incr monotonic
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +00009 ret i32 %0
10
Stephen Lin8b2b8a12013-07-14 06:24:09 +000011; CHECK-EL-LABEL: AtomicLoadAdd32:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000012; CHECK-EL: lw $[[R0:[0-9]+]], %got(x)
13; CHECK-EL: $[[BB0:[A-Z_0-9]+]]:
14; CHECK-EL: ll $[[R1:[0-9]+]], 0($[[R0]])
15; CHECK-EL: addu $[[R2:[0-9]+]], $[[R1]], $4
16; CHECK-EL: sc $[[R2]], 0($[[R0]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +000017; CHECK-EL: beqz $[[R2]], $[[BB0]]
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000018
Stephen Lin8b2b8a12013-07-14 06:24:09 +000019; CHECK-EB-LABEL: AtomicLoadAdd32:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000020; CHECK-EB: lw $[[R0:[0-9]+]], %got(x)
21; CHECK-EB: $[[BB0:[A-Z_0-9]+]]:
22; CHECK-EB: ll $[[R1:[0-9]+]], 0($[[R0]])
23; CHECK-EB: addu $[[R2:[0-9]+]], $[[R1]], $4
24; CHECK-EB: sc $[[R2]], 0($[[R0]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +000025; CHECK-EB: beqz $[[R2]], $[[BB0]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000026}
27
28define i32 @AtomicLoadNand32(i32 %incr) nounwind {
29entry:
Eli Friedmanad2d46d2011-09-26 20:27:49 +000030 %0 = atomicrmw nand i32* @x, i32 %incr monotonic
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000031 ret i32 %0
32
Stephen Lin8b2b8a12013-07-14 06:24:09 +000033; CHECK-EL-LABEL: AtomicLoadNand32:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000034; CHECK-EL: lw $[[R0:[0-9]+]], %got(x)
35; CHECK-EL: $[[BB0:[A-Z_0-9]+]]:
36; CHECK-EL: ll $[[R1:[0-9]+]], 0($[[R0]])
37; CHECK-EL: and $[[R3:[0-9]+]], $[[R1]], $4
38; CHECK-EL: nor $[[R2:[0-9]+]], $zero, $[[R3]]
39; CHECK-EL: sc $[[R2]], 0($[[R0]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +000040; CHECK-EL: beqz $[[R2]], $[[BB0]]
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000041
Stephen Lin8b2b8a12013-07-14 06:24:09 +000042; CHECK-EB-LABEL: AtomicLoadNand32:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000043; CHECK-EB: lw $[[R0:[0-9]+]], %got(x)
44; CHECK-EB: $[[BB0:[A-Z_0-9]+]]:
45; CHECK-EB: ll $[[R1:[0-9]+]], 0($[[R0]])
46; CHECK-EB: and $[[R3:[0-9]+]], $[[R1]], $4
47; CHECK-EB: nor $[[R2:[0-9]+]], $zero, $[[R3]]
48; CHECK-EB: sc $[[R2]], 0($[[R0]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +000049; CHECK-EB: beqz $[[R2]], $[[BB0]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000050}
51
Akira Hatanaka0d7d0b52011-07-18 18:52:12 +000052define i32 @AtomicSwap32(i32 %newval) nounwind {
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000053entry:
Akira Hatanaka0d7d0b52011-07-18 18:52:12 +000054 %newval.addr = alloca i32, align 4
55 store i32 %newval, i32* %newval.addr, align 4
56 %tmp = load i32* %newval.addr, align 4
Eli Friedmanad2d46d2011-09-26 20:27:49 +000057 %0 = atomicrmw xchg i32* @x, i32 %tmp monotonic
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000058 ret i32 %0
59
Stephen Lin8b2b8a12013-07-14 06:24:09 +000060; CHECK-EL-LABEL: AtomicSwap32:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000061; CHECK-EL: lw $[[R0:[0-9]+]], %got(x)
62; CHECK-EL: $[[BB0:[A-Z_0-9]+]]:
63; CHECK-EL: ll ${{[0-9]+}}, 0($[[R0]])
64; CHECK-EL: sc $[[R2:[0-9]+]], 0($[[R0]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +000065; CHECK-EL: beqz $[[R2]], $[[BB0]]
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000066
Stephen Lin8b2b8a12013-07-14 06:24:09 +000067; CHECK-EB-LABEL: AtomicSwap32:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000068; CHECK-EB: lw $[[R0:[0-9]+]], %got(x)
69; CHECK-EB: $[[BB0:[A-Z_0-9]+]]:
70; CHECK-EB: ll ${{[0-9]+}}, 0($[[R0]])
71; CHECK-EB: sc $[[R2:[0-9]+]], 0($[[R0]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +000072; CHECK-EB: beqz $[[R2]], $[[BB0]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000073}
74
75define i32 @AtomicCmpSwap32(i32 %oldval, i32 %newval) nounwind {
76entry:
Akira Hatanaka0d7d0b52011-07-18 18:52:12 +000077 %newval.addr = alloca i32, align 4
78 store i32 %newval, i32* %newval.addr, align 4
79 %tmp = load i32* %newval.addr, align 4
Eli Friedmanad2d46d2011-09-26 20:27:49 +000080 %0 = cmpxchg i32* @x, i32 %oldval, i32 %tmp monotonic
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000081 ret i32 %0
82
Stephen Lin8b2b8a12013-07-14 06:24:09 +000083; CHECK-EL-LABEL: AtomicCmpSwap32:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000084; CHECK-EL: lw $[[R0:[0-9]+]], %got(x)
85; CHECK-EL: $[[BB0:[A-Z_0-9]+]]:
86; CHECK-EL: ll $2, 0($[[R0]])
87; CHECK-EL: bne $2, $4, $[[BB1:[A-Z_0-9]+]]
88; CHECK-EL: sc $[[R2:[0-9]+]], 0($[[R0]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +000089; CHECK-EL: beqz $[[R2]], $[[BB0]]
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000090; CHECK-EL: $[[BB1]]:
91
Stephen Lin8b2b8a12013-07-14 06:24:09 +000092; CHECK-EB-LABEL: AtomicCmpSwap32:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000093; CHECK-EB: lw $[[R0:[0-9]+]], %got(x)
94; CHECK-EB: $[[BB0:[A-Z_0-9]+]]:
95; CHECK-EB: ll $2, 0($[[R0]])
96; CHECK-EB: bne $2, $4, $[[BB1:[A-Z_0-9]+]]
97; CHECK-EB: sc $[[R2:[0-9]+]], 0($[[R0]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +000098; CHECK-EB: beqz $[[R2]], $[[BB0]]
Akira Hatanakaaffed7e2013-05-31 03:25:44 +000099; CHECK-EB: $[[BB1]]:
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000100}
101
102
103
104@y = common global i8 0, align 1
105
106define signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind {
107entry:
Eli Friedmanad2d46d2011-09-26 20:27:49 +0000108 %0 = atomicrmw add i8* @y, i8 %incr monotonic
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000109 ret i8 %0
110
Stephen Lin8b2b8a12013-07-14 06:24:09 +0000111; CHECK-EL-LABEL: AtomicLoadAdd8:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000112; CHECK-EL: lw $[[R0:[0-9]+]], %got(y)
113; CHECK-EL: addiu $[[R1:[0-9]+]], $zero, -4
114; CHECK-EL: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
115; CHECK-EL: andi $[[R3:[0-9]+]], $[[R0]], 3
116; CHECK-EL: sll $[[R4:[0-9]+]], $[[R3]], 3
117; CHECK-EL: ori $[[R5:[0-9]+]], $zero, 255
118; CHECK-EL: sllv $[[R6:[0-9]+]], $[[R5]], $[[R4]]
119; CHECK-EL: nor $[[R7:[0-9]+]], $zero, $[[R6]]
120; CHECK-EL: sllv $[[R9:[0-9]+]], $4, $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000121
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000122; CHECK-EL: $[[BB0:[A-Z_0-9]+]]:
123; CHECK-EL: ll $[[R10:[0-9]+]], 0($[[R2]])
124; CHECK-EL: addu $[[R11:[0-9]+]], $[[R10]], $[[R9]]
125; CHECK-EL: and $[[R12:[0-9]+]], $[[R11]], $[[R6]]
126; CHECK-EL: and $[[R13:[0-9]+]], $[[R10]], $[[R7]]
127; CHECK-EL: or $[[R14:[0-9]+]], $[[R13]], $[[R12]]
128; CHECK-EL: sc $[[R14]], 0($[[R2]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +0000129; CHECK-EL: beqz $[[R14]], $[[BB0]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000130
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000131; CHECK-EL: and $[[R15:[0-9]+]], $[[R10]], $[[R6]]
132; CHECK-EL: srlv $[[R16:[0-9]+]], $[[R15]], $[[R4]]
133; CHECK-EL: sll $[[R17:[0-9]+]], $[[R16]], 24
134; CHECK-EL: sra $2, $[[R17]], 24
135
Stephen Lin8b2b8a12013-07-14 06:24:09 +0000136; CHECK-EB-LABEL: AtomicLoadAdd8:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000137; CHECK-EB: lw $[[R0:[0-9]+]], %got(y)
138; CHECK-EB: addiu $[[R1:[0-9]+]], $zero, -4
139; CHECK-EB: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
140; CHECK-EB: andi $[[R3:[0-9]+]], $[[R0]], 3
141; CHECK-EB: xori $[[R4:[0-9]+]], $[[R3]], 3
142; CHECK-EB: sll $[[R5:[0-9]+]], $[[R4]], 3
143; CHECK-EB: ori $[[R6:[0-9]+]], $zero, 255
144; CHECK-EB: sllv $[[R7:[0-9]+]], $[[R6]], $[[R5]]
145; CHECK-EB: nor $[[R8:[0-9]+]], $zero, $[[R7]]
146; CHECK-EB: sllv $[[R9:[0-9]+]], $4, $[[R5]]
147
148; CHECK-EB: $[[BB0:[A-Z_0-9]+]]:
149; CHECK-EB: ll $[[R10:[0-9]+]], 0($[[R2]])
150; CHECK-EB: addu $[[R11:[0-9]+]], $[[R10]], $[[R9]]
151; CHECK-EB: and $[[R12:[0-9]+]], $[[R11]], $[[R7]]
152; CHECK-EB: and $[[R13:[0-9]+]], $[[R10]], $[[R8]]
153; CHECK-EB: or $[[R14:[0-9]+]], $[[R13]], $[[R12]]
154; CHECK-EB: sc $[[R14]], 0($[[R2]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +0000155; CHECK-EB: beqz $[[R14]], $[[BB0]]
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000156
157; CHECK-EB: and $[[R15:[0-9]+]], $[[R10]], $[[R7]]
158; CHECK-EB: srlv $[[R16:[0-9]+]], $[[R15]], $[[R5]]
159; CHECK-EB: sll $[[R17:[0-9]+]], $[[R16]], 24
160; CHECK-EB: sra $2, $[[R17]], 24
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000161}
162
163define signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind {
164entry:
Eli Friedmanad2d46d2011-09-26 20:27:49 +0000165 %0 = atomicrmw sub i8* @y, i8 %incr monotonic
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000166 ret i8 %0
167
Stephen Lin8b2b8a12013-07-14 06:24:09 +0000168; CHECK-EL-LABEL: AtomicLoadSub8:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000169; CHECK-EL: lw $[[R0:[0-9]+]], %got(y)
170; CHECK-EL: addiu $[[R1:[0-9]+]], $zero, -4
171; CHECK-EL: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
172; CHECK-EL: andi $[[R3:[0-9]+]], $[[R0]], 3
173; CHECK-EL: sll $[[R4:[0-9]+]], $[[R3]], 3
174; CHECK-EL: ori $[[R5:[0-9]+]], $zero, 255
175; CHECK-EL: sllv $[[R6:[0-9]+]], $[[R5]], $[[R4]]
176; CHECK-EL: nor $[[R7:[0-9]+]], $zero, $[[R6]]
177; CHECK-EL: sllv $[[R9:[0-9]+]], $4, $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000178
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000179; CHECK-EL: $[[BB0:[A-Z_0-9]+]]:
180; CHECK-EL: ll $[[R10:[0-9]+]], 0($[[R2]])
181; CHECK-EL: subu $[[R11:[0-9]+]], $[[R10]], $[[R9]]
182; CHECK-EL: and $[[R12:[0-9]+]], $[[R11]], $[[R6]]
183; CHECK-EL: and $[[R13:[0-9]+]], $[[R10]], $[[R7]]
184; CHECK-EL: or $[[R14:[0-9]+]], $[[R13]], $[[R12]]
185; CHECK-EL: sc $[[R14]], 0($[[R2]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +0000186; CHECK-EL: beqz $[[R14]], $[[BB0]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000187
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000188; CHECK-EL: and $[[R15:[0-9]+]], $[[R10]], $[[R6]]
189; CHECK-EL: srlv $[[R16:[0-9]+]], $[[R15]], $[[R4]]
190; CHECK-EL: sll $[[R17:[0-9]+]], $[[R16]], 24
191; CHECK-EL: sra $2, $[[R17]], 24
192
Stephen Lin8b2b8a12013-07-14 06:24:09 +0000193; CHECK-EB-LABEL: AtomicLoadSub8:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000194; CHECK-EB: lw $[[R0:[0-9]+]], %got(y)
195; CHECK-EB: addiu $[[R1:[0-9]+]], $zero, -4
196; CHECK-EB: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
197; CHECK-EB: andi $[[R3:[0-9]+]], $[[R0]], 3
198; CHECK-EB: xori $[[R4:[0-9]+]], $[[R3]], 3
199; CHECK-EB: sll $[[R5:[0-9]+]], $[[R4]], 3
200; CHECK-EB: ori $[[R6:[0-9]+]], $zero, 255
201; CHECK-EB: sllv $[[R7:[0-9]+]], $[[R6]], $[[R5]]
202; CHECK-EB: nor $[[R8:[0-9]+]], $zero, $[[R7]]
203; CHECK-EB: sllv $[[R9:[0-9]+]], $4, $[[R5]]
204
205; CHECK-EB: $[[BB0:[A-Z_0-9]+]]:
206; CHECK-EB: ll $[[R10:[0-9]+]], 0($[[R2]])
207; CHECK-EB: subu $[[R11:[0-9]+]], $[[R10]], $[[R9]]
208; CHECK-EB: and $[[R12:[0-9]+]], $[[R11]], $[[R7]]
209; CHECK-EB: and $[[R13:[0-9]+]], $[[R10]], $[[R8]]
210; CHECK-EB: or $[[R14:[0-9]+]], $[[R13]], $[[R12]]
211; CHECK-EB: sc $[[R14]], 0($[[R2]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +0000212; CHECK-EB: beqz $[[R14]], $[[BB0]]
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000213
214; CHECK-EB: and $[[R15:[0-9]+]], $[[R10]], $[[R7]]
215; CHECK-EB: srlv $[[R16:[0-9]+]], $[[R15]], $[[R5]]
216; CHECK-EB: sll $[[R17:[0-9]+]], $[[R16]], 24
217; CHECK-EB: sra $2, $[[R17]], 24
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000218}
219
220define signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind {
221entry:
Eli Friedmanad2d46d2011-09-26 20:27:49 +0000222 %0 = atomicrmw nand i8* @y, i8 %incr monotonic
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000223 ret i8 %0
224
Stephen Lin8b2b8a12013-07-14 06:24:09 +0000225; CHECK-EL-LABEL: AtomicLoadNand8:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000226; CHECK-EL: lw $[[R0:[0-9]+]], %got(y)
227; CHECK-EL: addiu $[[R1:[0-9]+]], $zero, -4
228; CHECK-EL: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
229; CHECK-EL: andi $[[R3:[0-9]+]], $[[R0]], 3
230; CHECK-EL: sll $[[R4:[0-9]+]], $[[R3]], 3
231; CHECK-EL: ori $[[R5:[0-9]+]], $zero, 255
232; CHECK-EL: sllv $[[R6:[0-9]+]], $[[R5]], $[[R4]]
233; CHECK-EL: nor $[[R7:[0-9]+]], $zero, $[[R6]]
234; CHECK-EL: sllv $[[R9:[0-9]+]], $4, $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000235
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000236; CHECK-EL: $[[BB0:[A-Z_0-9]+]]:
237; CHECK-EL: ll $[[R10:[0-9]+]], 0($[[R2]])
238; CHECK-EL: and $[[R18:[0-9]+]], $[[R10]], $[[R9]]
239; CHECK-EL: nor $[[R11:[0-9]+]], $zero, $[[R18]]
240; CHECK-EL: and $[[R12:[0-9]+]], $[[R11]], $[[R6]]
241; CHECK-EL: and $[[R13:[0-9]+]], $[[R10]], $[[R7]]
242; CHECK-EL: or $[[R14:[0-9]+]], $[[R13]], $[[R12]]
243; CHECK-EL: sc $[[R14]], 0($[[R2]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +0000244; CHECK-EL: beqz $[[R14]], $[[BB0]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000245
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000246; CHECK-EL: and $[[R15:[0-9]+]], $[[R10]], $[[R6]]
247; CHECK-EL: srlv $[[R16:[0-9]+]], $[[R15]], $[[R4]]
248; CHECK-EL: sll $[[R17:[0-9]+]], $[[R16]], 24
249; CHECK-EL: sra $2, $[[R17]], 24
250
Stephen Lin8b2b8a12013-07-14 06:24:09 +0000251; CHECK-EB-LABEL: AtomicLoadNand8:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000252; CHECK-EB: lw $[[R0:[0-9]+]], %got(y)
253; CHECK-EB: addiu $[[R1:[0-9]+]], $zero, -4
254; CHECK-EB: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
255; CHECK-EB: andi $[[R3:[0-9]+]], $[[R0]], 3
256; CHECK-EB: xori $[[R4:[0-9]+]], $[[R3]], 3
257; CHECK-EB: sll $[[R5:[0-9]+]], $[[R4]], 3
258; CHECK-EB: ori $[[R6:[0-9]+]], $zero, 255
259; CHECK-EB: sllv $[[R7:[0-9]+]], $[[R6]], $[[R5]]
260; CHECK-EB: nor $[[R8:[0-9]+]], $zero, $[[R7]]
261; CHECK-EB: sllv $[[R9:[0-9]+]], $4, $[[R5]]
262
263; CHECK-EB: $[[BB0:[A-Z_0-9]+]]:
264; CHECK-EB: ll $[[R10:[0-9]+]], 0($[[R2]])
265; CHECK-EB: and $[[R18:[0-9]+]], $[[R10]], $[[R9]]
266; CHECK-EB: nor $[[R11:[0-9]+]], $zero, $[[R18]]
267; CHECK-EB: and $[[R12:[0-9]+]], $[[R11]], $[[R7]]
268; CHECK-EB: and $[[R13:[0-9]+]], $[[R10]], $[[R8]]
269; CHECK-EB: or $[[R14:[0-9]+]], $[[R13]], $[[R12]]
270; CHECK-EB: sc $[[R14]], 0($[[R2]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +0000271; CHECK-EB: beqz $[[R14]], $[[BB0]]
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000272
273; CHECK-EB: and $[[R15:[0-9]+]], $[[R10]], $[[R7]]
274; CHECK-EB: srlv $[[R16:[0-9]+]], $[[R15]], $[[R5]]
275; CHECK-EB: sll $[[R17:[0-9]+]], $[[R16]], 24
276; CHECK-EB: sra $2, $[[R17]], 24
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000277}
278
Akira Hatanaka0d7d0b52011-07-18 18:52:12 +0000279define signext i8 @AtomicSwap8(i8 signext %newval) nounwind {
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000280entry:
Eli Friedmanad2d46d2011-09-26 20:27:49 +0000281 %0 = atomicrmw xchg i8* @y, i8 %newval monotonic
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000282 ret i8 %0
283
Stephen Lin8b2b8a12013-07-14 06:24:09 +0000284; CHECK-EL-LABEL: AtomicSwap8:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000285; CHECK-EL: lw $[[R0:[0-9]+]], %got(y)
286; CHECK-EL: addiu $[[R1:[0-9]+]], $zero, -4
287; CHECK-EL: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
288; CHECK-EL: andi $[[R3:[0-9]+]], $[[R0]], 3
289; CHECK-EL: sll $[[R4:[0-9]+]], $[[R3]], 3
290; CHECK-EL: ori $[[R5:[0-9]+]], $zero, 255
291; CHECK-EL: sllv $[[R6:[0-9]+]], $[[R5]], $[[R4]]
292; CHECK-EL: nor $[[R7:[0-9]+]], $zero, $[[R6]]
293; CHECK-EL: sllv $[[R9:[0-9]+]], $4, $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000294
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000295; CHECK-EL: $[[BB0:[A-Z_0-9]+]]:
296; CHECK-EL: ll $[[R10:[0-9]+]], 0($[[R2]])
297; CHECK-EL: and $[[R18:[0-9]+]], $[[R9]], $[[R6]]
298; CHECK-EL: and $[[R13:[0-9]+]], $[[R10]], $[[R7]]
299; CHECK-EL: or $[[R14:[0-9]+]], $[[R13]], $[[R18]]
300; CHECK-EL: sc $[[R14]], 0($[[R2]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +0000301; CHECK-EL: beqz $[[R14]], $[[BB0]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000302
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000303; CHECK-EL: and $[[R15:[0-9]+]], $[[R10]], $[[R6]]
304; CHECK-EL: srlv $[[R16:[0-9]+]], $[[R15]], $[[R4]]
305; CHECK-EL: sll $[[R17:[0-9]+]], $[[R16]], 24
306; CHECK-EL: sra $2, $[[R17]], 24
307
Stephen Lin8b2b8a12013-07-14 06:24:09 +0000308; CHECK-EB-LABEL: AtomicSwap8:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000309; CHECK-EB: lw $[[R0:[0-9]+]], %got(y)
310; CHECK-EB: addiu $[[R1:[0-9]+]], $zero, -4
311; CHECK-EB: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
312; CHECK-EB: andi $[[R3:[0-9]+]], $[[R0]], 3
313; CHECK-EB: xori $[[R4:[0-9]+]], $[[R3]], 3
314; CHECK-EB: sll $[[R5:[0-9]+]], $[[R4]], 3
315; CHECK-EB: ori $[[R6:[0-9]+]], $zero, 255
316; CHECK-EB: sllv $[[R7:[0-9]+]], $[[R6]], $[[R5]]
317; CHECK-EB: nor $[[R8:[0-9]+]], $zero, $[[R7]]
318; CHECK-EB: sllv $[[R9:[0-9]+]], $4, $[[R5]]
319
320; CHECK-EB: $[[BB0:[A-Z_0-9]+]]:
321; CHECK-EB: ll $[[R10:[0-9]+]], 0($[[R2]])
322; CHECK-EB: and $[[R18:[0-9]+]], $[[R9]], $[[R7]]
323; CHECK-EB: and $[[R13:[0-9]+]], $[[R10]], $[[R8]]
324; CHECK-EB: or $[[R14:[0-9]+]], $[[R13]], $[[R18]]
325; CHECK-EB: sc $[[R14]], 0($[[R2]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +0000326; CHECK-EB: beqz $[[R14]], $[[BB0]]
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000327
328; CHECK-EB: and $[[R15:[0-9]+]], $[[R10]], $[[R7]]
329; CHECK-EB: srlv $[[R16:[0-9]+]], $[[R15]], $[[R5]]
330; CHECK-EB: sll $[[R17:[0-9]+]], $[[R16]], 24
331; CHECK-EB: sra $2, $[[R17]], 24
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000332}
333
334define signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind {
335entry:
Eli Friedmanad2d46d2011-09-26 20:27:49 +0000336 %0 = cmpxchg i8* @y, i8 %oldval, i8 %newval monotonic
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000337 ret i8 %0
338
Stephen Lin8b2b8a12013-07-14 06:24:09 +0000339; CHECK-EL-LABEL: AtomicCmpSwap8:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000340; CHECK-EL: lw $[[R0:[0-9]+]], %got(y)
341; CHECK-EL: addiu $[[R1:[0-9]+]], $zero, -4
342; CHECK-EL: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
343; CHECK-EL: andi $[[R3:[0-9]+]], $[[R0]], 3
344; CHECK-EL: sll $[[R4:[0-9]+]], $[[R3]], 3
345; CHECK-EL: ori $[[R5:[0-9]+]], $zero, 255
346; CHECK-EL: sllv $[[R6:[0-9]+]], $[[R5]], $[[R4]]
347; CHECK-EL: nor $[[R7:[0-9]+]], $zero, $[[R6]]
348; CHECK-EL: andi $[[R8:[0-9]+]], $4, 255
349; CHECK-EL: sllv $[[R9:[0-9]+]], $[[R8]], $[[R4]]
350; CHECK-EL: andi $[[R10:[0-9]+]], $5, 255
351; CHECK-EL: sllv $[[R11:[0-9]+]], $[[R10]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000352
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000353; CHECK-EL: $[[BB0:[A-Z_0-9]+]]:
354; CHECK-EL: ll $[[R12:[0-9]+]], 0($[[R2]])
355; CHECK-EL: and $[[R13:[0-9]+]], $[[R12]], $[[R6]]
356; CHECK-EL: bne $[[R13]], $[[R9]], $[[BB1:[A-Z_0-9]+]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000357
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000358; CHECK-EL: and $[[R14:[0-9]+]], $[[R12]], $[[R7]]
359; CHECK-EL: or $[[R15:[0-9]+]], $[[R14]], $[[R11]]
360; CHECK-EL: sc $[[R15]], 0($[[R2]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +0000361; CHECK-EL: beqz $[[R15]], $[[BB0]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000362
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000363; CHECK-EL: $[[BB1]]:
364; CHECK-EL: srlv $[[R16:[0-9]+]], $[[R13]], $[[R4]]
365; CHECK-EL: sll $[[R17:[0-9]+]], $[[R16]], 24
366; CHECK-EL: sra $2, $[[R17]], 24
367
Stephen Lin8b2b8a12013-07-14 06:24:09 +0000368; CHECK-EB-LABEL: AtomicCmpSwap8:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000369; CHECK-EB: lw $[[R0:[0-9]+]], %got(y)
370; CHECK-EB: addiu $[[R1:[0-9]+]], $zero, -4
371; CHECK-EB: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
372; CHECK-EB: andi $[[R3:[0-9]+]], $[[R0]], 3
373; CHECK-EB: xori $[[R4:[0-9]+]], $[[R3]], 3
374; CHECK-EB: sll $[[R5:[0-9]+]], $[[R4]], 3
375; CHECK-EB: ori $[[R6:[0-9]+]], $zero, 255
376; CHECK-EB: sllv $[[R7:[0-9]+]], $[[R6]], $[[R5]]
377; CHECK-EB: nor $[[R8:[0-9]+]], $zero, $[[R7]]
378; CHECK-EB: andi $[[R9:[0-9]+]], $4, 255
379; CHECK-EB: sllv $[[R10:[0-9]+]], $[[R9]], $[[R5]]
380; CHECK-EB: andi $[[R11:[0-9]+]], $5, 255
381; CHECK-EB: sllv $[[R12:[0-9]+]], $[[R11]], $[[R5]]
382
383; CHECK-EB: $[[BB0:[A-Z_0-9]+]]:
384; CHECK-EB: ll $[[R13:[0-9]+]], 0($[[R2]])
385; CHECK-EB: and $[[R14:[0-9]+]], $[[R13]], $[[R7]]
386; CHECK-EB: bne $[[R14]], $[[R10]], $[[BB1:[A-Z_0-9]+]]
387
388; CHECK-EB: and $[[R15:[0-9]+]], $[[R13]], $[[R8]]
389; CHECK-EB: or $[[R16:[0-9]+]], $[[R15]], $[[R12]]
390; CHECK-EB: sc $[[R16]], 0($[[R2]])
Akira Hatanaka9b06dd62013-07-26 18:34:25 +0000391; CHECK-EB: beqz $[[R16]], $[[BB0]]
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000392
393; CHECK-EB: $[[BB1]]:
394; CHECK-EB: srlv $[[R17:[0-9]+]], $[[R14]], $[[R5]]
395; CHECK-EB: sll $[[R18:[0-9]+]], $[[R17]], 24
396; CHECK-EB: sra $2, $[[R18]], 24
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000397}
Akira Hatanakadb548262011-07-19 23:30:50 +0000398
399@countsint = common global i32 0, align 4
400
401define i32 @CheckSync(i32 %v) nounwind noinline {
402entry:
Eli Friedmanad2d46d2011-09-26 20:27:49 +0000403 %0 = atomicrmw add i32* @countsint, i32 %v seq_cst
Akira Hatanakadb548262011-07-19 23:30:50 +0000404 ret i32 %0
405
Stephen Lin8b2b8a12013-07-14 06:24:09 +0000406; CHECK-EL-LABEL: CheckSync:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000407; CHECK-EL: sync 0
408; CHECK-EL: ll
409; CHECK-EL: sc
410; CHECK-EL: beq
411; CHECK-EL: sync 0
412
Stephen Lin8b2b8a12013-07-14 06:24:09 +0000413; CHECK-EB-LABEL: CheckSync:
Akira Hatanakaaffed7e2013-05-31 03:25:44 +0000414; CHECK-EB: sync 0
415; CHECK-EB: ll
416; CHECK-EB: sc
417; CHECK-EB: beq
418; CHECK-EB: sync 0
Akira Hatanakadb548262011-07-19 23:30:50 +0000419}
420
Akira Hatanaka3011a332012-05-11 23:22:18 +0000421; make sure that this assertion in
422; TwoAddressInstructionPass::TryInstructionTransform does not fail:
423;
424; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) &&
425;
426; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an
427; operand of an atomic instruction with register $zero.
428@a = external global i32
429
430define i32 @zeroreg() nounwind {
431entry:
432 %0 = cmpxchg i32* @a, i32 1, i32 0 seq_cst
433 %1 = icmp eq i32 %0, 1
434 %conv = zext i1 %1 to i32
435 ret i32 %conv
436}