default:
return {}; // Don't custom lower most intrinsics.
- case Intrinsic::wasm_add_saturate_signed:
- case Intrinsic::wasm_add_saturate_unsigned:
- case Intrinsic::wasm_sub_saturate_signed:
- case Intrinsic::wasm_sub_saturate_unsigned: {
- unsigned OpCode;
- switch (IntNo) {
- case Intrinsic::wasm_add_saturate_signed:
- OpCode = WebAssemblyISD::ADD_SAT_S;
- break;
- case Intrinsic::wasm_add_saturate_unsigned:
- OpCode = WebAssemblyISD::ADD_SAT_U;
- break;
- case Intrinsic::wasm_sub_saturate_signed:
- OpCode = WebAssemblyISD::SUB_SAT_S;
- break;
- case Intrinsic::wasm_sub_saturate_unsigned:
- OpCode = WebAssemblyISD::SUB_SAT_U;
- break;
- default:
- llvm_unreachable("unexpected intrinsic id");
- break;
- }
- return DAG.getNode(OpCode, DL, Op.getValueType(), Op.getOperand(1),
- Op.getOperand(2));
- }
-
- case Intrinsic::wasm_bitselect:
- return DAG.getNode(WebAssemblyISD::BITSELECT, DL, Op.getValueType(),
- Op.getOperand(1), Op.getOperand(2), Op.getOperand(3));
-
- case Intrinsic::wasm_anytrue:
- case Intrinsic::wasm_alltrue: {
- unsigned OpCode = IntNo == Intrinsic::wasm_anytrue
- ? WebAssemblyISD::ANYTRUE
- : WebAssemblyISD::ALLTRUE;
- return DAG.getNode(OpCode, DL, Op.getValueType(), Op.getOperand(1));
- }
-
case Intrinsic::wasm_lsda:
// TODO For now, just return 0 not to crash
return DAG.getConstant(0, DL, Op.getValueType());
bits<32> simdop> {
defm _#vec_t : SIMD_I<(outs V128:$dst), (ins V128:$lhs, V128:$rhs),
(outs), (ins),
- [(set (vec_t V128:$dst), (node V128:$lhs, V128:$rhs))],
+ [(set (vec_t V128:$dst),
+ (node (vec_t V128:$lhs), (vec_t V128:$rhs))
+ )],
vec#"."#name#"\t$dst, $lhs, $rhs", vec#"."#name,
simdop>;
}
defm "" : SIMDBinary<v8i16, "i16x8", node, name, !add(baseInst, 2)>;
}
-def wasm_saturate_t : SDTypeProfile<1, 2,
- [SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>]
->;
-def wasm_add_sat_s : SDNode<"WebAssemblyISD::ADD_SAT_S", wasm_saturate_t>;
-def wasm_add_sat_u : SDNode<"WebAssemblyISD::ADD_SAT_U", wasm_saturate_t>;
-def wasm_sub_sat_s : SDNode<"WebAssemblyISD::SUB_SAT_S", wasm_saturate_t>;
-def wasm_sub_sat_u : SDNode<"WebAssemblyISD::SUB_SAT_U", wasm_saturate_t>;
-
// Saturating integer addition: add_saturate_s / add_saturate_u
let isCommutable = 1 in {
-defm ADD_SAT_S : SIMDBinarySat<wasm_add_sat_s, "add_saturate_s", 40>;
-defm ADD_SAT_U : SIMDBinarySat<wasm_add_sat_u, "add_saturate_u", 41>;
+defm ADD_SAT_S :
+ SIMDBinarySat<int_wasm_add_saturate_signed, "add_saturate_s", 40>;
+defm ADD_SAT_U :
+ SIMDBinarySat<int_wasm_add_saturate_unsigned, "add_saturate_u", 41>;
} // isCommutable = 1
// Saturating integer subtraction: sub_saturate_s / sub_saturate_u
-defm SUB_SAT_S : SIMDBinarySat<wasm_sub_sat_s, "sub_saturate_s", 44>;
-defm SUB_SAT_U : SIMDBinarySat<wasm_sub_sat_u, "sub_saturate_u", 45>;
+defm SUB_SAT_S :
+ SIMDBinarySat<int_wasm_sub_saturate_signed, "sub_saturate_s", 44>;
+defm SUB_SAT_U :
+ SIMDBinarySat<int_wasm_sub_saturate_unsigned, "sub_saturate_u", 45>;
//===----------------------------------------------------------------------===//
// Bit shifts
defm "" : SIMDNot<v2i64>;
// Bitwise select: v128.bitselect
-def wasm_bitselect_t : SDTypeProfile<1, 3,
- [SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisSameAs<0, 3>]
->;
-def wasm_bitselect : SDNode<"WebAssemblyISD::BITSELECT", wasm_bitselect_t>;
-
multiclass Bitselect<ValueType vec_t> {
defm BITSELECT_#vec_t :
SIMD_I<(outs V128:$dst), (ins V128:$v1, V128:$v2, V128:$c), (outs), (ins),
[(set (vec_t V128:$dst),
- (vec_t (wasm_bitselect
+ (vec_t (int_wasm_bitselect
(vec_t V128:$c), (vec_t V128:$v1), (vec_t V128:$v2)
))
)],
defm "" : SIMDReduceVec<v2i64, "i64x2", name, op, !add(baseInst, 3)>;
}
-def wasm_reduce_t : SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVec<1>]>;
-
// Any lane true: any_true
-def wasm_anytrue : SDNode<"WebAssemblyISD::ANYTRUE", wasm_reduce_t>;
-defm ANYTRUE : SIMDReduce<"any_true", wasm_anytrue, 65>;
+defm ANYTRUE : SIMDReduce<"any_true", int_wasm_anytrue, 65>;
// All lanes true: all_true
-def wasm_alltrue : SDNode<"WebAssemblyISD::ALLTRUE", wasm_reduce_t>;
-defm ALLTRUE : SIMDReduce<"all_true", wasm_alltrue, 69>;
+defm ALLTRUE : SIMDReduce<"all_true", int_wasm_alltrue, 69>;
//===----------------------------------------------------------------------===//
// Comparisons