From 90593fe6ae1a66ea5037140d14c7666fd073894c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 11 Apr 2020 21:34:55 +0100 Subject: Endian specific floating point types (e.g. f32be) --- src/ir_print.cpp | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) (limited to 'src/ir_print.cpp') diff --git a/src/ir_print.cpp b/src/ir_print.cpp index 32cc3809d..ebb729420 100644 --- a/src/ir_print.cpp +++ b/src/ir_print.cpp @@ -449,6 +449,13 @@ void ir_print_type(irFileBuffer *f, irModule *m, Type *t, bool in_struct) { case Basic_f32: ir_write_str_lit(f, "float"); return; case Basic_f64: ir_write_str_lit(f, "double"); return; + + case Basic_f32le: ir_write_str_lit(f, "float"); return; + case Basic_f64le: ir_write_str_lit(f, "double"); return; + + case Basic_f32be: ir_write_str_lit(f, "float"); return; + case Basic_f64be: ir_write_str_lit(f, "double"); return; + // case Basic_complex32: ir_write_str_lit(f, "%%..complex32"); return; case Basic_complex64: ir_write_str_lit(f, "%..complex64"); return; case Basic_complex128: ir_write_str_lit(f, "%..complex128"); return; @@ -834,6 +841,8 @@ void ir_print_exact_value(irFileBuffer *f, irModule *m, ExactValue value, Type * type = core_type(type); u64 u_64 = bit_cast(value.value_float); u32 u_32 = bit_cast(cast(f32)value.value_float); + + #if 0 switch (type->Basic.kind) { case Basic_f32: @@ -861,13 +870,38 @@ void ir_print_exact_value(irFileBuffer *f, irModule *m, ExactValue value, Type * } #else switch (type->Basic.kind) { - case Basic_f32: { + case Basic_f32: ir_fprintf(f, "bitcast (i32 %u to float)", u_32); break; - } + case Basic_f32le: + if (build_context.endian_kind != TargetEndian_Little) { + u_32 = gb_endian_swap32(u_32); + } + ir_fprintf(f, "bitcast (i32 %u to float)", u_32); + break; + case Basic_f32be: + if (build_context.endian_kind != TargetEndian_Big) { + u_32 = gb_endian_swap32(u_32); + } + ir_fprintf(f, "bitcast (i32 %u to float)", u_32); + break; + case Basic_f64: ir_fprintf(f, "0x%016llx", u_64); break; + case Basic_f64le: + if (build_context.endian_kind != TargetEndian_Little) { + u_64 = gb_endian_swap64(u_64); + } + ir_fprintf(f, "0x%016llx", u_64); + break; + case Basic_f64be: + if (build_context.endian_kind != TargetEndian_Big) { + u_64 = gb_endian_swap64(u_64); + } + ir_fprintf(f, "0x%016llx", u_64); + break; + default: ir_fprintf(f, "0x%016llx", u_64); break; -- cgit v1.2.3