Skip to content

Commit 88058d4

Browse files
committed
[WebAssembly] Add bulk memory target feature
Summary: Also clean up some preexisting target feature code. Reviewers: aheejin Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, sunfish, jfb Differential Revision: https://reviews.llvm.org/D57495 llvm-svn: 352793
1 parent 0bed9e0 commit 88058d4

File tree

8 files changed

+113
-27
lines changed

8 files changed

+113
-27
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2155,6 +2155,8 @@ def msign_ext : Flag<["-"], "msign-ext">, Group<m_wasm_Features_Group>;
21552155
def mno_sign_ext : Flag<["-"], "mno-sign-ext">, Group<m_wasm_Features_Group>;
21562156
def mexception_handing : Flag<["-"], "mexception-handling">, Group<m_wasm_Features_Group>;
21572157
def mno_exception_handing : Flag<["-"], "mno-exception-handling">, Group<m_wasm_Features_Group>;
2158+
def mbulk_memory : Flag<["-"], "mbulk-memory">, Group<m_wasm_Features_Group>;
2159+
def mno_bulk_memory : Flag<["-"], "mno-bulk-memory">, Group<m_wasm_Features_Group>;
21582160

21592161
def mamdgpu_debugger_abi : Joined<["-"], "mamdgpu-debugger-abi=">,
21602162
Flags<[HelpHidden]>,

clang/lib/Basic/Targets/WebAssembly.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ bool WebAssemblyTargetInfo::hasFeature(StringRef Feature) const {
4040
.Case("nontrapping-fptoint", HasNontrappingFPToInt)
4141
.Case("sign-ext", HasSignExt)
4242
.Case("exception-handling", HasExceptionHandling)
43+
.Case("bulk-memory", HasBulkMemory)
4344
.Default(false);
4445
}
4546

@@ -59,6 +60,14 @@ void WebAssemblyTargetInfo::getTargetDefines(const LangOptions &Opts,
5960
Builder.defineMacro("__wasm_simd128__");
6061
if (SIMDLevel >= UnimplementedSIMD128)
6162
Builder.defineMacro("__wasm_unimplemented_simd128__");
63+
if (HasNontrappingFPToInt)
64+
Builder.defineMacro("__wasm_nontrapping_fptoint__");
65+
if (HasSignExt)
66+
Builder.defineMacro("__wasm_sign_ext__");
67+
if (HasExceptionHandling)
68+
Builder.defineMacro("__wasm_exception_handling__");
69+
if (HasBulkMemory)
70+
Builder.defineMacro("__wasm_bulk_memory__");
6271
}
6372

