diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-11-22 00:13:52 +0000 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-11-22 00:13:52 +0000 |
| commit | 36ad9dae43cd21d8532994cd0d0e92a89af0ed04 (patch) | |
| tree | 2ab180093e4d5ac1e6ed39ed3b8ce5437255ffb5 /src/ssa_print.cpp | |
| parent | 24347ced45aabd3ce4f4a261b8140a976cadff2e (diff) | |
128 bit integers
Kind of works but may be buggy due to LLVM not actually sure
Diffstat (limited to 'src/ssa_print.cpp')
| -rw-r--r-- | src/ssa_print.cpp | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/src/ssa_print.cpp b/src/ssa_print.cpp index e02c58513..2f074008d 100644 --- a/src/ssa_print.cpp +++ b/src/ssa_print.cpp @@ -146,15 +146,19 @@ void ssa_print_type(ssaFileBuffer *f, ssaModule *m, Type *t) { switch (t->Basic.kind) { case Basic_bool: ssa_fprintf(f, "i1"); break; case Basic_i8: ssa_fprintf(f, "i8"); break; - case Basic_i16: ssa_fprintf(f, "i16"); break; - case Basic_i32: ssa_fprintf(f, "i32"); break; - case Basic_i64: ssa_fprintf(f, "i64"); break; case Basic_u8: ssa_fprintf(f, "i8"); break; + case Basic_i16: ssa_fprintf(f, "i16"); break; case Basic_u16: ssa_fprintf(f, "i16"); break; + case Basic_i32: ssa_fprintf(f, "i32"); break; case Basic_u32: ssa_fprintf(f, "i32"); break; + case Basic_i64: ssa_fprintf(f, "i64"); break; case Basic_u64: ssa_fprintf(f, "i64"); break; + case Basic_i128: ssa_fprintf(f, "i128"); break; + case Basic_u128: ssa_fprintf(f, "i128"); break; + // case Basic_f16: ssa_fprintf(f, "half"); break; case Basic_f32: ssa_fprintf(f, "float"); break; case Basic_f64: ssa_fprintf(f, "double"); break; + // case Basic_f128: ssa_fprintf(f, "fp128"); break; case Basic_rawptr: ssa_fprintf(f, "%%..rawptr"); break; case Basic_string: ssa_fprintf(f, "%%..string"); break; case Basic_uint: ssa_fprintf(f, "i%lld", word_bits); break; @@ -361,16 +365,45 @@ void ssa_print_exact_value(ssaFileBuffer *f, ssaModule *m, ExactValue value, Typ } } break; case ExactValue_Float: { + GB_ASSERT(is_type_float(type)); + type = base_type(type); u64 u = *cast(u64*)&value.value_float; - if (is_type_float(type) && type->Basic.kind == Basic_f32) { + switch (type->Basic.kind) { + case Basic_f32: // IMPORTANT NOTE(bill): LLVM requires all floating point constants to be // a 64 bit number if bits_of(float type) <= 64. - // For some bizarre reason, you need to clear the bottom 29 bits // https://groups.google.com/forum/#!topic/llvm-dev/IlqV3TbSk6M + // 64 bit mantissa: 52 bits + // 32 bit mantissa: 23 bits + // 29 == 52-23 u >>= 29; u <<= 29; + break; + } + + switch (type->Basic.kind) { + case 0: break; +#if 0 + case Basic_f16: + ssa_fprintf(f, "bitcast ("); + ssa_print_type(f, m, t_u16); + ssa_fprintf(f, " %u to ", cast(u16)f32_to_f16(cast(f32)value.value_float)); + ssa_print_type(f, m, t_f16); + ssa_fprintf(f, ")"); + break; + case Basic_f128: + ssa_fprintf(f, "bitcast ("); + ssa_fprintf(f, "i128"); + // TODO(bill): Actually support f128 + ssa_fprintf(f, " %llu to ", u); + ssa_print_type(f, m, t_f128); + ssa_fprintf(f, ")"); + break; +#endif + default: + ssa_fprintf(f, "0x%016llx", u); + break; } - ssa_fprintf(f, "0x%016llx", u); } break; case ExactValue_Pointer: if (value.value_pointer == NULL) { |