Date: Thu, 3 Mar 2016 10:54:06 -0800 From: Mark Millard <markmi@dsl-only.net> To: Bruce Evans <brde@optusnet.com.au> Cc: svn-src-head@freebsd.org, Justin Hibbits <chmeeedalf@gmail.com> Subject: Re: svn commit: r296336 - in head/sys: dev/bhnd dev/pccard dev/pci isa kern sys x86/xen Message-ID: <3B2E571A-C682-4BAD-8DEE-12DE29AAD33C@dsl-only.net> In-Reply-To: <54D250A4-C855-4B37-8D3E-F4EFE975B7B2@dsl-only.net> References: <42B9FE2E-95D7-4292-9A27-7E4F24BCEDCD@dsl-only.net> <54D250A4-C855-4B37-8D3E-F4EFE975B7B2@dsl-only.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu Mar 3 06:18:48 UTC 2016 Bruce Evans wrote: > On Thu, 3 Mar 2016, Justin Hibbits wrote: >=20 > > Log: > > Replace all resource occurrences of '0UL/~0UL' with '0/~0'. > > > > Summary: > > The idea behind this is '~0ul' is well-defined, and casting to = uintmax_t, on a > > 32-bit platform, will leave the upper 32 bits as 0. The maximum = range of a > > resource is 0xFFF.... (all bits of the full type set). By dropping = the 'ul' > > suffix, C type promotion rules apply, and the sign extension of ~0 = on 32 bit > > platforms gets it to a type-independent 'unsigned max'. >=20 >=20 > Why not use the correct signed value? This value is -1, not the = value, if > any, with all bits 1. All bits 1 might be a trap representation, but = it > is unclear if ~0 can give a trap representation or a trap since it is > unclear if the '~' operation acts on padding bits. It is clear that = all > bits 1 gives has value -0 in 1's complement if there are no no padding > bits. But -0 has the same value as +0. When converted to an unsigned > type, it loses all traces of its sign, and becomes plain (ufoo_t)0. >=20 > I don't like the plan to change the resource range type to uintmax_t. > 64 bits is just bloat for most 32-bit systems. After fixing all the > hard-coded u_longs, you can just use a typdefed type which should be > uint32_t if possible. >=20 > Bruce My original attempt to send svn-src-head a note on this did not seem to = go through. I tried to interpret C11, C99, and part of C++11 on the point for = C11/C99's allowed value representations, other than the familiar/common = 2's complement. As usual for me this is based on just the language = standards. Other standards may have other rules. I'm including it below. May be it will make it though this time? =3D=3D=3D Mark Millard markmi at dsl-only.net On 2016-Mar-3, at 3:22 AM, Mark Millard <markmi at dsl-only.net> wrote: [Trying again with a corrected E-mail address.] What does FreeBSD support of the the possible implementation-defined = aspects for signed-integral value representations for C? C++? I ask = because of 1's complement and signed magnitude as reported on below. . . [I'm not covering signed conversion to less precision in the below = wording.] [First a note: conversion vs. promotion Promotions and conversions do not have equivalent rules if I remember = right, which can make the distinction important. 0 is of type int already and does not get promoted before the value is = used by ~. ~0 is also of type int and is only later subject to possible conversion, = not promotion. (As worded this presumes any "negative zero" that might result is not a = trap representation. See below.) ] As I understand the modern rules from reading the C11 and C99 standards: One's complement: If "negative zero" is a trap representation then ~0 is undefined. (Also = true for &, |, ^, <<, and >> use with operands that would otherwise = produce such a trap representation.) Otherwise ~0 is represented as -0 ("negative zero"). That -0 compares as = -0 =3D=3D 0 and the like. "Sign extension" (conversion) of signed = integral types to no-less precision (still signed) is value preserving = when no trap representation is involved, so the overall result is then = some value representation of zero: possibly "negative zero" but = alternately just zero: "if the value can be represented by the new type, = it is unchanged". (The mathematical-value is unchanged, not necessarily = the representation.) Later conversion to an unsigned integral type would not convert to a = non-zero value: "if the value can be represented by the new type, it is = unchanged". (That is a mathematical-value preserving statement, not a = representation statement.) So in this context the unsigned result has = the zero value-representation for its precision even if the conversion = starts with a "negative zero". signed magnitude:=20 signed magnitude ~0 has value representation all-ones with value = -INT_MAX. "Sign extension" (conversion) of signed integral types to = no-less precision (still signed) is value preserving when no trap = representation is involved. All-ones would not be value preserving for = greater precision. Instead zeros fill the "new" magnitude = value-representation bits and the sign bit and the old "magnitude bits" = are preserved. Later conversion to an unsigned integral value of an unsigned integral = type with, say, IVMAX as its maximum value then (effectively) = mathematically adds the mathematical value (IVMAX+1) to bring the signed = value into into the range of the unsigned integral type. So = mathematically: (-INT_MAX)+(IVMAX+1) =3D IVMAX - (INT_MAX-1). Two's complement: I'll not cover this (common and familiar). C++11's fit with the above: There are notes in C++11 about "if the underlying type as padding bits, = trap bits, or alternate representations of the same value" (such as for = compare-and-exchange). So the concepts are involved. C++11 allows 2's complement, 1's complement, and signed magnitude as = examples. But its wording allows more: "integral types shall define = values by use of a pure binary numeration system" (with a foot note = giving more detail). For conversions: "If the destination type is unsigned, the resulting = value is the least unsigned integer congruent to the source integer" = (modulo 2**precision). (I'm using ** for "raised to the power".) Also: = "If the destination type is signed, the value is unchanged if it can be = represented in the destination type (and bit-field width); otherwise the = value is implementation defined." [Unfortunately there is no definition given of "congruent". It is likely = intended as a modular arithmetic congruence relation: "a congruent_to b = (mode n)" meaning (a-b) is an integral multiple of n. So: least = non-negative m such that (source_integer - m) is a integral multiple of = (2**precision). I do not expect that this would contradict the above = C11/C99 material for the 3 value representations that C11/C99 allow.] =3D=3D=3D Mark Millard markmi at dsl-only.net
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3B2E571A-C682-4BAD-8DEE-12DE29AAD33C>