6473
void WebAssemblyTargetInfo::setSIMDLevel(llvm::StringMap<bool> &Features,
@@ -93,6 +102,8 @@ bool WebAssemblyTargetInfo::initFeatureMap(
93102
Features["sign-ext"] = true;
94103
if (HasExceptionHandling)
95104
Features["exception-handling"] = true;
105+
if (HasBulkMemory)
106+
Features["bulk-memory"] = true;
96107

97108
return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
98109
}
@@ -140,6 +151,14 @@ bool WebAssemblyTargetInfo::handleTargetFeatures(
140151
HasExceptionHandling = false;
141152
continue;
142153
}
154+
if (Feature == "+bulk-memory") {
155+
HasBulkMemory = true;
156+
continue;
157+
}
158+
if (Feature == "-bulk-memory") {
159+
HasBulkMemory = false;
160+
continue;
161+
}
143162

144163
Diags.Report(diag::err_opt_not_valid_with_opt)
145164
<< Feature << "-target-feature";

clang/lib/Basic/Targets/WebAssembly.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo {
3030
UnimplementedSIMD128,
3131
} SIMDLevel = NoSIMD;
3232

33-
bool HasNontrappingFPToInt;
34-
bool HasSignExt;
35-
bool HasExceptionHandling;
33+
bool HasNontrappingFPToInt = false;
34+
bool HasSignExt = false;
35+
bool HasExceptionHandling = false;
36+
bool HasBulkMemory = false;
3637

3738
public:
3839
explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
39-
: TargetInfo(T), SIMDLevel(NoSIMD), HasNontrappingFPToInt(false),
40-
HasSignExt(false), HasExceptionHandling(false) {
40+
: TargetInfo(T) {
4141
NoAsmVariants = true;
4242
SuitableAlign = 128;
4343
LargeArrayMinWidth = 128;

clang/test/Preprocessor/wasm-target-features.c

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,72 @@
1717
// SIMD128-UNIMPLEMENTED:#define __wasm_unimplemented_simd128__ 1{{$}}
1818
//
1919
// RUN: %clang -E -dM %s -o - 2>&1 \
20+
// RUN: -target wasm32-unknown-unknown -mnontrapping-fptoint \
21+
// RUN: | FileCheck %s -check-prefix=NONTRAPPING-FPTOINT
22+
// RUN: %clang -E -dM %s -o - 2>&1 \
23+
// RUN: -target wasm64-unknown-unknown -mnontrapping-fptoint \
24+
// RUN: | FileCheck %s -check-prefix=NONTRAPPING-FPTOINT
25+
//
26+
// NONTRAPPING-FPTOINT:#define __wasm_nontrapping_fptoint__ 1{{$}}
27+
//
28+
// RUN: %clang -E -dM %s -o - 2>&1 \
29+
// RUN: -target wasm32-unknown-unknown -msign-ext \
30+
// RUN: | FileCheck %s -check-prefix=SIGN-EXT
31+
// RUN: %clang -E -dM %s -o - 2>&1 \
32+
// RUN: -target wasm64-unknown-unknown -msign-ext \
33+
// RUN: | FileCheck %s -check-prefix=SIGN-EXT
34+
//
35+
// SIGN-EXT:#define __wasm_sign_ext__ 1{{$}}
36+
//
37+
// RUN: %clang -E -dM %s -o - 2>&1 \
38+
// RUN: -target wasm32-unknown-unknown -mexception-handling \
39+
// RUN: | FileCheck %s -check-prefix=EXCEPTION-HANDLING
40+
// RUN: %clang -E -dM %s -o - 2>&1 \
41+
// RUN: -target wasm64-unknown-unknown -mexception-handling \
42+
// RUN: | FileCheck %s -check-prefix=EXCEPTION-HANDLING
43+
//
44+
// EXCEPTION-HANDLING:#define __wasm_exception_handling__ 1{{$}}
45+
//
46+
// RUN: %clang -E -dM %s -o - 2>&1 \
47+
// RUN: -target wasm32-unknown-unknown -mbulk-memory \
48+
// RUN: | FileCheck %s -check-prefix=BULK-MEMORY
49+
// RUN: %clang -E -dM %s -o - 2>&1 \
50+
// RUN: -target wasm64-unknown-unknown -mbulk-memory \
51+
// RUN: | FileCheck %s -check-prefix=BULK-MEMORY
52+
//
53+
// BULK-MEMORY:#define __wasm_bulk_memory__ 1{{$}}
54+
//
55+
// RUN: %clang -E -dM %s -o - 2>&1 \
2056
// RUN: -target wasm32-unknown-unknown -mcpu=mvp \
2157
// RUN: | FileCheck %s -check-prefix=MVP
2258
// RUN: %clang -E -dM %s -o - 2>&1 \
2359
// RUN: -target wasm64-unknown-unknown -mcpu=mvp \
2460
// RUN: | FileCheck %s -check-prefix=MVP
2561
//
2662
// MVP-NOT:#define __wasm_simd128__
63+
// MVP-NOT:#define __wasm_unimplemented_simd128__
64+
// MVP-NOT:#define __wasm_nontrapping_fptoint__
65+
// MVP-NOT:#define __wasm_sign_ext__
66+
// MVP-NOT:#define __wasm_exception_handling__
67+
// MVP-NOT:#define __wasm_bulk_memory__
2768
//
2869
// RUN: %clang -E -dM %s -o - 2>&1 \
2970
// RUN: -target wasm32-unknown-unknown -mcpu=bleeding-edge \
30-
// RUN: | FileCheck %s -check-prefix=BLEEDING_EDGE
71+
// RUN: | FileCheck %s -check-prefix=BLEEDING-EDGE
3172
// RUN: %clang -E -dM %s -o - 2>&1 \
3273
// RUN: -target wasm64-unknown-unknown -mcpu=bleeding-edge \
33-
// RUN: | FileCheck %s -check-prefix=BLEEDING_EDGE
74+
// RUN: | FileCheck %s -check-prefix=BLEEDING-EDGE
3475
//
35-
// BLEEDING_EDGE:#define __wasm_simd128__ 1{{$}}
76+
// BLEEDING-EDGE:#define __wasm_nontrapping_fptoint__ 1{{$}}
77+
// BLEEDING-EDGE:#define __wasm_sign_ext__ 1{{$}}
78+
// BLEEDING-EDGE:#define __wasm_simd128__ 1{{$}}
79+
// BLEEDING-EDGE-NOT:#define __wasm_unimplemented_simd128__ 1{{$}}
3680
//
3781
// RUN: %clang -E -dM %s -o - 2>&1 \
3882
// RUN: -target wasm32-unknown-unknown -mcpu=bleeding-edge -mno-simd128 \
39-
// RUN: | FileCheck %s -check-prefix=BLEEDING_EDGE_NO_SIMD128
83+
// RUN: | FileCheck %s -check-prefix=BLEEDING-EDGE-NO-SIMD128
4084
// RUN: %clang -E -dM %s -o - 2>&1 \
4185
// RUN: -target wasm64-unknown-unknown -mcpu=bleeding-edge -mno-simd128 \
42-
// RUN: | FileCheck %s -check-prefix=BLEEDING_EDGE_NO_SIMD128
86+
// RUN: | FileCheck %s -check-prefix=BLEEDING-EDGE-NO-SIMD128
4387
//
44-
// BLEEDING_EDGE_NO_SIMD128-NOT:#define __wasm_simd128__
88+
// BLEEDING-EDGE-NO-SIMD128-NOT:#define __wasm_simd128__

llvm/lib/Target/WebAssembly/WebAssembly.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ def FeatureExceptionHandling :
4747
SubtargetFeature<"exception-handling", "HasExceptionHandling", "true",
4848
"Enable Wasm exception handling">;
4949

50+
def FeatureBulkMemory :
51+
SubtargetFeature<"bulk-memory", "HasBulkMemory", "true",
52+
"Enable bulk memory operations">;
53+
5054
//===----------------------------------------------------------------------===//
5155
// Architectures.
5256
//===----------------------------------------------------------------------===//

llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,40 +16,48 @@
1616
//===----------------------------------------------------------------------===//
1717

1818
def HasAddr32 : Predicate<"!Subtarget->hasAddr64()">;
19+
1920
def HasAddr64 : Predicate<"Subtarget->hasAddr64()">;
20-
def HasSIMD128 : Predicate<"Subtarget->hasSIMD128()">,
21-
AssemblerPredicate<"FeatureSIMD128", "simd128">;
21+
22+
def HasSIMD128 :
23+
Predicate<"Subtarget->hasSIMD128()">,
24+
AssemblerPredicate<"FeatureSIMD128", "simd128">;
25+
2226
def HasUnimplementedSIMD128 :
2327
Predicate<"Subtarget->hasUnimplementedSIMD128()">,
2428
AssemblerPredicate<"FeatureUnimplementedSIMD128", "unimplemented-simd128">;
25-
def HasAtomics : Predicate<"Subtarget->hasAtomics()">,
26-
AssemblerPredicate<"FeatureAtomics", "atomics">;
29+
30+
def HasAtomics :
31+
Predicate<"Subtarget->hasAtomics()">,
32+
AssemblerPredicate<"FeatureAtomics", "atomics">;
33+
2734
def HasNontrappingFPToInt :
2835
Predicate<"Subtarget->hasNontrappingFPToInt()">,
29-
AssemblerPredicate<"FeatureNontrappingFPToInt",
30-
"nontrapping-fptoint">;
36+
AssemblerPredicate<"FeatureNontrappingFPToInt", "nontrapping-fptoint">;
37+
3138
def NotHasNontrappingFPToInt :
3239
Predicate<"!Subtarget->hasNontrappingFPToInt()">,
33-
AssemblerPredicate<"!FeatureNontrappingFPToInt",
34-
"nontrapping-fptoint">;
40+
AssemblerPredicate<"!FeatureNontrappingFPToInt", "nontrapping-fptoint">;
41+
3542
def HasSignExt :
3643
Predicate<"Subtarget->hasSignExt()">,
37-
AssemblerPredicate<"FeatureSignExt",
38-
"sign-ext">;
44+
AssemblerPredicate<"FeatureSignExt", "sign-ext">;
45+
3946
def NotHasSignExt :
4047
Predicate<"!Subtarget->hasSignExt()">,
41-
AssemblerPredicate<"!FeatureSignExt",
42-
"sign-ext">;
48+
AssemblerPredicate<"!FeatureSignExt", "sign-ext">;
4349

4450
def HasExceptionHandling :
4551
Predicate<"Subtarget->hasExceptionHandling()">,
46-
AssemblerPredicate<"FeatureExceptionHandling",
47-
"exception-handling">;
52+
AssemblerPredicate<"FeatureExceptionHandling", "exception-handling">;
4853

4954
def NotHasExceptionHandling :
5055
Predicate<"!Subtarget->hasExceptionHandling()">,
51-
AssemblerPredicate<"!FeatureExceptionHandling",
52-
"exception-handling">;
56+
AssemblerPredicate<"!FeatureExceptionHandling", "exception-handling">;
57+
58+
def HasBulkMemory :
59+
Predicate<"Subtarget->hasBulkMemory()">,
60+
AssemblerPredicate<"FeatureBulkMemory", "bulk-memory">;
5361

5462
//===----------------------------------------------------------------------===//
5563
// WebAssembly-specific DAG Node Types.

llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo {
3838
bool HasNontrappingFPToInt = false;
3939
bool HasSignExt = false;
4040
bool HasExceptionHandling = false;
41+
bool HasBulkMemory = false;
4142

4243
/// String name of used CPU.
4344
std::string CPUString;
@@ -89,6 +90,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo {
8990
bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; }
9091
bool hasSignExt() const { return HasSignExt; }
9192
bool hasExceptionHandling() const { return HasExceptionHandling; }
93+
bool hasBulkMemory() const { return HasBulkMemory; }
9294

9395
/// Parses features string setting specified subtarget options. Definition of
9496
/// function is auto generated by tblgen.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+bulk-memory
2+
3+
; Test that basic bulk memory codegen works correctly
4+
; TODO: implement basic bulk memory codegen
5+
6+
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
7+
target triple = "wasm32-unknown-unknown"

0 commit comments

Comments
 (0)