aboutsummaryrefslogtreecommitdiff
path: root/src/ir_print.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-04-01 10:06:00 +0100
committergingerBill <bill@gingerbill.org>2021-04-01 10:06:00 +0100
commit54e6c507698bf68b040400783f05686cacaddff1 (patch)
treeebe699d8a059f4e76e0a99494823d4cc3e3bcc1d /src/ir_print.cpp
parenta00d7cc705668da8a8b1a6ebd52668b5e9087bb9 (diff)
Implement `f16` functionality
Diffstat (limited to 'src/ir_print.cpp')
-rw-r--r--src/ir_print.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/ir_print.cpp b/src/ir_print.cpp
index 1b35247c4..d0c014a27 100644
--- a/src/ir_print.cpp
+++ b/src/ir_print.cpp
@@ -418,21 +418,24 @@ void ir_print_type(irFileBuffer *f, irModule *m, Type *t, bool in_struct) {
}
return;
- // case Basic_f16: ir_write_str_lit(f, "half"); return;
- case Basic_f32: ir_write_str_lit(f, "float"); return;
- case Basic_f64: ir_write_str_lit(f, "double"); return;
+ case Basic_f16: ir_write_str_lit(f, "half"); return;
+ case Basic_f32: ir_write_str_lit(f, "float"); return;
+ case Basic_f64: ir_write_str_lit(f, "double"); return;
+ case Basic_f16le: ir_write_str_lit(f, "half"); return;
case Basic_f32le: ir_write_str_lit(f, "float"); return;
case Basic_f64le: ir_write_str_lit(f, "double"); return;
+ case Basic_f16be: ir_write_str_lit(f, "half"); 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_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;
+ case Basic_quaternion64: ir_write_str_lit(f, "%..quaternion64"); return;
case Basic_quaternion128: ir_write_str_lit(f, "%..quaternion128"); return;
case Basic_quaternion256: ir_write_str_lit(f, "%..quaternion256"); return;
@@ -873,6 +876,23 @@ void ir_print_exact_value(irFileBuffer *f, irModule *m, ExactValue value, Type *
}
#else
switch (type->Basic.kind) {
+ case Basic_f16:
+ ir_fprintf(f, "fptrunc (float bitcast (i32 %u to float) to half)", u_32);
+ break;
+ case Basic_f16le:
+ if (build_context.endian_kind != TargetEndian_Little) {
+ u_32 = gb_endian_swap32(u_32);
+ }
+ ir_fprintf(f, "fptrunc (float bitcast (i32 %u to float) to half)", u_32);
+ break;
+ case Basic_f16be:
+ if (build_context.endian_kind != TargetEndian_Big) {
+ u_32 = gb_endian_swap32(u_32);
+ }
+ ir_fprintf(f, "fptrunc (float bitcast (i32 %u to float) to half)", u_32);
+ break;
+
+
case Basic_f32:
ir_fprintf(f, "bitcast (i32 %u to float)", u_32);
break;