aboutsummaryrefslogtreecommitdiff
path: root/src/ir_print.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-04-11 21:34:55 +0100
committergingerBill <bill@gingerbill.org>2020-04-11 21:34:55 +0100
commit90593fe6ae1a66ea5037140d14c7666fd073894c (patch)
tree9afa3504eed1addf0e1ef5f8e76dbd7a25dfacdc /src/ir_print.cpp
parent16b4178b8a9bb132e4b2361b95b53f791162a445 (diff)
Endian specific floating point types (e.g. f32be)
Diffstat (limited to 'src/ir_print.cpp')
-rw-r--r--src/ir_print.cpp38
1 files changed, 36 insertions, 2 deletions
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<u64>(value.value_float);
u32 u_32 = bit_cast<u32>(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;