blob: cff7fc7faf6d544e05060139a2a16f05df4451da [file] [log] [blame]
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +00001; RUN: llc < %s -mattr=+atomics -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s
Dan Gohmanbb372242016-01-26 03:39:31 +00002
3; Test loads and stores with custom alignment values.
4
5target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
Sam Clegga5908002018-05-10 17:49:11 +00006target triple = "wasm32-unknown-unknown"
Dan Gohmanbb372242016-01-26 03:39:31 +00007
Heejin Ahnd31bc982018-07-09 20:18:21 +00008;===----------------------------------------------------------------------------
9; Loads
10;===----------------------------------------------------------------------------
Heejin Ahn402b4902018-07-02 21:22:59 +000011
Dan Gohmanbb372242016-01-26 03:39:31 +000012; CHECK-LABEL: ldi32_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000013; CHECK-NEXT: .functype ldi32_a1 (i32) -> (i32){{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +000014; CHECK-NEXT: i32.load $push[[NUM:[0-9]+]]=, 0($0):p2align=0{{$}}
15; CHECK-NEXT: return $pop[[NUM]]{{$}}
16define i32 @ldi32_a1(i32 *%p) {
17 %v = load i32, i32* %p, align 1
18 ret i32 %v
19}
20
21; CHECK-LABEL: ldi32_a2:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000022; CHECK-NEXT: .functype ldi32_a2 (i32) -> (i32){{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +000023; CHECK-NEXT: i32.load $push[[NUM:[0-9]+]]=, 0($0):p2align=1{{$}}
24; CHECK-NEXT: return $pop[[NUM]]{{$}}
25define i32 @ldi32_a2(i32 *%p) {
26 %v = load i32, i32* %p, align 2
27 ret i32 %v
28}
29
30; 4 is the default alignment for i32 so no attribute is needed.
31
32; CHECK-LABEL: ldi32_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000033; CHECK-NEXT: .functype ldi32_a4 (i32) -> (i32){{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +000034; CHECK-NEXT: i32.load $push[[NUM:[0-9]+]]=, 0($0){{$}}
35; CHECK-NEXT: return $pop[[NUM]]{{$}}
36define i32 @ldi32_a4(i32 *%p) {
37 %v = load i32, i32* %p, align 4
38 ret i32 %v
39}
40
Nico Weberb61910b2019-01-09 14:20:20 +000041; The default alignment in LLVM is the same as the default alignment in wasm.
Dan Gohmanbb372242016-01-26 03:39:31 +000042
43; CHECK-LABEL: ldi32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000044; CHECK-NEXT: .functype ldi32 (i32) -> (i32){{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +000045; CHECK-NEXT: i32.load $push[[NUM:[0-9]+]]=, 0($0){{$}}
46; CHECK-NEXT: return $pop[[NUM]]{{$}}
47define i32 @ldi32(i32 *%p) {
48 %v = load i32, i32* %p
49 ret i32 %v
50}
51
Dan Gohman04e7fb72016-04-21 23:59:48 +000052; 8 is greater than the default alignment so it is ignored.
53
Dan Gohmanbb372242016-01-26 03:39:31 +000054; CHECK-LABEL: ldi32_a8:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000055; CHECK-NEXT: .functype ldi32_a8 (i32) -> (i32){{$}}
Dan Gohman04e7fb72016-04-21 23:59:48 +000056; CHECK-NEXT: i32.load $push[[NUM:[0-9]+]]=, 0($0){{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +000057; CHECK-NEXT: return $pop[[NUM]]{{$}}
58define i32 @ldi32_a8(i32 *%p) {
59 %v = load i32, i32* %p, align 8
60 ret i32 %v
61}
62
Heejin Ahnd31bc982018-07-09 20:18:21 +000063;===----------------------------------------------------------------------------
64; Extending loads
65;===----------------------------------------------------------------------------
Dan Gohmanbb372242016-01-26 03:39:31 +000066
67; CHECK-LABEL: ldi8_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000068; CHECK-NEXT: .functype ldi8_a1 (i32) -> (i32){{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +000069; CHECK-NEXT: i32.load8_u $push[[NUM:[0-9]+]]=, 0($0){{$}}
70; CHECK-NEXT: return $pop[[NUM]]{{$}}
71define i8 @ldi8_a1(i8 *%p) {
72 %v = load i8, i8* %p, align 1
73 ret i8 %v
74}
75
76; CHECK-LABEL: ldi8_a2:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000077; CHECK-NEXT: .functype ldi8_a2 (i32) -> (i32){{$}}
Dan Gohman04e7fb72016-04-21 23:59:48 +000078; CHECK-NEXT: i32.load8_u $push[[NUM:[0-9]+]]=, 0($0){{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +000079; CHECK-NEXT: return $pop[[NUM]]{{$}}
80define i8 @ldi8_a2(i8 *%p) {
81 %v = load i8, i8* %p, align 2
82 ret i8 %v
83}
84
85; CHECK-LABEL: ldi16_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000086; CHECK-NEXT: .functype ldi16_a1 (i32) -> (i32){{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +000087; CHECK-NEXT: i32.load16_u $push[[NUM:[0-9]+]]=, 0($0):p2align=0{{$}}
88; CHECK-NEXT: return $pop[[NUM]]{{$}}
89define i16 @ldi16_a1(i16 *%p) {
90 %v = load i16, i16* %p, align 1
91 ret i16 %v
92}
93
94; CHECK-LABEL: ldi16_a2:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000095; CHECK-NEXT: .functype ldi16_a2 (i32) -> (i32){{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +000096; CHECK-NEXT: i32.load16_u $push[[NUM:[0-9]+]]=, 0($0){{$}}
97; CHECK-NEXT: return $pop[[NUM]]{{$}}
98define i16 @ldi16_a2(i16 *%p) {
99 %v = load i16, i16* %p, align 2
100 ret i16 %v
101}
102
103; CHECK-LABEL: ldi16_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000104; CHECK-NEXT: .functype ldi16_a4 (i32) -> (i32){{$}}
Dan Gohman04e7fb72016-04-21 23:59:48 +0000105; CHECK-NEXT: i32.load16_u $push[[NUM:[0-9]+]]=, 0($0){{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +0000106; CHECK-NEXT: return $pop[[NUM]]{{$}}
107define i16 @ldi16_a4(i16 *%p) {
108 %v = load i16, i16* %p, align 4
109 ret i16 %v
110}
111
Heejin Ahnd31bc982018-07-09 20:18:21 +0000112;===----------------------------------------------------------------------------
113; Stores
114;===----------------------------------------------------------------------------
Dan Gohmanbb372242016-01-26 03:39:31 +0000115
116; CHECK-LABEL: sti32_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000117; CHECK-NEXT: .functype sti32_a1 (i32, i32) -> (){{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000118; CHECK-NEXT: i32.store 0($0):p2align=0, $1{{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +0000119; CHECK-NEXT: return{{$}}
120define void @sti32_a1(i32 *%p, i32 %v) {
121 store i32 %v, i32* %p, align 1
122 ret void
123}
124
125; CHECK-LABEL: sti32_a2:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000126; CHECK-NEXT: .functype sti32_a2 (i32, i32) -> (){{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000127; CHECK-NEXT: i32.store 0($0):p2align=1, $1{{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +0000128; CHECK-NEXT: return{{$}}
129define void @sti32_a2(i32 *%p, i32 %v) {
130 store i32 %v, i32* %p, align 2
131 ret void
132}
133
134; 4 is the default alignment for i32 so no attribute is needed.
135
136; CHECK-LABEL: sti32_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000137; CHECK-NEXT: .functype sti32_a4 (i32, i32) -> (){{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000138; CHECK-NEXT: i32.store 0($0), $1{{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +0000139; CHECK-NEXT: return{{$}}
140define void @sti32_a4(i32 *%p, i32 %v) {
141 store i32 %v, i32* %p, align 4
142 ret void
143}
144
Nico Weberb61910b2019-01-09 14:20:20 +0000145; The default alignment in LLVM is the same as the default alignment in wasm.
Dan Gohmanbb372242016-01-26 03:39:31 +0000146
147; CHECK-LABEL: sti32:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000148; CHECK-NEXT: .functype sti32 (i32, i32) -> (){{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000149; CHECK-NEXT: i32.store 0($0), $1{{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +0000150; CHECK-NEXT: return{{$}}
151define void @sti32(i32 *%p, i32 %v) {
152 store i32 %v, i32* %p
153 ret void
154}
155
156; CHECK-LABEL: sti32_a8:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000157; CHECK-NEXT: .functype sti32_a8 (i32, i32) -> (){{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000158; CHECK-NEXT: i32.store 0($0), $1{{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +0000159; CHECK-NEXT: return{{$}}
160define void @sti32_a8(i32 *%p, i32 %v) {
161 store i32 %v, i32* %p, align 8
162 ret void
163}
164
Heejin Ahnd31bc982018-07-09 20:18:21 +0000165;===----------------------------------------------------------------------------
166; Truncating stores
167;===----------------------------------------------------------------------------
Dan Gohmanbb372242016-01-26 03:39:31 +0000168
169; CHECK-LABEL: sti8_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000170; CHECK-NEXT: .functype sti8_a1 (i32, i32) -> (){{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000171; CHECK-NEXT: i32.store8 0($0), $1{{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +0000172; CHECK-NEXT: return{{$}}
173define void @sti8_a1(i8 *%p, i8 %v) {
174 store i8 %v, i8* %p, align 1
175 ret void
176}
177
178; CHECK-LABEL: sti8_a2:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000179; CHECK-NEXT: .functype sti8_a2 (i32, i32) -> (){{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000180; CHECK-NEXT: i32.store8 0($0), $1{{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +0000181; CHECK-NEXT: return{{$}}
182define void @sti8_a2(i8 *%p, i8 %v) {
183 store i8 %v, i8* %p, align 2
184 ret void
185}
186
187; CHECK-LABEL: sti16_a1:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000188; CHECK-NEXT: .functype sti16_a1 (i32, i32) -> (){{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000189; CHECK-NEXT: i32.store16 0($0):p2align=0, $1{{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +0000190; CHECK-NEXT: return{{$}}
191define void @sti16_a1(i16 *%p, i16 %v) {
192 store i16 %v, i16* %p, align 1
193 ret void
194}
195
196; CHECK-LABEL: sti16_a2:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000197; CHECK-NEXT: .functype sti16_a2 (i32, i32) -> (){{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000198; CHECK-NEXT: i32.store16 0($0), $1{{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +0000199; CHECK-NEXT: return{{$}}
200define void @sti16_a2(i16 *%p, i16 %v) {
201 store i16 %v, i16* %p, align 2
202 ret void
203}
204
205; CHECK-LABEL: sti16_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000206; CHECK-NEXT: .functype sti16_a4 (i32, i32) -> (){{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000207; CHECK-NEXT: i32.store16 0($0), $1{{$}}
Dan Gohmanbb372242016-01-26 03:39:31 +0000208; CHECK-NEXT: return{{$}}
209define void @sti16_a4(i16 *%p, i16 %v) {
210 store i16 %v, i16* %p, align 4
211 ret void
212}
Derek Schuff885dc592017-10-05 21:18:42 +0000213
Heejin Ahnd31bc982018-07-09 20:18:21 +0000214;===----------------------------------------------------------------------------
215; Atomic loads
216;===----------------------------------------------------------------------------
217
218; Wasm atomics have the alignment field, but it must always have the type's
219; natural alignment.
Derek Schuff885dc592017-10-05 21:18:42 +0000220
221; CHECK-LABEL: ldi32_atomic_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000222; CHECK-NEXT: .functype ldi32_atomic_a4 (i32) -> (i32){{$}}
Derek Schuff885dc592017-10-05 21:18:42 +0000223; CHECK-NEXT: i32.atomic.load $push[[NUM:[0-9]+]]=, 0($0){{$}}
224; CHECK-NEXT: return $pop[[NUM]]{{$}}
225define i32 @ldi32_atomic_a4(i32 *%p) {
226 %v = load atomic i32, i32* %p seq_cst, align 4
227 ret i32 %v
228}
229
Heejin Ahnd31bc982018-07-09 20:18:21 +0000230; 8 is greater than the default alignment so it is ignored.
Derek Schuff885dc592017-10-05 21:18:42 +0000231
232; CHECK-LABEL: ldi32_atomic_a8:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000233; CHECK-NEXT: .functype ldi32_atomic_a8 (i32) -> (i32){{$}}
Derek Schuff885dc592017-10-05 21:18:42 +0000234; CHECK-NEXT: i32.atomic.load $push[[NUM:[0-9]+]]=, 0($0){{$}}
235; CHECK-NEXT: return $pop[[NUM]]{{$}}
236define i32 @ldi32_atomic_a8(i32 *%p) {
237 %v = load atomic i32, i32* %p seq_cst, align 8
238 ret i32 %v
239}
Heejin Ahn402b4902018-07-02 21:22:59 +0000240
Heejin Ahnd31bc982018-07-09 20:18:21 +0000241;===----------------------------------------------------------------------------
242; Atomic stores
243;===----------------------------------------------------------------------------
244
Heejin Ahn402b4902018-07-02 21:22:59 +0000245; CHECK-LABEL: sti32_atomic_a4:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000246; CHECK-NEXT: .functype sti32_atomic_a4 (i32, i32) -> (){{$}}
Heejin Ahn402b4902018-07-02 21:22:59 +0000247; CHECK-NEXT: i32.atomic.store 0($0), $1{{$}}
248; CHECK-NEXT: return{{$}}
249define void @sti32_atomic_a4(i32 *%p, i32 %v) {
250 store atomic i32 %v, i32* %p seq_cst, align 4
251 ret void
252}
253
Heejin Ahnd31bc982018-07-09 20:18:21 +0000254; 8 is greater than the default alignment so it is ignored.
255
Heejin Ahn402b4902018-07-02 21:22:59 +0000256; CHECK-LABEL: sti32_atomic_a8:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000257; CHECK-NEXT: .functype sti32_atomic_a8 (i32, i32) -> (){{$}}
Heejin Ahn402b4902018-07-02 21:22:59 +0000258; CHECK-NEXT: i32.atomic.store 0($0), $1{{$}}
259; CHECK-NEXT: return{{$}}
260define void @sti32_atomic_a8(i32 *%p, i32 %v) {
261 store atomic i32 %v, i32* %p seq_cst, align 8
262 ret void
263}