blob: b7b34bdfdcd3f937a6bbdb3eb68cc94748b28df5 [file] [log] [blame]
Thomas Livelyd99af232019-02-05 00:49:55 +00001; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+bulk-memory | FileCheck %s --check-prefixes CHECK,BULK-MEM
2; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=-bulk-memory | FileCheck %s --check-prefixes CHECK,NO-BULK-MEM
Thomas Lively88058d42019-01-31 21:02:19 +00003
4; Test that basic bulk memory codegen works correctly
Thomas Lively88058d42019-01-31 21:02:19 +00005
6target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
7target triple = "wasm32-unknown-unknown"
Thomas Livelyd99af232019-02-05 00:49:55 +00008
Thomas Livelyde7a0a12019-02-13 22:11:16 +00009declare void @llvm.memcpy.p0i8.p0i8.i8(i8*, i8*, i8, i1)
10declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i1)
11declare void @llvm.memcpy.p0i32.p0i32.i32(i32*, i32*, i32, i1)
12
13declare void @llvm.memmove.p0i8.p0i8.i8(i8*, i8*, i8, i1)
14declare void @llvm.memmove.p0i8.p0i8.i32(i8*, i8*, i32, i1)
15declare void @llvm.memmove.p0i32.p0i32.i32(i32*, i32*, i32, i1)
16
Thomas Livelybba3f062019-02-13 22:25:18 +000017declare void @llvm.memset.p0i8.i8(i8*, i8, i8, i1)
18declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i1)
19declare void @llvm.memset.p0i32.i32(i32*, i8, i32, i1)
20
Thomas Livelyd99af232019-02-05 00:49:55 +000021; CHECK-LABEL: memcpy_i8:
22; NO-BULK-MEM-NOT: memory.copy
23; BULK-MEM-NEXT: .functype memcpy_i8 (i32, i32, i32) -> ()
Thomas Livelyde7a0a12019-02-13 22:11:16 +000024; BULK-MEM-NEXT: memory.copy 0, 0, $0, $1, $2
Thomas Livelyd99af232019-02-05 00:49:55 +000025; BULK-MEM-NEXT: return
Thomas Livelyde7a0a12019-02-13 22:11:16 +000026define void @memcpy_i8(i8* %dest, i8* %src, i8 zeroext %len) {
27 call void @llvm.memcpy.p0i8.p0i8.i8(i8* %dest, i8* %src, i8 %len, i1 0)
Thomas Livelyd99af232019-02-05 00:49:55 +000028 ret void
29}
30
Thomas Lively31505662019-02-05 20:57:40 +000031; CHECK-LABEL: memmove_i8:
32; NO-BULK-MEM-NOT: memory.copy
33; BULK-MEM-NEXT: .functype memmove_i8 (i32, i32, i32) -> ()
Thomas Livelyde7a0a12019-02-13 22:11:16 +000034; BULK-MEM-NEXT: memory.copy 0, 0, $0, $1, $2
Thomas Lively31505662019-02-05 20:57:40 +000035; BULK-MEM-NEXT: return
Thomas Livelyde7a0a12019-02-13 22:11:16 +000036define void @memmove_i8(i8* %dest, i8* %src, i8 zeroext %len) {
37 call void @llvm.memmove.p0i8.p0i8.i8(i8* %dest, i8* %src, i8 %len, i1 0)
Thomas Lively31505662019-02-05 20:57:40 +000038 ret void
39}
40
Thomas Livelybba3f062019-02-13 22:25:18 +000041; CHECK-LABEL: memset_i8:
42; NO-BULK-MEM-NOT: memory.fill
43; BULK-MEM-NEXT: .functype memset_i8 (i32, i32, i32) -> ()
44; BULK-MEM-NEXT: memory.fill 0, $0, $1, $2
45; BULK-MEM-NEXT: return
46define void @memset_i8(i8* %dest, i8 %val, i8 zeroext %len) {
47 call void @llvm.memset.p0i8.i8(i8* %dest, i8 %val, i8 %len, i1 0)
48 ret void
49}
50
Thomas Livelyd99af232019-02-05 00:49:55 +000051; CHECK-LABEL: memcpy_i32:
52; NO-BULK-MEM-NOT: memory.copy
53; BULK-MEM-NEXT: .functype memcpy_i32 (i32, i32, i32) -> ()
Thomas Livelyde7a0a12019-02-13 22:11:16 +000054; BULK-MEM-NEXT: memory.copy 0, 0, $0, $1, $2
Thomas Livelyd99af232019-02-05 00:49:55 +000055; BULK-MEM-NEXT: return
Thomas Livelyd99af232019-02-05 00:49:55 +000056define void @memcpy_i32(i32* %dest, i32* %src, i32 %len) {
57 call void @llvm.memcpy.p0i32.p0i32.i32(i32* %dest, i32* %src, i32 %len, i1 0)
58 ret void
59}
60
Thomas Lively31505662019-02-05 20:57:40 +000061; CHECK-LABEL: memmove_i32:
62; NO-BULK-MEM-NOT: memory.copy
63; BULK-MEM-NEXT: .functype memmove_i32 (i32, i32, i32) -> ()
Thomas Livelyde7a0a12019-02-13 22:11:16 +000064; BULK-MEM-NEXT: memory.copy 0, 0, $0, $1, $2
Thomas Lively31505662019-02-05 20:57:40 +000065; BULK-MEM-NEXT: return
Thomas Lively31505662019-02-05 20:57:40 +000066define void @memmove_i32(i32* %dest, i32* %src, i32 %len) {
67 call void @llvm.memmove.p0i32.p0i32.i32(i32* %dest, i32* %src, i32 %len, i1 0)
68 ret void
69}
70
Thomas Livelybba3f062019-02-13 22:25:18 +000071; CHECK-LABEL: memset_i32:
72; NO-BULK-MEM-NOT: memory.fill
73; BULK-MEM-NEXT: .functype memset_i32 (i32, i32, i32) -> ()
74; BULK-MEM-NEXT: memory.fill 0, $0, $1, $2
75; BULK-MEM-NEXT: return
76define void @memset_i32(i32* %dest, i8 %val, i32 %len) {
77 call void @llvm.memset.p0i32.i32(i32* %dest, i8 %val, i32 %len, i1 0)
78 ret void
79}
80
Thomas Livelyd99af232019-02-05 00:49:55 +000081; CHECK-LABEL: memcpy_1:
82; CHECK-NEXT: .functype memcpy_1 (i32, i32) -> ()
83; CHECK-NEXT: i32.load8_u $push[[L0:[0-9]+]]=, 0($1)
84; CHECK-NEXT: i32.store8 0($0), $pop[[L0]]
85; CHECK-NEXT: return
86define void @memcpy_1(i8* %dest, i8* %src) {
87 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 1, i1 0)
88 ret void
89}
90
Thomas Lively31505662019-02-05 20:57:40 +000091; CHECK-LABEL: memmove_1:
92; CHECK-NEXT: .functype memmove_1 (i32, i32) -> ()
93; CHECK-NEXT: i32.load8_u $push[[L0:[0-9]+]]=, 0($1)
94; CHECK-NEXT: i32.store8 0($0), $pop[[L0]]
95; CHECK-NEXT: return
96define void @memmove_1(i8* %dest, i8* %src) {
97 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 1, i1 0)
98 ret void
99}
100
Thomas Livelybba3f062019-02-13 22:25:18 +0000101; CHECK-LABEL: memset_1:
102; NO-BULK-MEM-NOT: memory.fill
103; BULK-MEM-NEXT: .functype memset_1 (i32, i32) -> ()
104; BULK-MEM-NEXT: i32.store8 0($0), $1
105; BULK-MEM-NEXT: return
106define void @memset_1(i8* %dest, i8 %val) {
107 call void @llvm.memset.p0i8.i32(i8* %dest, i8 %val, i32 1, i1 0)
108 ret void
109}
110
Thomas Livelyd99af232019-02-05 00:49:55 +0000111; CHECK-LABEL: memcpy_1024:
112; NO-BULK-MEM-NOT: memory.copy
113; BULK-MEM-NEXT: .functype memcpy_1024 (i32, i32) -> ()
114; BULK-MEM-NEXT: i32.const $push[[L0:[0-9]+]]=, 1024
Thomas Livelyde7a0a12019-02-13 22:11:16 +0000115; BULK-MEM-NEXT: memory.copy 0, 0, $0, $1, $pop[[L0]]
Thomas Livelyd99af232019-02-05 00:49:55 +0000116; BULK-MEM-NEXT: return
117define void @memcpy_1024(i8* %dest, i8* %src) {
118 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 1024, i1 0)
119 ret void
120}
Thomas Lively31505662019-02-05 20:57:40 +0000121
122; CHECK-LABEL: memmove_1024:
123; NO-BULK-MEM-NOT: memory.copy
124; BULK-MEM-NEXT: .functype memmove_1024 (i32, i32) -> ()
125; BULK-MEM-NEXT: i32.const $push[[L0:[0-9]+]]=, 1024
Thomas Livelyde7a0a12019-02-13 22:11:16 +0000126; BULK-MEM-NEXT: memory.copy 0, 0, $0, $1, $pop[[L0]]
Thomas Lively31505662019-02-05 20:57:40 +0000127; BULK-MEM-NEXT: return
128define void @memmove_1024(i8* %dest, i8* %src) {
129 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 1024, i1 0)
130 ret void
131}
Thomas Livelybba3f062019-02-13 22:25:18 +0000132
133; CHECK-LABEL: memset_1024:
134; NO-BULK-MEM-NOT: memory.fill
135; BULK-MEM-NEXT: .functype memset_1024 (i32, i32) -> ()
136; BULK-MEM-NEXT: i32.const $push[[L0:[0-9]+]]=, 1024
137; BULK-MEM-NEXT: memory.fill 0, $0, $1, $pop[[L0]]
138; BULK-MEM-NEXT: return
139define void @memset_1024(i8* %dest, i8 %val) {
140 call void @llvm.memset.p0i8.i32(i8* %dest, i8 %val, i32 1024, i1 0)
141 ret void
142}