Zig 0.17.0-dev (Split by item)
This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig library itself.
Zig › compiler_rt/ › extendf.zig › extendf
extendf
extendf.extendf
pub inline fn extendf (
comptime dst_t : type ,
comptime src_t : type ,
a : @Int (.unsigned , @typeInfo (src_t ).float .bits ),
) dst_t
File
Code
pub inline fn extendf (
comptime dst_t : type ,
comptime src_t : type ,
a : @Int (.unsigned , @typeInfo (src_t ).float .bits ),
) dst_t {
const src_rep_t = @Int (.unsigned , @typeInfo (src_t ).float .bits );
const dst_rep_t = @Int (.unsigned , @typeInfo (dst_t ).float .bits );
const srcSigBits = std .math .floatMantissaBits (src_t );
const dstSigBits = std .math .floatMantissaBits (dst_t );
// Any reasonable optimizer will fold and propagate all of these.
const srcBits = @bitSizeOf (src_t );
const srcExpBits = srcBits - srcSigBits - 1 ;
const srcInfExp = (1 << srcExpBits ) - 1 ;
const srcExpBias = srcInfExp >> 1 ;
const srcMinNormal = 1 << srcSigBits ;
const srcInfinity = srcInfExp << srcSigBits ;
const srcSignMask = 1 << (srcSigBits + srcExpBits );
const srcAbsMask = srcSignMask - 1 ;
const srcQNaN = 1 << (srcSigBits - 1 );
const srcNaNCode = srcQNaN - 1 ;
const dstBits = @bitSizeOf (dst_t );
const dstExpBits = dstBits - dstSigBits - 1 ;
const dstInfExp = (1 << dstExpBits ) - 1 ;
const dstExpBias = dstInfExp >> 1 ;
const dstMinNormal : dst_rep_t = @as (dst_rep_t , 1 ) << dstSigBits ;
const aRep : src_rep_t = @bitCast (a );
const aAbs : src_rep_t = aRep & srcAbsMask ;
const sign : src_rep_t = aRep & srcSignMask ;
var absResult : dst_rep_t = undefined ;
if (aAbs -% srcMinNormal < srcInfinity - srcMinNormal ) {
// Extend to the destination type by shifting the significand and
// exponent into the proper position and rebiasing the exponent.
absResult = @as (dst_rep_t , aAbs ) << (dstSigBits - srcSigBits );
absResult += (dstExpBias - srcExpBias ) << dstSigBits ;
} else if (aAbs >= srcInfinity ) {
// Conjure the result by beginning with infinity, then setting the qNaN
// bit (if needed) and right-aligning the rest of the trailing NaN
// payload field.
absResult = dstInfExp << dstSigBits ;
absResult |= @as (dst_rep_t , aAbs & srcQNaN ) << (dstSigBits - srcSigBits );
absResult |= @as (dst_rep_t , aAbs & srcNaNCode ) << (dstSigBits - srcSigBits );
} else if (aAbs != 0 ) {
// renormalize the significand and clear the leading bit, then insert
// the correct adjusted exponent in the destination type.
const scale : u32 = @clz (aAbs ) - @clz (@as (src_rep_t , srcMinNormal ));
absResult = @as (dst_rep_t , aAbs ) << @intCast (dstSigBits - srcSigBits + scale );
absResult ^= dstMinNormal ;
const resultExponent : u32 = dstExpBias - srcExpBias - scale + 1 ;
absResult |= @as (dst_rep_t , @intCast (resultExponent )) << dstSigBits ;
} else {
absResult = 0 ;
}
const result : dst_rep_t align (@alignOf (dst_t )) = absResult | @as (dst_rep_t , sign ) << (dstBits - srcBits );
return @bitCast (result );
}