From: Bill Findlay <findlaybill@blueyonder.co.uk>
Subject: Re: Creating several types from a base type and conversion
Date: Mon, 20 Jan 2020 16:38:11 +0000
Date: 2020-01-20T16:38:11+00:00 [thread overview]
Message-ID: <0001HW.23D60EF30285768170000F6DB2EF@news.individual.net> (raw)
In-Reply-To: lyftgcy059.fsf@pushface.org
On 18 Jan 2020, Simon Wright wrote
(in article <lyftgcy059.fsf@pushface.org>):
> "Jeffrey R. Carter"<spam.jrcarter.not@spam.not.acm.org> writes:
>
> > On 1/18/20 7:20 PM, Bill Findlay wrote:
>
> > > type word is mod 2**30;
> > >
> > > subtype word_shift_length is Natural range 0..30;
> > >
> > > function shift_word_left (W : word; amount : word_shift_length)
> > > return KDF9.word;
>
> > I don't know what KDF9.Word is, but surely you have to implement
> > these. Or are you saying GNAT magically implements them?
>
> It doesn't; 'with Import, convention => Intrinsic' requires the first
> argument to have size 8, 16, 32, or 64, and the second argument must be
> Natural (not a subtype of it, even if unconstrained).
D'oh! (Looks around for lost marbles - they are here somewhere.)
Here are extracts from theactual code for KDF9's 48-bit shift operations,
showing how they are built up from the intrinsic 64-bit shifts.
Converting this to 30-bit shifts using 32-bit intrinsics should be simple:
--
-- The fundamental emulated storage unit is the 48-bit word.
--
type word is mod 2**48;
--
-- This is the emulation host's 64-bit unsigned integer type.
--
type u_64 is mod 2**64 with Size => 64;
word_mask : constant := 8#7777777777777777#;
function as_word (u : u_64)
return word
is (word(u and word_mask));
-- This GNAT-specific pragma declares all the 64-bit shift operations.
pragma Provide_Shift_Operators (u_64);
--
-- These are the 48-bit primitive, fixed-direction, shift operations.
--
subtype word_shift_length is Natural range 0..48;
function shift_word_left (W : word; amount : word_shift_length)
return word
is (as_word(shift_left(u_64(W), amount)));
function shift_word_right (W : word; amount : word_shift_length)
return word
is (word(shift_right(u_64(W), amount)));
function rotate_word_left (W : word; amount : word_shift_length)
return word
is (shift_word_left(W, amount) or shift_word_right(W, 48-amount));
function rotate_word_right (W : word; amount : word_shift_length)
return word
is (shift_word_right(W, amount) or shift_word_left(W, 48-amount));
--
-- KDF9 shift operations actually had a signed shift amount; e.g.:
--
function shift_logical (W : word; L : signed_Q_part)
return word
is
(
if abs L > 47 then 0
elsif L < 0 then shift_word_right(W, Natural(-L))
else shift_word_left (W, Natural(+L))
);
... etc ...
Sorry for the temporary brain malfunction!
--
Bill Findlay
next prev parent reply other threads:[~2020-01-20 16:38 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-18 7:32 Creating several types from a base type and conversion Ken Roberts
2020-01-18 12:16 ` Simon Wright
2020-01-18 12:49 ` Ken Roberts
2020-01-18 14:56 ` Bill Findlay
2020-01-18 16:13 ` Jeffrey R. Carter
2020-01-18 18:20 ` Bill Findlay
2020-01-18 18:32 ` Jeffrey R. Carter
2020-01-18 20:34 ` Simon Wright
2020-01-20 16:38 ` Bill Findlay [this message]
2020-01-18 22:20 ` Ken Roberts
2020-01-18 15:09 ` Simon Wright
2020-01-18 22:16 ` Ken Roberts
2020-01-18 22:35 ` Simon Wright
2020-01-18 23:03 ` Ken Roberts
2020-01-18 23:38 ` Simon Wright
2020-01-19 0:12 ` Ken Roberts
2020-01-19 9:37 ` Simon Wright
2020-01-19 11:48 ` AdaMagica
2020-01-19 14:51 ` Simon Wright
2020-01-19 15:24 ` Niklas Holsti
2020-01-19 16:11 ` Optikos
2020-01-19 0:33 ` Ken Roberts
2020-01-19 0:07 ` Niklas Holsti
2020-01-18 15:47 ` Simon Wright
2020-01-21 21:35 ` Shark8
2020-01-21 23:06 ` Niklas Holsti
2020-01-22 1:08 ` Ken Roberts
2020-01-22 14:18 ` Ken Roberts
2020-01-22 8:37 ` Simon Wright
2020-01-22 14:32 ` Shark8
2020-01-22 15:40 ` Simon Wright
2020-01-18 14:17 ` Optikos
2020-01-18 17:57 ` Niklas Holsti
2020-01-18 22:59 ` Ken Roberts
2020-01-19 0:30 ` Niklas Holsti
2020-01-19 1:07 ` Ken Roberts
2020-01-19 3:37 ` Ken Roberts
2020-01-23 21:39 ` Optikos
2020-01-24 9:35 ` Ken Roberts
2020-01-24 10:04 ` AdaMagica
2020-01-24 12:38 ` Optikos
2020-01-24 15:01 ` Ken Roberts
2020-01-24 15:22 ` Simon Wright
2020-01-24 15:40 ` Ken Roberts
2020-01-24 15:54 ` Simon Wright
2020-01-25 10:37 ` Ken Roberts
2020-01-25 10:44 ` Ken Roberts
2020-01-25 20:26 ` Shark8
2020-01-27 14:10 ` Ken Roberts
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox