On 11/18/12 16:32, Manu wrote: > On 18 November 2012 16:33, Artur Skawina <art.08...@gmail.com > <mailto:art.08...@gmail.com>> wrote: > > 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> <mailto: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. > > > I don't necessarily disagree, but you can take that logic and run with it as > far as you like. > long can easily be implemented as a struct with 2 ints, why bother with a > builtin type for that? Any answer or counter argument you can possibly give > me applies equally to half.
alias long = @core[size(int.sizeof*2)] int; I'm saying that there's no point in defining '__fp16' when '@core[size(2)] float' will also do the job. Just as "string" is not a built-in type in D. Now, this can't be done today, so until it /is/ possible, the struct solution is an option. No, it isn't perfect. But is it unusable? (honest question) Would exposing the raw __fp16 type in GDC really be a better long-term solution? [Of course that 'long' D definition is not a good one, but that's another topic] > D needs quite a few tweaks to be able to create a user defined type that is > capable of performing like a builtin type. The main limiters are custom > implicit conversion, and literal syntax definition, I know, and I'm not sure I'd use the words 'a few tweaks". :) > but it also seems really nasty to hook a library, suppress it, and alias it > to a hardware type in the case of GDC for instance. Who's to say the GDC type > behaves in exactly the same way as those defined by the D front end? The types MUST be compatible - this is also true for any "built-in" type. Any operation that isn't portable, compiler- or h/w-wise, must be either disallowed, emulated or specced as undefined behavior. Which is actually part of the reason why I'd like it wrapped in a struct - that way the compiler doesn't have to handle all the special cases and the *user* can choose between "raw" (hw-supported) versions and more generic ones that may fallback to s/w on platforms that require that. > Point is, this type should behave in EXACTLY the same way as expected when > dealing with builtin float types, it's not just some user type, it's an > established, industry-recognised precision of float. In reality it's probably > significantly easier to define it wherever the others are defined rather than > in a new library all on its own. > I'd also argue that 'half' is far more valuable to modern computing than > 'real'. > > Anyway, the point is, we all already use libraries for half, offering library > solutions misses the point of the topic. > The question I raised is: SHOULD half be a builtin type? Well, no - it shouldn't. For a simple reason - it's not universally available. And the people using it won't usually be ok with pure s/w emulation. But, yes - it should be accessible on platforms that do support it. artur