forked from OSchip/llvm-project
[WebAssembly] Add simd128-unimplemented subtarget feature
This is a second attempt at r350778, which was reverted in r350789. The only change is that the unimplemented-simd128 feature has been renamed simd128-unimplemented, since naming it unimplemented-simd128 somehow made the simd128 feature flag enable the unimplemented-simd128 feature on Windows. llvm-svn: 350791
This commit is contained in:
parent
4d9ecaa8d7
commit
eb6f9abd41
|
@ -25,6 +25,13 @@ include "llvm/Target/Target.td"
|
|||
|
||||
def FeatureSIMD128 : SubtargetFeature<"simd128", "HasSIMD128", "true",
|
||||
"Enable 128-bit SIMD">;
|
||||
|
||||
def FeatureSIMD128Unimplemented :
|
||||
SubtargetFeature<"simd128-unimplemented",
|
||||
"HasSIMD128Unimplemented", "true",
|
||||
"Enable 128-bit SIMD not yet implemented in engines",
|
||||
[FeatureSIMD128]>;
|
||||
|
||||
def FeatureAtomics : SubtargetFeature<"atomics", "HasAtomics", "true",
|
||||
"Enable Atomics">;
|
||||
def FeatureNontrappingFPToInt :
|
||||
|
|
|
@ -44,8 +44,6 @@ using namespace PatternMatch;
|
|||
|
||||
#define DEBUG_TYPE "wasm-fastisel"
|
||||
|
||||
extern cl::opt<bool> EnableUnimplementedWasmSIMDInstrs;
|
||||
|
||||
namespace {
|
||||
|
||||
class WebAssemblyFastISel final : public FastISel {
|
||||
|
@ -145,7 +143,7 @@ private:
|
|||
break;
|
||||
case MVT::v2i64:
|
||||
case MVT::v2f64:
|
||||
if (Subtarget->hasSIMD128() && EnableUnimplementedWasmSIMDInstrs)
|
||||
if (Subtarget->hasSIMD128Unimplemented())
|
||||
return VT;
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -25,8 +25,6 @@ using namespace llvm;
|
|||
|
||||
#define DEBUG_TYPE "wasm-isel"
|
||||
|
||||
extern cl::opt<bool> EnableUnimplementedWasmSIMDInstrs;
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
/// WebAssembly-specific code to select WebAssembly machine instructions for
|
||||
/// SelectionDAG operations.
|
||||
|
|
|
@ -37,12 +37,6 @@ using namespace llvm;
|
|||
|
||||
#define DEBUG_TYPE "wasm-lower"
|
||||
|
||||
// Emit proposed instructions that may not have been implemented in engines
|
||||
cl::opt<bool> EnableUnimplementedWasmSIMDInstrs(
|
||||
"wasm-enable-unimplemented-simd",
|
||||
cl::desc("Emit potentially-unimplemented WebAssembly SIMD instructions"),
|
||||
cl::init(false));
|
||||
|
||||
WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
||||
const TargetMachine &TM, const WebAssemblySubtarget &STI)
|
||||
: TargetLowering(TM), Subtarget(&STI) {
|
||||
|
@ -70,7 +64,7 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
|||
addRegisterClass(MVT::v8i16, &WebAssembly::V128RegClass);
|
||||
addRegisterClass(MVT::v4i32, &WebAssembly::V128RegClass);
|
||||
addRegisterClass(MVT::v4f32, &WebAssembly::V128RegClass);
|
||||
if (EnableUnimplementedWasmSIMDInstrs) {
|
||||
if (Subtarget->hasSIMD128Unimplemented()) {
|
||||
addRegisterClass(MVT::v2i64, &WebAssembly::V128RegClass);
|
||||
addRegisterClass(MVT::v2f64, &WebAssembly::V128RegClass);
|
||||
}
|
||||
|
@ -135,7 +129,7 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
|||
for (auto T : {MVT::v16i8, MVT::v8i16, MVT::v4i32}) {
|
||||
setOperationAction(Op, T, Expand);
|
||||
}
|
||||
if (EnableUnimplementedWasmSIMDInstrs) {
|
||||
if (Subtarget->hasSIMD128Unimplemented()) {
|
||||
setOperationAction(Op, MVT::v2i64, Expand);
|
||||
}
|
||||
}
|
||||
|
@ -149,7 +143,7 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
|||
for (auto T : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v4f32}) {
|
||||
setOperationAction(ISD::VECTOR_SHUFFLE, T, Custom);
|
||||
}
|
||||
if (EnableUnimplementedWasmSIMDInstrs) {
|
||||
if (Subtarget->hasSIMD128Unimplemented()) {
|
||||
setOperationAction(ISD::VECTOR_SHUFFLE, MVT::v2i64, Custom);
|
||||
setOperationAction(ISD::VECTOR_SHUFFLE, MVT::v2f64, Custom);
|
||||
}
|
||||
|
@ -160,7 +154,7 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
|||
for (auto T : {MVT::v16i8, MVT::v8i16, MVT::v4i32})
|
||||
for (auto Op : {ISD::SHL, ISD::SRA, ISD::SRL})
|
||||
setOperationAction(Op, T, Custom);
|
||||
if (EnableUnimplementedWasmSIMDInstrs)
|
||||
if (Subtarget->hasSIMD128Unimplemented())
|
||||
for (auto Op : {ISD::SHL, ISD::SRA, ISD::SRL})
|
||||
setOperationAction(Op, MVT::v2i64, Custom);
|
||||
}
|
||||
|
@ -170,7 +164,7 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
|||
for (auto Op : {ISD::VSELECT, ISD::SELECT_CC, ISD::SELECT}) {
|
||||
for (auto T : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v4f32})
|
||||
setOperationAction(Op, T, Expand);
|
||||
if (EnableUnimplementedWasmSIMDInstrs)
|
||||
if (Subtarget->hasSIMD128Unimplemented())
|
||||
for (auto T : {MVT::v2i64, MVT::v2f64})
|
||||
setOperationAction(Op, T, Expand);
|
||||
}
|
||||
|
@ -179,8 +173,10 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
|||
// sign-extend from.
|
||||
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand);
|
||||
if (!Subtarget->hasSignExt()) {
|
||||
// Sign extends are legal only when extending a vector extract
|
||||
auto Action = Subtarget->hasSIMD128() ? Custom : Expand;
|
||||
for (auto T : {MVT::i8, MVT::i16, MVT::i32})
|
||||
setOperationAction(ISD::SIGN_EXTEND_INREG, T, Expand);
|
||||
setOperationAction(ISD::SIGN_EXTEND_INREG, T, Action);
|
||||
}
|
||||
for (auto T : MVT::integer_vector_valuetypes())
|
||||
setOperationAction(ISD::SIGN_EXTEND_INREG, T, Expand);
|
||||
|
@ -225,7 +221,7 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
|||
}
|
||||
|
||||
// Expand additional SIMD ops that V8 hasn't implemented yet
|
||||
if (Subtarget->hasSIMD128() && !EnableUnimplementedWasmSIMDInstrs) {
|
||||
if (Subtarget->hasSIMD128() && !Subtarget->hasSIMD128Unimplemented()) {
|
||||
setOperationAction(ISD::FSQRT, MVT::v4f32, Expand);
|
||||
setOperationAction(ISD::FDIV, MVT::v4f32, Expand);
|
||||
}
|
||||
|
@ -236,7 +232,7 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
|||
setOperationAction(ISD::EXTRACT_VECTOR_ELT, T, Custom);
|
||||
setOperationAction(ISD::INSERT_VECTOR_ELT, T, Custom);
|
||||
}
|
||||
if (EnableUnimplementedWasmSIMDInstrs) {
|
||||
if (Subtarget->hasSIMD128Unimplemented()) {
|
||||
for (auto T : {MVT::v2i64, MVT::v2f64}) {
|
||||
setOperationAction(ISD::EXTRACT_VECTOR_ELT, T, Custom);
|
||||
setOperationAction(ISD::INSERT_VECTOR_ELT, T, Custom);
|
||||
|
@ -900,6 +896,8 @@ SDValue WebAssemblyTargetLowering::LowerOperation(SDValue Op,
|
|||
return LowerAccessVectorElement(Op, DAG);
|
||||
case ISD::INTRINSIC_VOID:
|
||||
return LowerINTRINSIC_VOID(Op, DAG);
|
||||
case ISD::SIGN_EXTEND_INREG:
|
||||
return LowerSIGN_EXTEND_INREG(Op, DAG);
|
||||
case ISD::VECTOR_SHUFFLE:
|
||||
return LowerVECTOR_SHUFFLE(Op, DAG);
|
||||
case ISD::SHL:
|
||||
|
@ -1101,6 +1099,22 @@ WebAssemblyTargetLowering::LowerINTRINSIC_VOID(SDValue Op,
|
|||
}
|
||||
}
|
||||
|
||||
SDValue
|
||||
WebAssemblyTargetLowering::LowerSIGN_EXTEND_INREG(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
// If sign extension operations are disabled, allow sext_inreg only if operand
|
||||
// is a vector extract. SIMD does not depend on sign extension operations, but
|
||||
// allowing sext_inreg in this context lets us have simple patterns to select
|
||||
// extract_lane_s instructions. Expanding sext_inreg everywhere would be
|
||||
// simpler in this file, but would necessitate large and brittle patterns to
|
||||
// undo the expansion and select extract_lane_s instructions.
|
||||
assert(!Subtarget->hasSignExt() && Subtarget->hasSIMD128());
|
||||
if (Op.getOperand(0).getOpcode() == ISD::EXTRACT_VECTOR_ELT)
|
||||
return Op;
|
||||
// Otherwise expand
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDValue
|
||||
WebAssemblyTargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
|
|
|
@ -99,6 +99,7 @@ private:
|
|||
SDValue LowerCopyToReg(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue LowerAccessVectorElement(SDValue Op, SelectionDAG &DAG) const;
|
||||
SDValue LowerShift(SDValue Op, SelectionDAG &DAG) const;
|
||||
|
|
|
@ -20,7 +20,9 @@ def HasAddr32 : Predicate<"!Subtarget->hasAddr64()">;
|
|||
def HasAddr64 : Predicate<"Subtarget->hasAddr64()">;
|
||||
def HasSIMD128 : Predicate<"Subtarget->hasSIMD128()">,
|
||||
AssemblerPredicate<"FeatureSIMD128", "simd128">;
|
||||
def HasUnimplementedSIMD : Predicate<"EnableUnimplementedWasmSIMDInstrs">;
|
||||
def HasUnimplementedSIMD :
|
||||
Predicate<"Subtarget->hasSIMD128Unimplemented()">,
|
||||
AssemblerPredicate<"FeatureSIMD128Unimplemented", "simd128-unimplemented">;
|
||||
def HasAtomics : Predicate<"Subtarget->hasAtomics()">,
|
||||
AssemblerPredicate<"FeatureAtomics", "atomics">;
|
||||
def HasNontrappingFPToInt :
|
||||
|
|
|
@ -30,6 +30,7 @@ namespace llvm {
|
|||
|
||||
class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo {
|
||||
bool HasSIMD128;
|
||||
bool HasSIMD128Unimplemented;
|
||||
bool HasAtomics;
|
||||
bool HasNontrappingFPToInt;
|
||||
bool HasSignExt;
|
||||
|
@ -78,6 +79,7 @@ public:
|
|||
// Predicates used by WebAssemblyInstrInfo.td.
|
||||
bool hasAddr64() const { return TargetTriple.isArch64Bit(); }
|
||||
bool hasSIMD128() const { return HasSIMD128; }
|
||||
bool hasSIMD128Unimplemented() const { return HasSIMD128Unimplemented; }
|
||||
bool hasAtomics() const { return HasAtomics; }
|
||||
bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; }
|
||||
bool hasSignExt() const { return HasSignExt; }
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128 | FileCheck %s --check-prefixes CHECK,SIMD128,SIMD128-SLOW
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128 -fast-isel | FileCheck %s --check-prefixes CHECK,SIMD128,SIMD128-FAST
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128-unimplemented | FileCheck %s --check-prefixes CHECK,SIMD128,SIMD128-SLOW
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128-unimplemented -fast-isel | FileCheck %s --check-prefixes CHECK,SIMD128,SIMD128-FAST
|
||||
; 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-VM
|
||||
; 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-VM
|
||||
; 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,NO-SIMD128
|
||||
; 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,NO-SIMD128
|
||||
; 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
|
||||
; 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
|
||||
|
||||
; check that a non-test run (including explicit locals pass) at least finishes
|
||||
; RUN: llc < %s -O0 -wasm-enable-unimplemented-simd -mattr=+simd128,+sign-ext
|
||||
; RUN: llc < %s -O2 -wasm-enable-unimplemented-simd -mattr=+simd128,+sign-ext
|
||||
; RUN: llc < %s -O0 -mattr=+simd128-unimplemented
|
||||
; RUN: llc < %s -O2 -mattr=+simd128-unimplemented
|
||||
|
||||
; Test that basic SIMD128 arithmetic operations assemble as expected.
|
||||
|
||||
|
@ -122,22 +122,14 @@ define <16 x i8> @shr_s_v16i8(<16 x i8> %v, i8 %x) {
|
|||
; NO-SIMD128-NOT: i8x16
|
||||
; SIMD128-NEXT: .functype shr_s_vec_v16i8 (v128, v128) -> (v128){{$}}
|
||||
; SIMD128-NEXT: i8x16.extract_lane_s $push[[L0:[0-9]+]]=, $0, 0{{$}}
|
||||
; SIMD128-NEXT: i32.const $push[[L1:[0-9]+]]=, 24{{$}}
|
||||
; SIMD128-NEXT: i32.shl $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
|
||||
; SIMD128-NEXT: i32.const $push[[L3:[0-9]+]]=, 24{{$}}
|
||||
; SIMD128-NEXT: i32.shr_s $push[[L4:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
|
||||
; SIMD128-NEXT: i8x16.extract_lane_u $push[[L5:[0-9]+]]=, $1, 0{{$}}
|
||||
; SIMD128-NEXT: i32.shr_s $push[[L6:[0-9]+]]=, $pop[[L4]], $pop[[L5]]{{$}}
|
||||
; SIMD128-NEXT: i8x16.splat $push[[L7:[0-9]+]]=, $pop[[L6]]{{$}}
|
||||
; SIMD128-NEXT: i8x16.extract_lane_u $push[[L1:[0-9]+]]=, $1, 0{{$}}
|
||||
; SIMD128-NEXT: i32.shr_s $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
|
||||
; SIMD128-NEXT: i8x16.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
|
||||
; Skip 14 lanes
|
||||
; SIMD128: i8x16.extract_lane_s $push[[L7:[0-9]+]]=, $0, 15{{$}}
|
||||
; SIMD128-NEXT: i32.const $push[[L8:[0-9]+]]=, 24{{$}}
|
||||
; SIMD128-NEXT: i32.shl $push[[L9:[0-9]+]]=, $pop[[L7]], $pop[[L8]]{{$}}
|
||||
; SIMD128-NEXT: i32.const $push[[L10:[0-9]+]]=, 24{{$}}
|
||||
; SIMD128-NEXT: i32.shr_s $push[[L11:[0-9]+]]=, $pop[[L9]], $pop[[L10]]{{$}}
|
||||
; SIMD128-NEXT: i8x16.extract_lane_u $push[[L12:[0-9]+]]=, $1, 15{{$}}
|
||||
; SIMD128-NEXT: i32.shr_s $push[[L13:[0-9]+]]=, $pop[[L11]], $pop[[L12]]{{$}}
|
||||
; SIMD128-NEXT: i8x16.replace_lane $push[[R:[0-9]+]]=, $pop[[L14:[0-9]+]], 15, $pop[[L13]]{{$}}
|
||||
; SIMD128: i8x16.extract_lane_s $push[[L0:[0-9]+]]=, $0, 15{{$}}
|
||||
; SIMD128-NEXT: i8x16.extract_lane_u $push[[L1:[0-9]+]]=, $1, 15{{$}}
|
||||
; SIMD128-NEXT: i32.shr_s $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
|
||||
; SIMD128-NEXT: i8x16.replace_lane $push[[R:[0-9]+]]=, $pop{{[0-9]+}}, 15, $pop[[L2]]{{$}}
|
||||
; SIMD128-NEXT: return $pop[[R]]{{$}}
|
||||
define <16 x i8> @shr_s_vec_v16i8(<16 x i8> %v, <16 x i8> %x) {
|
||||
%a = ashr <16 x i8> %v, %x
|
||||
|
@ -343,22 +335,14 @@ define <8 x i16> @shr_s_v8i16(<8 x i16> %v, i16 %x) {
|
|||
; NO-SIMD128-NOT: i16x8
|
||||
; SIMD128-NEXT: .functype shr_s_vec_v8i16 (v128, v128) -> (v128){{$}}
|
||||
; SIMD128-NEXT: i16x8.extract_lane_s $push[[L0:[0-9]+]]=, $0, 0{{$}}
|
||||
; SIMD128-NEXT: i32.const $push[[L1:[0-9]+]]=, 16{{$}}
|
||||
; SIMD128-NEXT: i32.shl $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
|
||||
; SIMD128-NEXT: i32.const $push[[L3:[0-9]+]]=, 16{{$}}
|
||||
; SIMD128-NEXT: i32.shr_s $push[[L4:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
|
||||
; SIMD128-NEXT: i16x8.extract_lane_u $push[[L5:[0-9]+]]=, $1, 0{{$}}
|
||||
; SIMD128-NEXT: i32.shr_s $push[[L6:[0-9]+]]=, $pop[[L4]], $pop[[L5]]{{$}}
|
||||
; SIMD128-NEXT: i16x8.splat $push[[L7:[0-9]+]]=, $pop[[L6]]{{$}}
|
||||
; SIMD128-NEXT: i16x8.extract_lane_u $push[[L1:[0-9]+]]=, $1, 0{{$}}
|
||||
; SIMD128-NEXT: i32.shr_s $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
|
||||
; SIMD128-NEXT: i16x8.splat $push[[L3:[0-9]+]]=, $pop[[L2]]{{$}}
|
||||
; Skip 6 lanes
|
||||
; SIMD128: i16x8.extract_lane_s $push[[L7:[0-9]+]]=, $0, 7{{$}}
|
||||
; SIMD128-NEXT: i32.const $push[[L8:[0-9]+]]=, 16{{$}}
|
||||
; SIMD128-NEXT: i32.shl $push[[L9:[0-9]+]]=, $pop[[L7]], $pop[[L8]]{{$}}
|
||||
; SIMD128-NEXT: i32.const $push[[L10:[0-9]+]]=, 16{{$}}
|
||||
; SIMD128-NEXT: i32.shr_s $push[[L11:[0-9]+]]=, $pop[[L9]], $pop[[L10]]{{$}}
|
||||
; SIMD128-NEXT: i16x8.extract_lane_u $push[[L12:[0-9]+]]=, $1, 7{{$}}
|
||||
; SIMD128-NEXT: i32.shr_s $push[[L13:[0-9]+]]=, $pop[[L11]], $pop[[L12]]{{$}}
|
||||
; SIMD128-NEXT: i16x8.replace_lane $push[[R:[0-9]+]]=, $pop[[L14:[0-9]+]], 7, $pop[[L13]]{{$}}
|
||||
; SIMD128: i16x8.extract_lane_s $push[[L0:[0-9]+]]=, $0, 7{{$}}
|
||||
; SIMD128-NEXT: i16x8.extract_lane_u $push[[L1:[0-9]+]]=, $1, 7{{$}}
|
||||
; SIMD128-NEXT: i32.shr_s $push[[L2:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
|
||||
; SIMD128-NEXT: i16x8.replace_lane $push[[R:[0-9]+]]=, $pop{{[0-9]+}}, 7, $pop[[L2]]{{$}}
|
||||
; SIMD128-NEXT: return $pop[[R]]{{$}}
|
||||
define <8 x i16> @shr_s_vec_v8i16(<8 x i16> %v, <8 x i16> %x) {
|
||||
%a = ashr <8 x i16> %v, %x
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -wasm-enable-unimplemented-simd -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128-VM
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=-simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,NO-SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=+simd128-unimplemented | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=+simd128 | FileCheck %s --check-prefixes CHECK,SIMD128-VM
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals | FileCheck %s --check-prefixes CHECK,NO-SIMD128
|
||||
|
||||
; Test that bitcasts between vector types are lowered to zero instructions
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -wasm-enable-unimplemented-simd -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128-VM
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=-simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,NO-SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=+simd128-unimplemented | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=+simd128 | FileCheck %s --check-prefixes CHECK,SIMD128-VM
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals | FileCheck %s --check-prefixes CHECK,NO-SIMD128
|
||||
|
||||
; Test SIMD comparison operators
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-enable-unimplemented-simd -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128-VM
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=-simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,NO-SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=+simd128-unimplemented | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=+simd128 | FileCheck %s --check-prefixes CHECK,SIMD128-VM
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals | FileCheck %s --check-prefixes CHECK,NO-SIMD128
|
||||
|
||||
; Test that vector float-to-int and int-to-float instructions lower correctly
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128 | FileCheck %s
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128-unimplemented | FileCheck %s
|
||||
|
||||
; Check that store in memory with smaller lanes are loaded and stored
|
||||
; as expected. This is a regression test for part of bug 39275.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128 | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128 -fast-isel | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128-unimplemented | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128-unimplemented -fast-isel | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
|
||||
; Test that SIMD128 intrinsics lower as expected. These intrinsics are
|
||||
; only expected to lower successfully if the simd128 attribute is
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128 | FileCheck %s
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128-unimplemented | FileCheck %s
|
||||
|
||||
; Test loads and stores with custom alignment values.
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -wasm-enable-unimplemented-simd -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128-VM
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=-simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,NO-SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=+simd128-unimplemented | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals -mattr=+simd128 | FileCheck %s --check-prefixes CHECK,SIMD128-VM
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-keep-registers -wasm-disable-explicit-locals | FileCheck %s --check-prefixes CHECK,NO-SIMD128
|
||||
|
||||
; Test SIMD loads and stores
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128,+sign-ext | FileCheck %s
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128-unimplemented | FileCheck %s
|
||||
|
||||
; Test that vector selects of various varieties lower correctly to bitselects.
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-enable-unimplemented-simd -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128-VM
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=-simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,NO-SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=+simd128-unimplemented | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -mattr=+simd128 | FileCheck %s --check-prefixes CHECK,SIMD128-VM
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -wasm-keep-registers -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals | FileCheck %s --check-prefixes CHECK,NO-SIMD128
|
||||
|
||||
; Test that vector sign extensions lower to shifts
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -wasm-enable-unimplemented-simd -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128-unimplemented,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,SIMD128-VM
|
||||
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=-simd128,+sign-ext | FileCheck %s --check-prefixes CHECK,NO-SIMD128
|
||||
; 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
|
||||
|
||||
; Test that basic SIMD128 vector manipulation operations assemble as expected.
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+simd128,+nontrapping-fptoint,+exception-handling < %s | FileCheck %s
|
||||
# RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+simd128-unimplemented,+nontrapping-fptoint,+exception-handling < %s | FileCheck %s
|
||||
# this one is just here to see if it converts to .o without errors, but doesn't check any output:
|
||||
# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj -mattr=+simd128,+nontrapping-fptoint,+exception-handling < %s
|
||||
# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj -mattr=+simd128-unimplemented,+nontrapping-fptoint,+exception-handling < %s
|
||||
|
||||
.text
|
||||
.section .text.main,"",@
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# RUN: llvm-mc -show-encoding -triple=wasm32-unkown-unknown -mattr=+sign-ext,+simd128 < %s | FileCheck %s
|
||||
# RUN: llvm-mc -show-encoding -triple=wasm32-unkown-unknown -mattr=+simd128-unimplemented < %s | FileCheck %s
|
||||
|
||||
main:
|
||||
.functype main () -> ()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: llc -wasm-enable-unimplemented-simd -mattr=+sign-ext,+simd128 -filetype=obj %s -o - | obj2yaml | FileCheck %s
|
||||
; RUN: llc -mattr=+simd128-unimplemented -filetype=obj %s -o - | obj2yaml | FileCheck %s
|
||||
|
||||
target triple = "wasm32-unknown-unknown"
|
||||
|
||||
|
|
Loading…
Reference in New Issue