From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,LOTS_OF_MONEY autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,7e15102eb14c0020 X-Google-NewGroupId: yes X-Google-Attributes: gida07f3367d7,domainid0,public,usenet X-Google-Language: ENGLISH,ASCII Received: by 10.66.78.40 with SMTP id y8mr2896174paw.9.1352066455287; Sun, 04 Nov 2012 14:00:55 -0800 (PST) Path: s9ni80346pbb.0!nntp.google.com!news.glorb.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Bill Findlay Newsgroups: comp.lang.ada Subject: Re: highest bit, statically determined Date: Sun, 04 Nov 2012 22:00:52 +0000 Message-ID: References: <50673111$0$9505$9b4e6d93@newsspool1.arcor-online.net> Mime-Version: 1.0 X-Trace: individual.net 9TW1au1Wsir3W3SvqW0eeQ+XkC35nCElVGNJ6cxCJP8bRZRYehuF84pL2lSj7c/Mzo Cancel-Lock: sha1:W96ekPw51RjumsBn2ALVrAdIXLA= User-Agent: Microsoft-Entourage/12.33.0.120411 Thread-Topic: highest bit, statically determined Thread-Index: Ac2619sWEmBxip367UqD6tFn2feC2w== Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 8bit Date: 2012-11-04T22:00:52+00:00 List-Id: On 04/11/2012 20:45, in article op.wm9nx2i3ule2fv@cardamome, "Yannick Duch�ne (Hibou57)" wrote: > Le Sat, 29 Sep 2012 21:16:01 +0200, Bill Findlay > a �crit: > >> >> On 29/09/2012 19:57, in article >> CC8D0314.1E2CC%yaldnif.w@blueyonder.co.uk, >> "Bill Findlay" wrote: >> >>> On 29/09/2012 18:34, in article >>> 50673111$0$9505$9b4e6d93@newsspool1.arcor-online.net, "Georg Bauhaus" >>> wrote: >>> >>>> Is there a shorter/better way of having the compiler >>>> find the highest bit = 1 in a static numeric constant? >>>> >>>> If N is such a constant, e.g. Some_Type'Last where >>>> Some_Type'Size = 8 and its bound are static, then >>>> >>>> Highest_Bit_In_Octet : constant := >>>> Natural'Max >>>> (8 * Boolean'Pos (N / 2**7 > 0), >>>> Natural'Max >>>> (7 * Boolean'Pos (N / 2**6 > 0), >>>> Natural'Max >>>> (6 * Boolean'Pos (N / 2**5 > 0), >>>> Natural'Max >>>> (5 * Boolean'Pos (N / 2**4 > 0), >>>> Natural'Max >>>> (4 * Boolean'Pos (N / 2**3 > 0), >>>> Natural'Max >>>> (3 * Boolean'Pos (N / 2**2 > 0), >>>> Natural'Max >>>> (2 * Boolean'Pos (N / 2**1 > 0), >>>> Natural'Max >>>> (1 * Boolean'Pos (N / 2**0 > 0), 0)))))))); >>> >>> In my experience that sort of code, applied in non-static cases, is less >>> efficient than one would hope, and more obvious code works faster. >>> >>> Something like the following can be readily extended to greater operand >>> widths: >>> >>> function first_1_bit (y : octet) >>> return Natural is >>> x : octet; >>> r : Natural; >>> begin >>> if y = 0 then return 0; end if; >>> >>> if (y / 16) /= 0 then >>> r := 4; x := y / 16; >>> else >>> r := 0; x := y; >>> end if; >>> >>> if (x / 4) /= 0 then >>> r := r + 2; x := x / 4; >>> end if; >>> >>> if (x / 2) /= 0 then >>> r := r + 1; >>> end if; >>> >>> return r + 1; >>> end first_1_bit; >>> >>> It looks fairly inline-able, and foldable for a static value of y. >> >> I can now confirm that with GNAT GPL 2012 at -O3 it does inline and fold, >> but I now see that you want the result to be static as well as the >> operand, >> and this does not achieve that. >> > > What means folding in this context? Compile-time evaluation, so that the end result is a compile-time known (I do not say static, as that is a term of art in Ada) value. -- Bill Findlay with blueyonder.co.uk; use surname & forename;