Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6550,6 +6550,8 @@ Buf *codegen_generate_builtin_source(CodeGen *g) {
"\n"
" pub const Float = struct {\n"
" bits: u8,\n"
" exponent_bits: u8,\n"
" mantissa_bits: u8,\n"
" };\n"
"\n"
" pub const Pointer = struct {\n"
Expand Down
50 changes: 48 additions & 2 deletions src/ir.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16658,14 +16658,60 @@ static ConstExprValue *ir_make_type_info_value(IrAnalyze *ira, TypeTableEntry *t
result->special = ConstValSpecialStatic;
result->type = ir_type_info_get_type(ira, "Float");

ConstExprValue *fields = create_const_vals(1);
ConstExprValue *fields = create_const_vals(3);
result->data.x_struct.fields = fields;

uint8_t exponent_bits;
uint8_t mantissa_bits;
switch (type_entry->data.floating.bit_count) {
case 16:
exponent_bits = 5;
mantissa_bits = 10;
break;

case 32:
exponent_bits = 8;
mantissa_bits = 23;
break;

case 64:
exponent_bits = 11;
mantissa_bits = 52;
break;

// extended precision. This may have an explicit integer
// bit instead of a hidden bit as in standard IEEE variants.
case 80:
exponent_bits = 15;
mantissa_bits = 64;
break;

case 128:
exponent_bits = 15;
mantissa_bits = 112;
break;

default:
zig_unreachable();
}

assert(exponent_bits + mantissa_bits + 1 == type_entry->data.floating.bit_count);

// bits: u8
ensure_field_index(result->type, "bits", 0);
fields[0].special = ConstValSpecialStatic;
fields[0].type = ira->codegen->builtin_types.entry_u8;
bigint_init_unsigned(&fields->data.x_bigint, type_entry->data.floating.bit_count);
bigint_init_unsigned(&fields[0].data.x_bigint, type_entry->data.floating.bit_count);
// exponent_bits: u8
ensure_field_index(result->type, "exponent_bits", 1);
fields[1].special = ConstValSpecialStatic;
fields[1].type = ira->codegen->builtin_types.entry_u8;
bigint_init_unsigned(&fields[1].data.x_bigint, exponent_bits);
// mantissa_bits: u8
ensure_field_index(result->type, "mantissa_bits", 2);
fields[2].special = ConstValSpecialStatic;
fields[2].type = ira->codegen->builtin_types.entry_u8;
bigint_init_unsigned(&fields[2].data.x_bigint, mantissa_bits);

break;
}
Expand Down
14 changes: 14 additions & 0 deletions test/cases/type_info.zig
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,23 @@ fn testIntFloat() void {
assert(!u8_info.Int.is_signed);
assert(u8_info.Int.bits == 8);

const f32_info = @typeInfo(f32);
assert(TypeId(f32_info) == TypeId.Float);
assert(f32_info.Float.bits == 32);
assert(f32_info.Float.exponent_bits == 8);
assert(f32_info.Float.mantissa_bits == 23);

const f64_info = @typeInfo(f64);
assert(TypeId(f64_info) == TypeId.Float);
assert(f64_info.Float.bits == 64);
assert(f64_info.Float.exponent_bits == 11);
assert(f64_info.Float.mantissa_bits == 52);

const f128_info = @typeInfo(f128);
assert(TypeId(f128_info) == TypeId.Float);
assert(f128_info.Float.bits == 128);
assert(f128_info.Float.exponent_bits == 15);
assert(f128_info.Float.mantissa_bits == 112);
}

test "type info: pointer type info" {
Expand Down