[libcxx-commits] [PATCH] D118930: [SystemZ]:[z/OS]:[libcxx]: fix the mask in stage2_float_loop function

Nancy Wang via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Tue Oct 4 14:17:25 PDT 2022


NancyWang2222 added a comment.

In D118930#3354564 <https://reviews.llvm.org/D118930#3354564>, @ldionne wrote:

> Please use `std::` instead of `_VSTD::`, though (as suggested by @philnik)

hi Louis, sorry for late reply, haven't been active working on this for a while. I noticed there are many other places are still using '_VSTD::' in 'libcxx/include/locale' as well.  I think should replace all of them to "std::" in separate patch.  Thanks



================
Comment at: libcxx/include/locale:549
     {
-        if (__a_end == __a || (__a_end[-1] & 0x5F) == (__exp & 0x7F))
+        if (__a_end == __a || (_VSTD::toupper(__a_end[-1]) == _VSTD::toupper(__exp)))
         {
----------------
philnik wrote:
> SeanP wrote:
> > ldionne wrote:
> > > This is going to be really naive, but can you explain why `exp & 0x7F` this is even equivalent to `toupper(exp)`?
> > > 
> > > I understand the equivalence for `c & 0x5f` based on the table below, but I don't see the link for `0x7F`:
> > > 
> > > ```
> > > 0x41  01000001    A
> > > 0x61  01100001    a
> > > 0x42  01000010    B
> > > 0x62  01100010    b
> > > 0x43  01000011    C
> > > 0x63  01100011    c
> > > 0x44  01000100    D
> > > 0x64  01100100    d
> > > 0x45  01000101    E
> > > 0x65  01100101    e
> > > 0x46  01000110    F
> > > 0x66  01100110    f
> > > 0x47  01000111    G
> > > 0x67  01100111    g
> > > 0x48  01001000    H
> > > 0x68  01101000    h
> > > 0x49  01001001    I
> > > 0x69  01101001    i
> > > [...]
> > > 0x58  01011000    X
> > > 0x78  01111000    x
> > > 0x59  01011001    Y
> > > 0x79  01111001    y
> > > 0x5A  01011010    Z
> > > 0x7A  01111010    z
> > > 
> > > 0x5F  01011111
> > > 0x7F  01111111
> > > 0x80  10000000
> > > ```
> > > 
> > The 0x7f is tied to the "|0x80" below.  It is an ugly hack that takes advantage of the fact all ascii characters are in the range of 0-127.  The hack enables or disables the check on line 558 (`(__x&0x5f)) == __exp`) from matching the letter 'E' as a valid character in the mantissa or the start of the exponent.  When the high order bit is set in __exp, the test on line 558 will match 'a' and 'A', but never 'e' or 'E',  but the test here will match 'e' and 'E'.  
> > 
> > This hack doesn't work for ebcdic since the characters are in the range of 0-255.  To make the code work with both we changed the code to make `__exp` 'e' instead of 'E' plus the high order bit (line 560) and then on this line we upper case both `__exp` and the character to get the case insensitive compare and just upper case the character on line 558 to get the context sensitive compare.
> > 
> > I recall the logic is:
> > - line 549 - match any 'e'/'E' in the string
> > - line 558 - only match the first 'e'/'E'
> > 
> > Making `__exp` lower case instead of setting the high order bit achieves the same results.
> Same below.
This needs to use macro _VSTD which is defined as std, same with other line. 


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D118930/new/

https://reviews.llvm.org/D118930



More information about the libcxx-commits mailing list