comp.lang.ada
 help / color / mirror / Atom feed
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

  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