Skip to content

Commit ced1750

Browse files
tlivelynikic
authored andcommitted
[WebAssembly] Remove unimplemented-simd target feature
Now that the WebAssembly SIMD specification is finalized and engines are generally up-to-date, there is no need for a separate target feature for gating SIMD instructions that engines have not implemented. With this change, v128.const is now enabled by default with the simd128 target feature. Differential Revision: https://reviews.llvm.org/D98457
1 parent 38534f8 commit ced1750

32 files changed

+415
-637
lines changed

clang/docs/ClangCommandLineReference.rst

-1
Original file line numberDiff line numberDiff line change
@@ -3783,4 +3783,3 @@ undef all system defines
37833783
.. option:: -z <arg>
37843784

37853785
Pass -z <arg> to the linker
3786-

clang/include/clang/Basic/BuiltinsWebAssembly.def

+6-6
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,11 @@ TARGET_BUILTIN(__builtin_wasm_shuffle_v8x16, "V16ScV16ScV16ScIiIiIiIiIiIiIiIiIiI
151151
TARGET_BUILTIN(__builtin_wasm_any_true_i8x16, "iV16Sc", "nc", "simd128")
152152
TARGET_BUILTIN(__builtin_wasm_any_true_i16x8, "iV8s", "nc", "simd128")
153153
TARGET_BUILTIN(__builtin_wasm_any_true_i32x4, "iV4i", "nc", "simd128")
154-
TARGET_BUILTIN(__builtin_wasm_any_true_i64x2, "iV2LLi", "nc", "unimplemented-simd128")
154+
TARGET_BUILTIN(__builtin_wasm_any_true_i64x2, "iV2LLi", "nc", "simd128")
155155
TARGET_BUILTIN(__builtin_wasm_all_true_i8x16, "iV16Sc", "nc", "simd128")
156156
TARGET_BUILTIN(__builtin_wasm_all_true_i16x8, "iV8s", "nc", "simd128")
157157
TARGET_BUILTIN(__builtin_wasm_all_true_i32x4, "iV4i", "nc", "simd128")
158-
TARGET_BUILTIN(__builtin_wasm_all_true_i64x2, "iV2LLi", "nc", "unimplemented-simd128")
158+
TARGET_BUILTIN(__builtin_wasm_all_true_i64x2, "iV2LLi", "nc", "simd128")
159159

160160
TARGET_BUILTIN(__builtin_wasm_bitmask_i8x16, "iV16Sc", "nc", "simd128")
161161
TARGET_BUILTIN(__builtin_wasm_bitmask_i16x8, "iV8s", "nc", "simd128")
@@ -188,10 +188,10 @@ TARGET_BUILTIN(__builtin_wasm_dot_s_i32x4_i16x8, "V4iV8sV8s", "nc", "simd128")
188188
TARGET_BUILTIN(__builtin_wasm_sqrt_f32x4, "V4fV4f", "nc", "simd128")
189189
TARGET_BUILTIN(__builtin_wasm_sqrt_f64x2, "V2dV2d", "nc", "simd128")
190190

191-
TARGET_BUILTIN(__builtin_wasm_qfma_f32x4, "V4fV4fV4fV4f", "nc", "unimplemented-simd128")
192-
TARGET_BUILTIN(__builtin_wasm_qfms_f32x4, "V4fV4fV4fV4f", "nc", "unimplemented-simd128")
193-
TARGET_BUILTIN(__builtin_wasm_qfma_f64x2, "V2dV2dV2dV2d", "nc", "unimplemented-simd128")
194-
TARGET_BUILTIN(__builtin_wasm_qfms_f64x2, "V2dV2dV2dV2d", "nc", "unimplemented-simd128")
191+
TARGET_BUILTIN(__builtin_wasm_qfma_f32x4, "V4fV4fV4fV4f", "nc", "simd128")
192+
TARGET_BUILTIN(__builtin_wasm_qfms_f32x4, "V4fV4fV4fV4f", "nc", "simd128")
193+
TARGET_BUILTIN(__builtin_wasm_qfma_f64x2, "V2dV2dV2dV2d", "nc", "simd128")
194+
TARGET_BUILTIN(__builtin_wasm_qfms_f64x2, "V2dV2dV2dV2d", "nc", "simd128")
195195

196196
TARGET_BUILTIN(__builtin_wasm_trunc_saturate_s_i32x4_f32x4, "V4iV4f", "nc", "simd128")
197197
TARGET_BUILTIN(__builtin_wasm_trunc_saturate_u_i32x4_f32x4, "V4iV4f", "nc", "simd128")

clang/include/clang/Driver/Options.td

-2
Original file line numberDiff line numberDiff line change
@@ -2997,8 +2997,6 @@ def mharden_sls_EQ : Joined<["-"], "mharden-sls=">,
29972997
HelpText<"Select straight-line speculation hardening scope">;
29982998

29992999
def msimd128 : Flag<["-"], "msimd128">, Group<m_wasm_Features_Group>;
3000-
def munimplemented_simd128 : Flag<["-"], "munimplemented-simd128">, Group<m_wasm_Features_Group>;
3001-
def mno_unimplemented_simd128 : Flag<["-"], "mno-unimplemented-simd128">, Group<m_wasm_Features_Group>;
30023000
def mno_simd128 : Flag<["-"], "mno-simd128">, Group<m_wasm_Features_Group>;
30033001
def mnontrapping_fptoint : Flag<["-"], "mnontrapping-fptoint">, Group<m_wasm_Features_Group>;
30043002
def mno_nontrapping_fptoint : Flag<["-"], "mno-nontrapping-fptoint">, Group<m_wasm_Features_Group>;

clang/lib/Basic/Targets/WebAssembly.cpp

-19
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ bool WebAssemblyTargetInfo::setABI(const std::string &Name) {
4646
bool WebAssemblyTargetInfo::hasFeature(StringRef Feature) const {
4747
return llvm::StringSwitch<bool>(Feature)
4848
.Case("simd128", SIMDLevel >= SIMD128)
49-
.Case("unimplemented-simd128", SIMDLevel >= UnimplementedSIMD128)
5049
.Case("nontrapping-fptoint", HasNontrappingFPToInt)
5150
.Case("sign-ext", HasSignExt)
5251
.Case("exception-handling", HasExceptionHandling)
@@ -73,8 +72,6 @@ void WebAssemblyTargetInfo::getTargetDefines(const LangOptions &Opts,
7372
defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7473
if (SIMDLevel >= SIMD128)
7574
Builder.defineMacro("__wasm_simd128__");
76-
if (SIMDLevel >= UnimplementedSIMD128)
77-
Builder.defineMacro("__wasm_unimplemented_simd128__");
7875
if (HasNontrappingFPToInt)
7976
Builder.defineMacro("__wasm_nontrapping_fptoint__");
8077
if (HasSignExt)
@@ -99,9 +96,6 @@ void WebAssemblyTargetInfo::setSIMDLevel(llvm::StringMap<bool> &Features,
9996
SIMDEnum Level, bool Enabled) {
10097
if (Enabled) {
10198
switch (Level) {
102-
case UnimplementedSIMD128:
103-
Features["unimplemented-simd128"] = true;
104-
LLVM_FALLTHROUGH;
10599
case SIMD128:
106100
Features["simd128"] = true;
107101
LLVM_FALLTHROUGH;
@@ -115,9 +109,6 @@ void WebAssemblyTargetInfo::setSIMDLevel(llvm::StringMap<bool> &Features,
115109
case NoSIMD:
116110
case SIMD128:
117111
Features["simd128"] = false;
118-
LLVM_FALLTHROUGH;
119-
case UnimplementedSIMD128:
120-
Features["unimplemented-simd128"] = false;
121112
break;
122113
}
123114
}
@@ -127,8 +118,6 @@ void WebAssemblyTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
127118
bool Enabled) const {
128119
if (Name == "simd128")
129120
setSIMDLevel(Features, SIMD128, Enabled);
130-
else if (Name == "unimplemented-simd128")
131-
setSIMDLevel(Features, UnimplementedSIMD128, Enabled);
132121
else
133122
Features[Name] = Enabled;
134123
}
@@ -160,14 +149,6 @@ bool WebAssemblyTargetInfo::handleTargetFeatures(
160149
SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
161150
continue;
162151
}
163-
if (Feature == "+unimplemented-simd128") {
164-
SIMDLevel = std::max(SIMDLevel, SIMDEnum(UnimplementedSIMD128));
165-
continue;
166-
}
167-
if (Feature == "-unimplemented-simd128") {
168-
SIMDLevel = std::min(SIMDLevel, SIMDEnum(UnimplementedSIMD128 - 1));
169-
continue;
170-
}
171152
if (Feature == "+nontrapping-fptoint") {
172153
HasNontrappingFPToInt = true;
173154
continue;

clang/lib/Basic/Targets/WebAssembly.h

-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo {
2727
enum SIMDEnum {
2828
NoSIMD,
2929
SIMD128,
30-
UnimplementedSIMD128,
3130
} SIMDLevel = NoSIMD;
3231

3332
bool HasNontrappingFPToInt = false;

clang/test/CodeGen/builtins-wasm.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// RUN: %clang_cc1 -triple wasm32-unknown-unknown -target-feature +unimplemented-simd128 -target-feature +nontrapping-fptoint -target-feature +exception-handling -target-feature +bulk-memory -target-feature +atomics -flax-vector-conversions=none -O3 -emit-llvm -o - %s | FileCheck %s -check-prefixes WEBASSEMBLY,WEBASSEMBLY32
2-
// RUN: %clang_cc1 -triple wasm64-unknown-unknown -target-feature +unimplemented-simd128 -target-feature +nontrapping-fptoint -target-feature +exception-handling -target-feature +bulk-memory -target-feature +atomics -flax-vector-conversions=none -O3 -emit-llvm -o - %s | FileCheck %s -check-prefixes WEBASSEMBLY,WEBASSEMBLY64
1+
// RUN: %clang_cc1 -triple wasm32-unknown-unknown -target-feature +simd128 -target-feature +nontrapping-fptoint -target-feature +exception-handling -target-feature +bulk-memory -target-feature +atomics -flax-vector-conversions=none -O3 -emit-llvm -o - %s | FileCheck %s -check-prefixes WEBASSEMBLY,WEBASSEMBLY32
2+
// RUN: %clang_cc1 -triple wasm64-unknown-unknown -target-feature +simd128 -target-feature +nontrapping-fptoint -target-feature +exception-handling -target-feature +bulk-memory -target-feature +atomics -flax-vector-conversions=none -O3 -emit-llvm -o - %s | FileCheck %s -check-prefixes WEBASSEMBLY,WEBASSEMBLY64
33
// RUN: not %clang_cc1 -triple wasm64-unknown-unknown -target-feature +nontrapping-fptoint -target-feature +exception-handling -target-feature +bulk-memory -target-feature +atomics -flax-vector-conversions=none -O3 -emit-llvm -o - %s 2>&1 | FileCheck %s -check-prefixes MISSING-SIMD
44

55
// SIMD convenience types

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

-10
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,6 @@
77
//
88
// SIMD128:#define __wasm_simd128__ 1{{$}}
99

10-
// RUN: %clang -E -dM %s -o - 2>&1 \
11-
// RUN: -target wasm32-unknown-unknown -munimplemented-simd128 \
12-
// RUN: | FileCheck %s -check-prefix=SIMD128-UNIMPLEMENTED
13-
// RUN: %clang -E -dM %s -o - 2>&1 \
14-
// RUN: -target wasm64-unknown-unknown -munimplemented-simd128 \
15-
// RUN: | FileCheck %s -check-prefix=SIMD128-UNIMPLEMENTED
16-
//
17-
// SIMD128-UNIMPLEMENTED:#define __wasm_unimplemented_simd128__ 1{{$}}
18-
1910
// RUN: %clang -E -dM %s -o - 2>&1 \
2011
// RUN: -target wasm32-unknown-unknown -mnontrapping-fptoint \
2112
// RUN: | FileCheck %s -check-prefix=NONTRAPPING-FPTOINT
@@ -114,7 +105,6 @@
114105
// RUN: | FileCheck %s -check-prefix=MVP
115106
//
116107
// MVP-NOT:#define __wasm_simd128__
117-
// MVP-NOT:#define __wasm_unimplemented_simd128__
118108
// MVP-NOT:#define __wasm_nontrapping_fptoint__
119109
// MVP-NOT:#define __wasm_sign_ext__
120110
// MVP-NOT:#define __wasm_exception_handling__

llvm/lib/Target/WebAssembly/WebAssembly.td

-6
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,6 @@ include "llvm/Target/Target.td"
2525
def FeatureSIMD128 : SubtargetFeature<"simd128", "SIMDLevel", "SIMD128",
2626
"Enable 128-bit SIMD">;
2727

28-
def FeatureUnimplementedSIMD128 :
29-
SubtargetFeature<"unimplemented-simd128",
30-
"SIMDLevel", "UnimplementedSIMD128",
31-
"Enable 128-bit SIMD not yet implemented in engines",
32-
[FeatureSIMD128]>;
33-
3428
def FeatureAtomics : SubtargetFeature<"atomics", "HasAtomics", "true",
3529
"Enable Atomics">;
3630

llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp

+1-4
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,9 @@ class WebAssemblyFastISel final : public FastISel {
139139
case MVT::v8i16:
140140
case MVT::v4i32:
141141
case MVT::v4f32:
142-
if (Subtarget->hasSIMD128())
143-
return VT;
144-
break;
145142
case MVT::v2i64:
146143
case MVT::v2f64:
147-
if (Subtarget->hasUnimplementedSIMD128())
144+
if (Subtarget->hasSIMD128())
148145
return VT;
149146
break;
150147
default:

llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp

+2-55
Original file line numberDiff line numberDiff line change
@@ -1701,18 +1701,14 @@ SDValue WebAssemblyTargetLowering::LowerBUILD_VECTOR(SDValue Op,
17011701
std::function<bool(size_t, const SDValue &)> IsLaneConstructed;
17021702
SDValue Result;
17031703
// Prefer swizzles over vector consts over splats
1704-
if (NumSwizzleLanes >= NumSplatLanes &&
1705-
(!Subtarget->hasUnimplementedSIMD128() ||
1706-
NumSwizzleLanes >= NumConstantLanes)) {
1704+
if (NumSwizzleLanes >= NumSplatLanes && NumSwizzleLanes >= NumConstantLanes) {
17071705
Result = DAG.getNode(WebAssemblyISD::SWIZZLE, DL, VecT, SwizzleSrc,
17081706
SwizzleIndices);
17091707
auto Swizzled = std::make_pair(SwizzleSrc, SwizzleIndices);
17101708
IsLaneConstructed = [&, Swizzled](size_t I, const SDValue &Lane) {
17111709
return Swizzled == GetSwizzleSrcs(I, Lane);
17121710
};
1713-
} else if (NumConstantLanes >= NumSplatLanes &&
1714-
Subtarget->hasUnimplementedSIMD128()) {
1715-
// If we support v128.const, emit it directly
1711+
} else if (NumConstantLanes >= NumSplatLanes) {
17161712
SmallVector<SDValue, 16> ConstLanes;
17171713
for (const SDValue &Lane : Op->op_values()) {
17181714
if (IsConstant(Lane)) {
@@ -1727,55 +1723,6 @@ SDValue WebAssemblyTargetLowering::LowerBUILD_VECTOR(SDValue Op,
17271723
IsLaneConstructed = [&IsConstant](size_t _, const SDValue &Lane) {
17281724
return IsConstant(Lane);
17291725
};
1730-
} else if (NumConstantLanes >= NumSplatLanes && VecT.isInteger()) {
1731-
// Otherwise, if this is an integer vector, pack the lane values together so
1732-
// we can construct the 128-bit constant from a pair of i64s using a splat
1733-
// followed by at most one i64x2.replace_lane. Also keep track of the lanes
1734-
// that actually matter so we can avoid the replace_lane in more cases.
1735-
std::array<uint64_t, 2> I64s{{0, 0}};
1736-
std::array<uint64_t, 2> ConstLaneMasks{{0, 0}};
1737-
size_t LaneBits = 128 / Lanes;
1738-
size_t HalfLanes = Lanes / 2;
1739-
for (size_t I = 0; I < Lanes; ++I) {
1740-
const SDValue &Lane = Op.getOperand(I);
1741-
if (IsConstant(Lane)) {
1742-
// How much we need to shift Val to position it in an i64
1743-
auto Shift = LaneBits * (I % HalfLanes);
1744-
auto Mask = maskTrailingOnes<uint64_t>(LaneBits);
1745-
auto Val = cast<ConstantSDNode>(Lane.getNode())->getZExtValue() & Mask;
1746-
I64s[I / HalfLanes] |= Val << Shift;
1747-
ConstLaneMasks[I / HalfLanes] |= Mask << Shift;
1748-
}
1749-
}
1750-
// Check whether all constant lanes in the second half of the vector are
1751-
// equivalent in the first half or vice versa to determine whether splatting
1752-
// either side will be sufficient to materialize the constant. As a special
1753-
// case, if the first and second halves have no constant lanes in common, we
1754-
// can just combine them.
1755-
bool FirstHalfSufficient = (I64s[0] & ConstLaneMasks[1]) == I64s[1];
1756-
bool SecondHalfSufficient = (I64s[1] & ConstLaneMasks[0]) == I64s[0];
1757-
bool CombinedSufficient = (ConstLaneMasks[0] & ConstLaneMasks[1]) == 0;
1758-
1759-
uint64_t Splatted;
1760-
if (SecondHalfSufficient) {
1761-
Splatted = I64s[1];
1762-
} else if (CombinedSufficient) {
1763-
Splatted = I64s[0] | I64s[1];
1764-
} else {
1765-
Splatted = I64s[0];
1766-
}
1767-
1768-
Result = DAG.getSplatBuildVector(MVT::v2i64, DL,
1769-
DAG.getConstant(Splatted, DL, MVT::i64));
1770-
if (!FirstHalfSufficient && !SecondHalfSufficient && !CombinedSufficient) {
1771-
Result = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, MVT::v2i64, Result,
1772-
DAG.getConstant(I64s[1], DL, MVT::i64),
1773-
DAG.getConstant(1, DL, MVT::i32));
1774-
}
1775-
Result = DAG.getBitcast(VecT, Result);
1776-
IsLaneConstructed = [&IsConstant](size_t _, const SDValue &Lane) {
1777-
return IsConstant(Lane);
1778-
};
17791726
} else {
17801727
// Use a splat, but possibly a load_splat
17811728
LoadSDNode *SplattedLoad;

llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td

-4
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ def HasSIMD128 :
2626
Predicate<"Subtarget->hasSIMD128()">,
2727
AssemblerPredicate<(all_of FeatureSIMD128), "simd128">;
2828

29-
def HasUnimplementedSIMD128 :
30-
Predicate<"Subtarget->hasUnimplementedSIMD128()">,
31-
AssemblerPredicate<(all_of FeatureUnimplementedSIMD128), "unimplemented-simd128">;
32-
3329
def HasAtomics :
3430
Predicate<"Subtarget->hasAtomics()">,
3531
AssemblerPredicate<(all_of FeatureAtomics), "atomics">;

llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td

+1-2
Original file line numberDiff line numberDiff line change
@@ -404,8 +404,7 @@ defm : StoreLanePatNoOffset<I64x2, int_wasm_store64_lane>;
404404

405405
// Constant: v128.const
406406
multiclass ConstVec<Vec vec, dag ops, dag pat, string args> {
407-
let isMoveImm = 1, isReMaterializable = 1,
408-
Predicates = [HasUnimplementedSIMD128] in
407+
let isMoveImm = 1, isReMaterializable = 1 in
409408
defm CONST_V128_#vec : SIMD_I<(outs V128:$dst), ops, (outs), ops,
410409
[(set V128:$dst, (vec.vt pat))],
411410
"v128.const\t$dst, "#args,

llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h

-4
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo {
3636
enum SIMDEnum {
3737
NoSIMD,
3838
SIMD128,
39-
UnimplementedSIMD128,
4039
} SIMDLevel = NoSIMD;
4140

4241
bool HasAtomics = false;
@@ -90,9 +89,6 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo {
9089
// Predicates used by WebAssemblyInstrInfo.td.
9190
bool hasAddr64() const { return TargetTriple.isArch64Bit(); }
9291
bool hasSIMD128() const { return SIMDLevel >= SIMD128; }
93-
bool hasUnimplementedSIMD128() const {
94-
return SIMDLevel >= UnimplementedSIMD128;
95-
}
9692
bool hasAtomics() const { return HasAtomics; }
9793
bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; }
9894
bool hasSignExt() const { return HasSignExt; }

llvm/test/CodeGen/WebAssembly/simd-arith.ll

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+unimplemented-simd128 | FileCheck %s --check-prefixes CHECK,SIMD128,SIMD128-SLOW
2-
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+unimplemented-simd128 -fast-isel | FileCheck %s --check-prefixes CHECK,SIMD128,SIMD128-FAST
3-
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 | FileCheck %s
4-
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 -fast-isel | FileCheck %s
1+
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 | FileCheck %s --check-prefixes CHECK,SIMD128,SIMD128-SLOW
2+
3+
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 -fast-isel | FileCheck %s --check-prefixes CHECK,SIMD128,SIMD128-FAST
4+
55
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s --check-prefixes CHECK,NO-SIMD128
6+
67
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -fast-isel | FileCheck %s --check-prefixes CHECK,NO-SIMD128
78

89
; check that a non-test run (including explicit locals pass) at least finishes
9-
; RUN: llc < %s -O0 -mattr=+unimplemented-simd128
10-
; RUN: llc < %s -O2 -mattr=+unimplemented-simd128
10+
; RUN: llc < %s -O0 -mattr=+simd128
11+
; RUN: llc < %s -O2 -mattr=+simd128
1112

1213
; Test that basic SIMD128 arithmetic operations assemble as expected.
1314

0 commit comments

Comments
 (0)