From 09d4df00f355d9919be7b0785624663c06d09e5e Mon Sep 17 00:00:00 2001 From: Diego Caballero Date: Fri, 5 Jun 2020 17:06:42 -0700 Subject: [PATCH] Fix convertBFloatAPFloatToAPInt for NaN/Inf values Bfloat type has an 8-bit exponent so the exponent of NaN/Inf numbers must be 0xff instead of 0x1f. This is probably a copy-paste mistake from the half float type. Reviewed By: lattner Differential Revision: https://reviews.llvm.org/D81302 --- lib/Support/APFloat.cpp | 4 ++-- test/Assembler/bfloat.ll | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/Support/APFloat.cpp b/lib/Support/APFloat.cpp index 78f44c5e47b..569cac790af 100644 --- a/lib/Support/APFloat.cpp +++ b/lib/Support/APFloat.cpp @@ -3278,11 +3278,11 @@ APInt IEEEFloat::convertBFloatAPFloatToAPInt() const { myexponent = 0; mysignificand = 0; } else if (category == fcInfinity) { - myexponent = 0x1f; + myexponent = 0xff; mysignificand = 0; } else { assert(category == fcNaN && "Unknown category!"); - myexponent = 0x1f; + myexponent = 0xff; mysignificand = (uint32_t)*significandParts(); } diff --git a/test/Assembler/bfloat.ll b/test/Assembler/bfloat.ll index c9c7b6d2686..3a3b4c2b277 100644 --- a/test/Assembler/bfloat.ll +++ b/test/Assembler/bfloat.ll @@ -36,3 +36,27 @@ define float @check_bfloat_convert() { ; OPT: 0x4191A00000000000 ret float %tmp } + +; ASSEM-DISASS-LABEL @snan_bfloat +define bfloat @snan_bfloat() { +; ASSEM-DISASS: ret bfloat 0xR7F81 + ret bfloat 0xR7F81 +} + +; ASSEM-DISASS-LABEL @qnan_bfloat +define bfloat @qnan_bfloat() { +; ASSEM-DISASS: ret bfloat 0xR7FC0 + ret bfloat 0xR7FC0 +} + +; ASSEM-DISASS-LABEL @pos_inf_bfloat +define bfloat @pos_inf_bfloat() { +; ASSEM-DISASS: ret bfloat 0xR7F80 + ret bfloat 0xR7F80 +} + +; ASSEM-DISASS-LABEL @neg_inf_bfloat +define bfloat @neg_inf_bfloat() { +; ASSEM-DISASS: ret bfloat 0xRFF80 + ret bfloat 0xRFF80 +}