diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index fedad25c775e2..1b5641ed5e9de 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -121,7 +121,10 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering( setOperationAction(ISD::VACOPY, MVT::Other, Expand); setOperationAction(ISD::VAEND, MVT::Other, Expand); - for (auto T : {MVT::f32, MVT::f64, MVT::v4f32, MVT::v2f64}) { + for (auto T : {MVT::f32, MVT::f64, MVT::v4f32, MVT::v2f64, MVT::v8f16}) { + if (!Subtarget->hasFP16() && T == MVT::v8f16) { + continue; + } // Don't expand the floating-point types to constant pools. setOperationAction(ISD::ConstantFP, T, Legal); // Expand floating-point comparisons. @@ -140,18 +143,16 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering( // Support minimum and maximum, which otherwise default to expand. setOperationAction(ISD::FMINIMUM, T, Legal); setOperationAction(ISD::FMAXIMUM, T, Legal); - // WebAssembly currently has no builtin f16 support. - setOperationAction(ISD::FP16_TO_FP, T, Expand); - setOperationAction(ISD::FP_TO_FP16, T, Expand); + // When experimental v8f16 support is enabled these instructions don't need + // to be expanded. + if (T != MVT::v8f16) { + setOperationAction(ISD::FP16_TO_FP, T, Expand); + setOperationAction(ISD::FP_TO_FP16, T, Expand); + } setLoadExtAction(ISD::EXTLOAD, T, MVT::f16, Expand); setTruncStoreAction(T, MVT::f16, Expand); } - if (Subtarget->hasFP16()) { - setOperationAction(ISD::FMINIMUM, MVT::v8f16, Legal); - setOperationAction(ISD::FMAXIMUM, MVT::v8f16, Legal); - } - // Expand unavailable integer operations. for (auto Op : {ISD::BSWAP, ISD::SMUL_LOHI, ISD::UMUL_LOHI, ISD::MULHS, ISD::MULHU, diff --git a/llvm/test/CodeGen/WebAssembly/half-precision.ll b/llvm/test/CodeGen/WebAssembly/half-precision.ll index 5f0ba4aa9c3c4..59becd0e7e5c3 100644 --- a/llvm/test/CodeGen/WebAssembly/half-precision.ll +++ b/llvm/test/CodeGen/WebAssembly/half-precision.ll @@ -172,6 +172,16 @@ define <8 x i1> @compare_oge_v8f16 (<8 x half> %x, <8 x half> %y) { ret <8 x i1> %res } +; CHECK-LABEL: compare_ule_v8f16: +; CHECK-NEXT: .functype compare_ule_v8f16 (v128, v128) -> (v128){{$}} +; CHECK-NEXT: f16x8.gt $push[[T0:[0-9]+]]=, $0, $1{{$}} +; CHECK-NEXT: v128.not $push[[R:[0-9]+]]=, $pop[[T0]]{{$}} +; CHECK-NEXT: return $pop[[R]]{{$}} +define <8 x i1> @compare_ule_v8f16 (<8 x half> %x, <8 x half> %y) { + %res = fcmp ule <8 x half> %x, %y + ret <8 x i1> %res +} + ; CHECK-LABEL: abs_v8f16: ; CHECK-NEXT: .functype abs_v8f16 (v128) -> (v128) ; CHECK-NEXT: f16x8.abs $push0=, $0