llvm codegen: fix f16,f32,f64 nan bitcasts
@bitCast from integer NaN representation to float NaN resulted in changed bits in float. This only happened with signaled NaN. - added test for signaled NaN - added tests for quiet NaN (for completeness) closes #14198
This commit is contained in:
committed by
Andrew Kelley
parent
b89158d6fd
commit
e0fb4c29cb
@@ -3287,15 +3287,24 @@ pub const DeclGen = struct {
|
||||
.Float => {
|
||||
const llvm_ty = try dg.lowerType(tv.ty);
|
||||
switch (tv.ty.floatBits(target)) {
|
||||
16 => if (intrinsicsAllowed(tv.ty, target)) {
|
||||
return llvm_ty.constReal(tv.val.toFloat(f16));
|
||||
} else {
|
||||
16 => {
|
||||
const repr = @bitCast(u16, tv.val.toFloat(f16));
|
||||
const llvm_i16 = dg.context.intType(16);
|
||||
const int = llvm_i16.constInt(repr, .False);
|
||||
return int.constBitCast(llvm_ty);
|
||||
},
|
||||
32, 64 => return llvm_ty.constReal(tv.val.toFloat(f64)),
|
||||
32 => {
|
||||
const repr = @bitCast(u32, tv.val.toFloat(f32));
|
||||
const llvm_i32 = dg.context.intType(32);
|
||||
const int = llvm_i32.constInt(repr, .False);
|
||||
return int.constBitCast(llvm_ty);
|
||||
},
|
||||
64 => {
|
||||
const repr = @bitCast(u64, tv.val.toFloat(f64));
|
||||
const llvm_i64 = dg.context.intType(64);
|
||||
const int = llvm_i64.constInt(repr, .False);
|
||||
return int.constBitCast(llvm_ty);
|
||||
},
|
||||
80 => {
|
||||
const float = tv.val.toFloat(f80);
|
||||
const repr = std.math.break_f80(float);
|
||||
|
||||
Reference in New Issue
Block a user