| ... | ... | @@ -2940,17 +2940,24 @@ pub const Value = extern union { |
| 2940 | 2940 | } |
| 2941 | 2941 | |
| 2942 | 2942 | pub fn intToFloat(val: Value, arena: Allocator, int_ty: Type, float_ty: Type, target: Target) !Value { |
| 2943 | return intToFloatAdvanced(val, arena, int_ty, float_ty, target, null) catch |err| switch (err) { |
| 2944 | error.OutOfMemory => return error.OutOfMemory, |
| 2945 | else => unreachable, |
| 2946 | }; |
| 2947 | } |
| 2948 | |
| 2949 | pub fn intToFloatAdvanced(val: Value, arena: Allocator, int_ty: Type, float_ty: Type, target: Target, sema_kit: ?Module.WipAnalysis) !Value { |
| 2943 | 2950 | if (int_ty.zigTypeTag() == .Vector) { |
| 2944 | 2951 | const result_data = try arena.alloc(Value, int_ty.vectorLen()); |
| 2945 | 2952 | for (result_data) |*scalar, i| { |
| 2946 | | scalar.* = try intToFloatScalar(val.indexVectorlike(i), arena, float_ty.scalarType(), target); |
| 2953 | scalar.* = try intToFloatScalar(val.indexVectorlike(i), arena, float_ty.scalarType(), target, sema_kit); |
| 2947 | 2954 | } |
| 2948 | 2955 | return Value.Tag.aggregate.create(arena, result_data); |
| 2949 | 2956 | } |
| 2950 | | return intToFloatScalar(val, arena, float_ty, target); |
| 2957 | return intToFloatScalar(val, arena, float_ty, target, sema_kit); |
| 2951 | 2958 | } |
| 2952 | 2959 | |
| 2953 | | pub fn intToFloatScalar(val: Value, arena: Allocator, float_ty: Type, target: Target) !Value { |
| 2960 | pub fn intToFloatScalar(val: Value, arena: Allocator, float_ty: Type, target: Target, sema_kit: ?Module.WipAnalysis) !Value { |
| 2954 | 2961 | switch (val.tag()) { |
| 2955 | 2962 | .undef, .zero, .one => return val, |
| 2956 | 2963 | .the_only_possible_value => return Value.initTag(.zero), // for i0, u0 |
| ... | ... | @@ -2970,6 +2977,22 @@ pub const Value = extern union { |
| 2970 | 2977 | const float = bigIntToFloat(limbs, false); |
| 2971 | 2978 | return floatToValue(float, arena, float_ty, target); |
| 2972 | 2979 | }, |
| 2980 | .lazy_align => { |
| 2981 | const ty = val.castTag(.lazy_align).?.data; |
| 2982 | if (sema_kit) |sk| { |
| 2983 | return intToFloatInner((try ty.abiAlignmentAdvanced(target, .{ .sema_kit = sk })).scalar, arena, float_ty, target); |
| 2984 | } else { |
| 2985 | return intToFloatInner(ty.abiAlignment(target), arena, float_ty, target); |
| 2986 | } |
| 2987 | }, |
| 2988 | .lazy_size => { |
| 2989 | const ty = val.castTag(.lazy_size).?.data; |
| 2990 | if (sema_kit) |sk| { |
| 2991 | return intToFloatInner((try ty.abiSizeAdvanced(target, .{ .sema_kit = sk })).scalar, arena, float_ty, target); |
| 2992 | } else { |
| 2993 | return intToFloatInner(ty.abiSize(target), arena, float_ty, target); |
| 2994 | } |
| 2995 | }, |
| 2973 | 2996 | else => unreachable, |
| 2974 | 2997 | } |
| 2975 | 2998 | } |