[PATCH] D27872: [APFloat] Switch from (PPCDoubleDoubleImpl, IEEEdouble) layout to (IEEEdouble, IEEEdouble)
Justin Lebar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 24 10:20:57 PST 2017
jlebar added a comment.
Eric asked me to do a review of this. I notice now it was submitted while I was doing the review. Oh well. Here are the comments I had.
================
Comment at: llvm/include/llvm/ADT/APFloat.h:1054
+ opStatus next(bool nextDown) {
+ if (usesLayout<IEEEFloat>(getSemantics()))
----------------
FWIW, see my screed on this: http://jlebar.com/2011/12/16/Boolean_parameters_to_API_functions_considered_harmful..html
================
Comment at: llvm/include/llvm/ADT/APFloat.h:1062
+
+ /// \brief Operator+ overload which provides the default
+ /// \c rmNearestTiesToEven rounding mode and *no* error checking.
----------------
We have autobrief, which I do not understand, but I believe renders "\brief" unnecessary?
================
Comment at: llvm/include/llvm/ADT/APFloat.h:1062
+
+ /// \brief Operator+ overload which provides the default
+ /// \c rmNearestTiesToEven rounding mode and *no* error checking.
----------------
jlebar wrote:
> We have autobrief, which I do not understand, but I believe renders "\brief" unnecessary?
Nit, Since "operator" is a keyword, it should be capitalized as in the C++
================
Comment at: llvm/include/llvm/ADT/APFloat.h:1062
+
+ /// \brief Operator+ overload which provides the default
+ /// \c rmNearestTiesToEven rounding mode and *no* error checking.
----------------
jlebar wrote:
> jlebar wrote:
> > We have autobrief, which I do not understand, but I believe renders "\brief" unnecessary?
> Nit, Since "operator" is a keyword, it should be capitalized as in the C++
Nit, It's clear from the code that this is an operator+ overload. Perhaps all we need to say is
> Add two APFloats using rmNearestTiesToEven semantics. No error checking.
================
Comment at: llvm/lib/Support/APFloat.cpp:88
+ IBM double-double, if the accurate semPPCDoubleDouble doesn't handle the
+ case. It's equivalent to have an IEEE number with consecutive 106 bits of
+ mantissa, and 11 bits of exponent. It's not accurate, becuase the two
----------------
s/case/operation/?
================
Comment at: llvm/lib/Support/APFloat.cpp:88
+ IBM double-double, if the accurate semPPCDoubleDouble doesn't handle the
+ case. It's equivalent to have an IEEE number with consecutive 106 bits of
+ mantissa, and 11 bits of exponent. It's not accurate, becuase the two
----------------
jlebar wrote:
> s/case/operation/?
s/have/having/
================
Comment at: llvm/lib/Support/APFloat.cpp:88
+ IBM double-double, if the accurate semPPCDoubleDouble doesn't handle the
+ case. It's equivalent to have an IEEE number with consecutive 106 bits of
+ mantissa, and 11 bits of exponent. It's not accurate, becuase the two
----------------
jlebar wrote:
> jlebar wrote:
> > s/case/operation/?
> s/have/having/
s/consecutive 106 bits/106 consecutive bits/
================
Comment at: llvm/lib/Support/APFloat.cpp:89
+ case. It's equivalent to have an IEEE number with consecutive 106 bits of
+ mantissa, and 11 bits of exponent. It's not accurate, becuase the two
+ 53-bit mantissa parts don't actually have to be consecutive,
----------------
No comma before "and". (Comma before "and" is usually reserved for the case when "and" joins two "independent clauses" -- things which could themselves be complete sentences.)
================
Comment at: llvm/lib/Support/APFloat.cpp:89
+ case. It's equivalent to have an IEEE number with consecutive 106 bits of
+ mantissa, and 11 bits of exponent. It's not accurate, becuase the two
+ 53-bit mantissa parts don't actually have to be consecutive,
----------------
jlebar wrote:
> No comma before "and". (Comma before "and" is usually reserved for the case when "and" joins two "independent clauses" -- things which could themselves be complete sentences.)
Suggest
> It's not equivalent to the true PPC double-double semantics, because in reality, the two 53-bit mantissa parts ...
================
Comment at: llvm/lib/Support/APFloat.cpp:91
+ 53-bit mantissa parts don't actually have to be consecutive,
+ e.g. 1 + epsilon.
----------------
Can we rephrase "the two 53-bit mantissa parts don't actually have to be consecutive, e.g. 1 + epsilon."? I don't understand what this means.
================
Comment at: llvm/lib/Support/APFloat.cpp:4135
+ Floats[0].makeZero(Neg);
+ Floats[1].makeZero(false);
+}
----------------
Nit: `makeZero(/* Neg = */ false)`? (See aforementioned screed. :)
================
Comment at: llvm/lib/Support/APFloat.cpp:4168
+ if (Result == APFloat::cmpEqual)
+ return Floats[1].compare(RHS.Floats[1]);
+ return Result;
----------------
Is it worth adding a comment here that this is correct because in a double-double (x, y), we always have x >= y?
At least, I assume that's why this is correct. :)
================
Comment at: llvm/lib/Support/APFloat.cpp:4179
+ if (Arg.Floats)
+ return hash_combine(hash_value(Arg.Floats[0]), hash_value(Arg.Floats[1]));
+ return hash_combine(Arg.Semantics);
----------------
Nit, do you want to include the semantics? I mean, I guess it doesn't really matter.
================
Comment at: llvm/lib/Support/APFloat.cpp:4263
+ (Floats[0].isDenormal() || Floats[1].isDenormal() ||
+ Floats[0].compare(Floats[0] + Floats[1]) != cmpEqual);
+}
----------------
This shouldn't be `== cmpEqual` or something? Otherwise this makes no sense to me; perhaps we could add a comment?
================
Comment at: llvm/unittests/ADT/APFloatTest.cpp:3511
+ // (1 + 0) = (1 + 0)
+ std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000000ull, 0, true),
+ // (1 + 0) != (1.00...1 + 0)
----------------
Can you use {} instead of make_tuple? https://godbolt.org/g/1Y1P0F
================
Comment at: llvm/unittests/ADT/APFloatTest.cpp:3534
Op2[1])
.str();
}
----------------
Honestly I am not sure this is an improvement over writing it out by hand:
EXPECT_TRUE(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, {0xblah, 0xblah})).bitwiseIsEqual(...)))
(You should be able to pass an initializer_list to the constructor, no problem, afaict.) Up to you though.
Repository:
rL LLVM
https://reviews.llvm.org/D27872
More information about the llvm-commits
mailing list