3 ms·
> Sadly, at some point, new hardware makes software tricks obsolete. On x86, said new hardware was the F16C instruction set, which (amongst other things) adds a
by Joker_vD 4y ago
> Sadly, at some point, new hardware makes software tricks obsolete. On x86, said new hardware was the F16C instruction set, which (amongst other things) adds a VCVTPS2PH instruction for converting (a vector of) FP32 to FP16.
"Sadly"? That's subjective, I guess: I personally feel that the less "softfloat" code there is in use around, the better. All this twisted bitshifting/juggling with conditional propagation is pretty well suited for baking into sillicon.
- kzrdude 4y agoThe converse is also deserving of a 'sadly': the new hardware features can be widely available but still hard to use since they are not going to be used by platform defaults when you compile your program.
- stephencanon 4y agoF16C has been available for well over a decade (it was introduced in the Ivybridge uArch), and the equivalent conversions are supported on all ARMv7 CPUs since around the same time (and all ARMv8 CPUs unconditionally); most software should be able to safely assume their availability by now. There exist some niches where this doesn’t hold, but that’s why we have software fallbacks.
- corsix 4y agoThe first niche that came to mind was x86 code running under Rosetta 2; despite ARM having an equivalent to F16C, Rosetta 2 doesn’t translate AVX, and F16C doesn’t have a non-AVX encoding.
- stephencanon 4y agoIndeed. Worth noting that Accelerate.framework provides fast and correct bulk f16 <-> f32 conversions as `vImageConvert_Planar16FtoPlanarF` and `vImageConvert_PlanarFtoPlanar16F`, and that the arm conversion instructions are unconditionally available for apps that compile for arm64 (they're part of the base ARMv8 ISA), so any _new_ code shouldn't need to worry about this.
- diydsp 4y agoIm solving this problem by writing fp16 routines for 6502 :)
- fuzzfactor 4y agoIn my case it wasn't exactly conversion but I had pages of FORTRAN algorithm based on precision numerical constants in FP32, and the outcome needed to be mimicked in 8-bit BASIC using 0.5K of memory for program plus data. Not enough memory to even store the text of the FORTRAN code. Integer math was required :/