From: Travis Boraten Date: Mon, 22 Apr 2019 21:14:13 +0000 (-0400) Subject: arch-gcn3: Fix roundNearestEven for V_RNDNE_F64 and V_RNDNE_F32 X-Git-Tag: v20.1.0.0~430 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e4f7982e90c16b4080aa74a08b69a7b655795fcd;p=gem5.git arch-gcn3: Fix roundNearestEven for V_RNDNE_F64 and V_RNDNE_F32 roundNearestEven is an inst_util function that RNDNE_F64 and F32 call, including both VOP1 and VOP3 formats. IEEE 754 spec says this function should round inputs to the nearest integer but round ties to the nearest even integer. Prior to this patch it was rounding all inputs to nearest even, not just the ties. It was probably implemented this way originally because the language in the ISA manual is ambiguous although it provided the correct logic. Fixed roundNearestEven to use the semantics originally described in the GCN3 ISA manual. Change-Id: I83ecb1d516fcf5bdf17e54ddf409b447a129a9a7 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/29964 Maintainer: Anthony Gutierrez Tested-by: kokoro Reviewed-by: Matt Sinclair --- diff --git a/src/arch/gcn3/insts/inst_util.hh b/src/arch/gcn3/insts/inst_util.hh index b40e890f6..15ffe9a93 100644 --- a/src/arch/gcn3/insts/inst_util.hh +++ b/src/arch/gcn3/insts/inst_util.hh @@ -258,7 +258,13 @@ namespace Gcn3ISA template inline T roundNearestEven(T val) { - T nearest_round = std::round(val * 0.5) * 2.0; + T int_part = 0; + T nearest_round = std::floor(val + 0.5); + if ((int)std::floor(val) % 2 == 0 + && std::modf(std::abs(val), &int_part) == 0.5) { + nearest_round = nearest_round - 1; + } + return nearest_round; }