On 11/18/12 13:58, Manu wrote:
> On 18 November 2012 14:51, Artur Skawina <art.08...@gmail.com 
> <mailto:art.08...@gmail.com>> wrote:
> 
>     On 11/18/12 12:21, Manu wrote:
>     > I've often wondered about having an official 'half' type.
>     > It's very common in rendering/image processing, supported by most video 
> cards (so compression routines interacting with this type are common), and 
> it's also supported in hardware by some cpu's.
>     >
>     > ARM for instance supports 'half's in hardware, and GCC has an __fp16 
> type which would map nicely if D supported the type in the front end.
>     >
>     > The alternative us to use ushort everywhere, which is awkward, because 
> it is neither unsigned, nor is it an integer, and it's not typesafe (allows 
> direct assignment to ints and stuff)...
>     > It would be nice if: cast(half)someFloat would yield the proper value, 
> even if it is performed in software in most architectures, it could be mapped 
> to hardware for those that do it.
>     >
>     > It could be done in a library, but then GCC couldn't map it properly to 
> the hardware type, and since D has no way to describe implicit casts (that I 
> know of?) it becomes awkward to use.
>     > someFloat = someHalf <- doesn't work, because a cast operator expects 
> an explicit cast, even though this is a lossless conversion and should be 
> exactly the same as someDouble = someFloat.
>     >
>     > Thoughts?
> 
>        version (GNU) alias half = @gcc[mode(HF)] float;
> 
>     But of course this won't work right now, cause that kind of type 
> attributes
>     aren't supported yet. 'pragma' can't be used on types either (otherwise
>     something like "alias half = pragma(attribute, mode("HF")) float;" could 
> be
>     made to work).
> 
>     And - yes - the /proper/ way would be eg
> 
>        alias half = @core[size=2] float;
>              // or '@core.size(2)' or any other syntax.
> 
>     For now, a struct + alias-this-getter might be enough, for a s/w 
> implementation.
> 
> 
> Yes, that's what I and everyone else does, but that's not the point of the 
> topic...
> I think it's a fundamental datatype, and it deserves the same casting/type 
> conversion/type safety rules as ints and floats, and it would also be useful 
> to map it to hardware (which GDC can easily do).

All of the 'half' definitions above would give you a 'fundamental' datatype --
-- there is no reason to make it a /language/-defined type. The work required
to implement things like implicit conversions can be done more generically;
right now the problem is the lack of a way to define such types.

   alias fp24 = @core[exp=7, mant=16] float; // It's only a matter of time until
                                             // someone asks for it&co...       
                                       

Also, *every* user- (or in this case more likely lib-) defined data type 
deserves
the same control over casting and conversions as built-in types. No, D doesn't
have that and yes - it is a problem.

I actually think these types /should/ be done as structs, but
a) it isn't currently possible (also for reasons other than the above mentioned 
ones)
and
b) such aliases would /still/ be useful for mapping to "magic" 
compiler-supported
   h/w types. 

artur

Reply via email to