From d01f7fced4fb83830acdc1e3e575af0c92c9773a Mon Sep 17 00:00:00 2001 From: JF Bastien Date: Tue, 11 Aug 2015 00:49:20 +0000 Subject: [PATCH] WebAssembly: simply assert on SNaN and NaNs with payloads Summary: convertToHexString doesn't represent them correctly at this point in time. This is a follow-up to sunfish's suggestion in D11914. Subscribers: llvm-commits, sunfish, jfb Differential Revision: http://reviews.llvm.org/D11925 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244551 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 9 +++++---- test/CodeGen/WebAssembly/immediates.ll | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index 35a4be3805d..1c24e445a92 100644 --- a/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -117,10 +117,11 @@ void WebAssemblyAsmPrinter::EmitInstruction(const MachineInstr *MI) { static const size_t BufBytes = 128; char buf[BufBytes]; APFloat FP = MO.getFPImm()->getValueAPF(); - const APFloat CanonicalNaN = APFloat::getQNaN(FP.getSemantics()); - if (FP.isNaN() && !FP.bitwiseIsEqual(CanonicalNaN)) - // WebAssembly only has NaNs that are positive, quiet, without payload. - FP = CanonicalNaN; + if (FP.isNaN()) + assert((FP.bitwiseIsEqual(APFloat::getQNaN(FP.getSemantics())) || + FP.bitwiseIsEqual( + APFloat::getQNaN(FP.getSemantics(), /*Negative=*/true))) && + "convertToHexString handles neither SNaN nor NaN payloads"); // Use C99's hexadecimal floating-point representation. auto Written = FP.convertToHexString(buf, /*hexDigits=*/0, /*upperCase=*/false, diff --git a/test/CodeGen/WebAssembly/immediates.ll b/test/CodeGen/WebAssembly/immediates.ll index f22e2943466..1059ffcea30 100644 --- a/test/CodeGen/WebAssembly/immediates.ll +++ b/test/CodeGen/WebAssembly/immediates.ll @@ -97,7 +97,7 @@ define float @nan_f32() { } ; CHECK-LABEL: negnan_f32: -; CHECK-NEXT: (setlocal @0 (immediate nan)) +; CHECK-NEXT: (setlocal @0 (immediate -nan)) ; CHECK-NEXT: (return @0) define float @negnan_f32() { ret float 0xFFF8000000000000 @@ -153,7 +153,7 @@ define double @nan_f64() { } ; CHECK-LABEL: negnan_f64: -; CHECK-NEXT: (setlocal @0 (immediate nan)) +; CHECK-NEXT: (setlocal @0 (immediate -nan)) ; CHECK-NEXT: (return @0) define double @negnan_f64() { ret double 0xFFF8000000000000 -- 2.34.1