blob: bc6bf5f2754a5875ac069a5a331315f0618ba7b3 [file] [log] [blame]
Akira Hatanaka8ddf6532011-09-09 20:45:50 +00001; RUN: llc -march=mipsel < %s | FileCheck %s
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +00002
3
4declare i32 @llvm.atomic.load.add.i32.p0i32(i32* nocapture, i32) nounwind
5declare i32 @llvm.atomic.load.nand.i32.p0i32(i32* nocapture, i32) nounwind
6declare i32 @llvm.atomic.swap.i32.p0i32(i32* nocapture, i32) nounwind
7declare i32 @llvm.atomic.cmp.swap.i32.p0i32(i32* nocapture, i32, i32) nounwind
8
9declare i8 @llvm.atomic.load.add.i8.p0i8(i8* nocapture, i8) nounwind
10declare i8 @llvm.atomic.load.sub.i8.p0i8(i8* nocapture, i8) nounwind
11declare i8 @llvm.atomic.load.nand.i8.p0i8(i8* nocapture, i8) nounwind
12declare i8 @llvm.atomic.swap.i8.p0i8(i8* nocapture, i8) nounwind
13declare i8 @llvm.atomic.cmp.swap.i8.p0i8(i8* nocapture, i8, i8) nounwind
14
Akira Hatanakadb548262011-07-19 23:30:50 +000015declare void @llvm.memory.barrier(i1, i1, i1, i1, i1) nounwind
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000016
17@x = common global i32 0, align 4
18
19define i32 @AtomicLoadAdd32(i32 %incr) nounwind {
20entry:
21 %0 = call i32 @llvm.atomic.load.add.i32.p0i32(i32* @x, i32 %incr)
22 ret i32 %0
23
24; CHECK: AtomicLoadAdd32:
25; CHECK: lw $[[R0:[0-9]+]], %got(x)($gp)
26; CHECK: $[[BB0:[A-Z_0-9]+]]:
27; CHECK: ll $[[R1:[0-9]+]], 0($[[R0]])
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000028; CHECK: addu $[[R2:[0-9]+]], $[[R1]], $4
29; CHECK: sc $[[R2]], 0($[[R0]])
30; CHECK: beq $[[R2]], $zero, $[[BB0]]
31}
32
33define i32 @AtomicLoadNand32(i32 %incr) nounwind {
34entry:
35 %0 = call i32 @llvm.atomic.load.nand.i32.p0i32(i32* @x, i32 %incr)
36 ret i32 %0
37
38; CHECK: AtomicLoadNand32:
39; CHECK: lw $[[R0:[0-9]+]], %got(x)($gp)
40; CHECK: $[[BB0:[A-Z_0-9]+]]:
41; CHECK: ll $[[R1:[0-9]+]], 0($[[R0]])
Akira Hatanaka0d7d0b52011-07-18 18:52:12 +000042; CHECK: and $[[R3:[0-9]+]], $[[R1]], $4
43; CHECK: nor $[[R2:[0-9]+]], $zero, $[[R3]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000044; CHECK: sc $[[R2]], 0($[[R0]])
45; CHECK: beq $[[R2]], $zero, $[[BB0]]
46}
47
Akira Hatanaka0d7d0b52011-07-18 18:52:12 +000048define i32 @AtomicSwap32(i32 %newval) nounwind {
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000049entry:
Akira Hatanaka0d7d0b52011-07-18 18:52:12 +000050 %newval.addr = alloca i32, align 4
51 store i32 %newval, i32* %newval.addr, align 4
52 %tmp = load i32* %newval.addr, align 4
53 %0 = call i32 @llvm.atomic.swap.i32.p0i32(i32* @x, i32 %tmp)
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000054 ret i32 %0
55
56; CHECK: AtomicSwap32:
57; CHECK: lw $[[R0:[0-9]+]], %got(x)($gp)
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000058; CHECK: $[[BB0:[A-Z_0-9]+]]:
Akira Hatanaka0d7d0b52011-07-18 18:52:12 +000059; CHECK: ll ${{[0-9]+}}, 0($[[R0]])
60; CHECK: sc $[[R2:[0-9]+]], 0($[[R0]])
61; CHECK: beq $[[R2]], $zero, $[[BB0]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000062}
63
64define i32 @AtomicCmpSwap32(i32 %oldval, i32 %newval) nounwind {
65entry:
Akira Hatanaka0d7d0b52011-07-18 18:52:12 +000066 %newval.addr = alloca i32, align 4
67 store i32 %newval, i32* %newval.addr, align 4
68 %tmp = load i32* %newval.addr, align 4
69 %0 = call i32 @llvm.atomic.cmp.swap.i32.p0i32(i32* @x, i32 %oldval, i32 %tmp)
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000070 ret i32 %0
71
72; CHECK: AtomicCmpSwap32:
73; CHECK: lw $[[R0:[0-9]+]], %got(x)($gp)
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000074; CHECK: $[[BB0:[A-Z_0-9]+]]:
75; CHECK: ll $2, 0($[[R0]])
76; CHECK: bne $2, $4, $[[BB1:[A-Z_0-9]+]]
Akira Hatanaka70564a92011-07-19 18:14:26 +000077; CHECK: sc $[[R2:[0-9]+]], 0($[[R0]])
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000078; CHECK: beq $[[R2]], $zero, $[[BB0]]
79; CHECK: $[[BB1]]:
80}
81
82
83
84@y = common global i8 0, align 1
85
86define signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind {
87entry:
88 %0 = call i8 @llvm.atomic.load.add.i8.p0i8(i8* @y, i8 %incr)
89 ret i8 %0
90
91; CHECK: AtomicLoadAdd8:
92; CHECK: lw $[[R0:[0-9]+]], %got(y)($gp)
93; CHECK: addiu $[[R1:[0-9]+]], $zero, -4
94; CHECK: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
95; CHECK: andi $[[R3:[0-9]+]], $[[R0]], 3
96; CHECK: sll $[[R4:[0-9]+]], $[[R3]], 3
97; CHECK: ori $[[R5:[0-9]+]], $zero, 255
Akira Hatanakacc7ecc72011-07-19 20:34:00 +000098; CHECK: sllv $[[R6:[0-9]+]], $[[R5]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +000099; CHECK: nor $[[R7:[0-9]+]], $zero, $[[R6]]
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000100; CHECK: sllv $[[R9:[0-9]+]], $4, $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000101
102; CHECK: $[[BB0:[A-Z_0-9]+]]:
103; CHECK: ll $[[R10:[0-9]+]], 0($[[R2]])
104; CHECK: addu $[[R11:[0-9]+]], $[[R10]], $[[R9]]
105; CHECK: and $[[R12:[0-9]+]], $[[R11]], $[[R6]]
106; CHECK: and $[[R13:[0-9]+]], $[[R10]], $[[R7]]
107; CHECK: or $[[R14:[0-9]+]], $[[R13]], $[[R12]]
108; CHECK: sc $[[R14]], 0($[[R2]])
109; CHECK: beq $[[R14]], $zero, $[[BB0]]
110
111; CHECK: and $[[R15:[0-9]+]], $[[R10]], $[[R6]]
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000112; CHECK: srlv $[[R16:[0-9]+]], $[[R15]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000113; CHECK: sll $[[R17:[0-9]+]], $[[R16]], 24
114; CHECK: sra $2, $[[R17]], 24
115}
116
117define signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind {
118entry:
119 %0 = call i8 @llvm.atomic.load.sub.i8.p0i8(i8* @y, i8 %incr)
120 ret i8 %0
121
122; CHECK: AtomicLoadSub8:
123; CHECK: lw $[[R0:[0-9]+]], %got(y)($gp)
124; CHECK: addiu $[[R1:[0-9]+]], $zero, -4
125; CHECK: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
126; CHECK: andi $[[R3:[0-9]+]], $[[R0]], 3
127; CHECK: sll $[[R4:[0-9]+]], $[[R3]], 3
128; CHECK: ori $[[R5:[0-9]+]], $zero, 255
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000129; CHECK: sllv $[[R6:[0-9]+]], $[[R5]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000130; CHECK: nor $[[R7:[0-9]+]], $zero, $[[R6]]
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000131; CHECK: sllv $[[R9:[0-9]+]], $4, $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000132
133; CHECK: $[[BB0:[A-Z_0-9]+]]:
134; CHECK: ll $[[R10:[0-9]+]], 0($[[R2]])
Akira Hatanakaa9211642011-07-18 19:58:59 +0000135; CHECK: subu $[[R11:[0-9]+]], $[[R10]], $[[R9]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000136; CHECK: and $[[R12:[0-9]+]], $[[R11]], $[[R6]]
137; CHECK: and $[[R13:[0-9]+]], $[[R10]], $[[R7]]
138; CHECK: or $[[R14:[0-9]+]], $[[R13]], $[[R12]]
139; CHECK: sc $[[R14]], 0($[[R2]])
140; CHECK: beq $[[R14]], $zero, $[[BB0]]
141
142; CHECK: and $[[R15:[0-9]+]], $[[R10]], $[[R6]]
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000143; CHECK: srlv $[[R16:[0-9]+]], $[[R15]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000144; CHECK: sll $[[R17:[0-9]+]], $[[R16]], 24
145; CHECK: sra $2, $[[R17]], 24
146}
147
148define signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind {
149entry:
150 %0 = call i8 @llvm.atomic.load.nand.i8.p0i8(i8* @y, i8 %incr)
151 ret i8 %0
152
153; CHECK: AtomicLoadNand8:
154; CHECK: lw $[[R0:[0-9]+]], %got(y)($gp)
155; CHECK: addiu $[[R1:[0-9]+]], $zero, -4
156; CHECK: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
157; CHECK: andi $[[R3:[0-9]+]], $[[R0]], 3
158; CHECK: sll $[[R4:[0-9]+]], $[[R3]], 3
159; CHECK: ori $[[R5:[0-9]+]], $zero, 255
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000160; CHECK: sllv $[[R6:[0-9]+]], $[[R5]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000161; CHECK: nor $[[R7:[0-9]+]], $zero, $[[R6]]
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000162; CHECK: sllv $[[R9:[0-9]+]], $4, $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000163
164; CHECK: $[[BB0:[A-Z_0-9]+]]:
165; CHECK: ll $[[R10:[0-9]+]], 0($[[R2]])
166; CHECK: and $[[R18:[0-9]+]], $[[R10]], $[[R9]]
167; CHECK: nor $[[R11:[0-9]+]], $zero, $[[R18]]
168; CHECK: and $[[R12:[0-9]+]], $[[R11]], $[[R6]]
169; CHECK: and $[[R13:[0-9]+]], $[[R10]], $[[R7]]
170; CHECK: or $[[R14:[0-9]+]], $[[R13]], $[[R12]]
171; CHECK: sc $[[R14]], 0($[[R2]])
172; CHECK: beq $[[R14]], $zero, $[[BB0]]
173
174; CHECK: and $[[R15:[0-9]+]], $[[R10]], $[[R6]]
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000175; CHECK: srlv $[[R16:[0-9]+]], $[[R15]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000176; CHECK: sll $[[R17:[0-9]+]], $[[R16]], 24
177; CHECK: sra $2, $[[R17]], 24
178}
179
Akira Hatanaka0d7d0b52011-07-18 18:52:12 +0000180define signext i8 @AtomicSwap8(i8 signext %newval) nounwind {
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000181entry:
Akira Hatanaka0d7d0b52011-07-18 18:52:12 +0000182 %0 = call i8 @llvm.atomic.swap.i8.p0i8(i8* @y, i8 %newval)
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000183 ret i8 %0
184
185; CHECK: AtomicSwap8:
186; CHECK: lw $[[R0:[0-9]+]], %got(y)($gp)
187; CHECK: addiu $[[R1:[0-9]+]], $zero, -4
188; CHECK: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
189; CHECK: andi $[[R3:[0-9]+]], $[[R0]], 3
190; CHECK: sll $[[R4:[0-9]+]], $[[R3]], 3
191; CHECK: ori $[[R5:[0-9]+]], $zero, 255
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000192; CHECK: sllv $[[R6:[0-9]+]], $[[R5]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000193; CHECK: nor $[[R7:[0-9]+]], $zero, $[[R6]]
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000194; CHECK: sllv $[[R9:[0-9]+]], $4, $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000195
196; CHECK: $[[BB0:[A-Z_0-9]+]]:
197; CHECK: ll $[[R10:[0-9]+]], 0($[[R2]])
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000198; CHECK: and $[[R13:[0-9]+]], $[[R10]], $[[R7]]
Akira Hatanaka0d7d0b52011-07-18 18:52:12 +0000199; CHECK: or $[[R14:[0-9]+]], $[[R13]], $[[R9]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000200; CHECK: sc $[[R14]], 0($[[R2]])
201; CHECK: beq $[[R14]], $zero, $[[BB0]]
202
203; CHECK: and $[[R15:[0-9]+]], $[[R10]], $[[R6]]
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000204; CHECK: srlv $[[R16:[0-9]+]], $[[R15]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000205; CHECK: sll $[[R17:[0-9]+]], $[[R16]], 24
206; CHECK: sra $2, $[[R17]], 24
207}
208
209define signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind {
210entry:
211 %0 = call i8 @llvm.atomic.cmp.swap.i8.p0i8(i8* @y, i8 %oldval, i8 %newval)
212 ret i8 %0
213
214; CHECK: AtomicCmpSwap8:
215; CHECK: lw $[[R0:[0-9]+]], %got(y)($gp)
216; CHECK: addiu $[[R1:[0-9]+]], $zero, -4
217; CHECK: and $[[R2:[0-9]+]], $[[R0]], $[[R1]]
218; CHECK: andi $[[R3:[0-9]+]], $[[R0]], 3
219; CHECK: sll $[[R4:[0-9]+]], $[[R3]], 3
220; CHECK: ori $[[R5:[0-9]+]], $zero, 255
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000221; CHECK: sllv $[[R6:[0-9]+]], $[[R5]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000222; CHECK: nor $[[R7:[0-9]+]], $zero, $[[R6]]
223; CHECK: andi $[[R8:[0-9]+]], $4, 255
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000224; CHECK: sllv $[[R9:[0-9]+]], $[[R8]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000225; CHECK: andi $[[R10:[0-9]+]], $5, 255
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000226; CHECK: sllv $[[R11:[0-9]+]], $[[R10]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000227
228; CHECK: $[[BB0:[A-Z_0-9]+]]:
229; CHECK: ll $[[R12:[0-9]+]], 0($[[R2]])
230; CHECK: and $[[R13:[0-9]+]], $[[R12]], $[[R6]]
231; CHECK: bne $[[R13]], $[[R9]], $[[BB1:[A-Z_0-9]+]]
232
233; CHECK: and $[[R14:[0-9]+]], $[[R12]], $[[R7]]
234; CHECK: or $[[R15:[0-9]+]], $[[R14]], $[[R11]]
235; CHECK: sc $[[R15]], 0($[[R2]])
236; CHECK: beq $[[R15]], $zero, $[[BB0]]
237
238; CHECK: $[[BB1]]:
Akira Hatanakacc7ecc72011-07-19 20:34:00 +0000239; CHECK: srlv $[[R16:[0-9]+]], $[[R13]], $[[R4]]
Bruno Cardoso Lopes4e694c92011-05-31 02:54:07 +0000240; CHECK: sll $[[R17:[0-9]+]], $[[R16]], 24
241; CHECK: sra $2, $[[R17]], 24
242}
Akira Hatanakadb548262011-07-19 23:30:50 +0000243
244@countsint = common global i32 0, align 4
245
246define i32 @CheckSync(i32 %v) nounwind noinline {
247entry:
248 tail call void @llvm.memory.barrier(i1 true, i1 true, i1 true, i1 true, i1 true)
249 %0 = tail call i32 @llvm.atomic.load.add.i32.p0i32(i32* @countsint, i32 %v)
250 tail call void @llvm.memory.barrier(i1 true, i1 true, i1 true, i1 true, i1 true)
251 ret i32 %0
252
253; CHECK: CheckSync:
254; CHECK: sync 0
255; CHECK: ll
256; CHECK: sc
257; CHECK: beq
258; CHECK: sync 0
259}
260