This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Update Linux kernel to current glibc soft-fp
- From: Joseph Myers <joseph at codesourcery dot com>
- To: Stefan Liebler <stli at linux dot vnet dot ibm dot com>
- Cc: <libc-alpha at sourceware dot org>
- Date: Thu, 2 Apr 2015 17:44:59 +0000
- Subject: Re: Update Linux kernel to current glibc soft-fp
- Authentication-results: sourceware.org; auth=none
- References: <alpine dot DEB dot 2 dot 10 dot 1502060230300 dot 3494 at digraph dot polyomino dot org dot uk> <alpine dot DEB dot 2 dot 10 dot 1503231657440 dot 14930 at digraph dot polyomino dot org dot uk> <mf0mpn$1j8$1 at ger dot gmane dot org>
On Thu, 26 Mar 2015, Stefan Liebler wrote:
> According to "error: lvalue required as left operand of assignment":
> Why did you write back r in include/math-emu/op-common.h:
> #define _FP_FROM_INT(fs, wc, X, r, rsize, rtype):
> if ((X##_s = ((r) < 0)))
> (r) = -(rtype) (r);
> _FP_FROM_INT_ur = (rtype) (r);
Because the _FP_FROM_INT interface requires an argument of the correct
signedness, but needs to work internally on an unsigned value, so starts
by negating a signed argument.
> @@ -435,11 +436,12 @@ void s390_adjust_jiffies(void)
> * by the cpu capability number. Yes, that means a floating
> * point division .. math-emu here we come :-)
> */
> - FP_UNPACK_SP(SA, &fmil);
> - if ((info->capability >> 23) == 0)
> - FP_FROM_INT_S(SB, (long) info->capability, 64, long);
> - else
> - FP_UNPACK_SP(SB, &info->capability);
> + FP_UNPACK_SEMIRAW_SP(SA, &fmil);
> + if ((info->capability >> 23) == 0) {
> + unsigned long r = info->capability;
> + FP_FROM_INT_S(SB, r, 64, unsigned long);
> + } else
> + FP_UNPACK_SEMIRAW_SP(SB, &info->capability);
> FP_DIV_S(SR, SA, SB);
> FP_TO_INT_S(capability, SR, 32, 0);
Division uses cooked inputs and outputs. FP_TO_INT uses raw inputs.
FP_FROM_INT uses raw outputs.
So for unpacking SA you should continue to use FP_UNPACK_SP, as the result
goes straight into division. For unpacking SB, it seems appropriate to
use FP_UNPACK_RAW_SP. Then, after either unpacking or FP_FROM_INT_S, you
have a raw value in SB, and can use _FP_UNPACK_CANONICAL to produce a
cooked value from it that can be used as an input to the division.
As for the integer argument to FP_FROM_INT_S, the existing code treats it
as signed long, so the same semantics would be preserved by making the
temporary variable of that type (however, you still need to pass "unsigned
long" as the last argument to FP_FROM_INT_S, as it expects the type name
passed to be the name of an unsigned type).
--
Joseph S. Myers
joseph@codesourcery.com