aboutsummaryrefslogtreecommitdiff
path: root/src/ir.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.cpp
parenta00d7cc705668da8a8b1a6ebd52668b5e9087bb9 (diff)
Implement `f16` functionality
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp39
1 files changed, 28 insertions, 11 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 34d4f79c1..9fb06582d 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -2052,24 +2052,27 @@ irDebugEncoding ir_debug_encoding_for_basic(BasicKind kind) {
case Basic_uintptr:
return irDebugBasicEncoding_unsigned;
- // case Basic_f16:
+ case Basic_f16:
case Basic_f32:
case Basic_f64:
+ case Basic_f16le:
case Basic_f32le:
case Basic_f64le:
+ case Basic_f16be:
case Basic_f32be:
case Basic_f64be:
return irDebugBasicEncoding_float;
- // case Basic_complex32:
+ case Basic_complex32:
case Basic_complex64:
case Basic_complex128:
+ case Basic_quaternion64:
+ case Basic_quaternion128:
+ case Basic_quaternion256:
case Basic_cstring:
case Basic_string:
case Basic_any:
case Basic_rawptr:
- case Basic_quaternion128:
- case Basic_quaternion256:
break; // not a "DIBasicType"
}
@@ -2549,9 +2552,9 @@ irDebugInfo *ir_add_debug_info_type(irModule *module, Type *type, Entity *e, irD
if (type->kind == Type_Basic) {
switch (type->Basic.kind) {
// Composite basic types
- case Basic_complex64: case Basic_complex128:
+ case Basic_complex32: case Basic_complex64: case Basic_complex128:
return ir_add_debug_info_type_complex(module, type);
- case Basic_quaternion128: case Basic_quaternion256:
+ case Basic_quaternion64: case Basic_quaternion128: case Basic_quaternion256:
return ir_add_debug_info_type_quaternion(module, type);
case Basic_string:
return ir_add_debug_info_type_string(module, scope, e, type);
@@ -5430,7 +5433,9 @@ irValue *ir_emit_struct_ev(irProcedure *proc, irValue *s, i32 index) {
case 1: result_type = t_typeid; break;
}
break;
- case Basic_complex64: case Basic_complex128:
+ case Basic_complex32:
+ case Basic_complex64:
+ case Basic_complex128:
{
Type *ft = base_complex_elem_type(t);
switch (index) {
@@ -5439,7 +5444,9 @@ irValue *ir_emit_struct_ev(irProcedure *proc, irValue *s, i32 index) {
}
break;
}
- case Basic_quaternion128: case Basic_quaternion256:
+ case Basic_quaternion64:
+ case Basic_quaternion128:
+ case Basic_quaternion256:
{
Type *ft = base_complex_elem_type(t);
switch (index) {
@@ -5828,6 +5835,7 @@ irValue *ir_emit_byte_swap(irProcedure *proc, irValue *value, Type *t) {
char const *proc_name = nullptr;
switch (sz*8) {
+ case 16: proc_name = "bswap_f16"; break;
case 32: proc_name = "bswap_f32"; break;
case 64: proc_name = "bswap_f64"; break;
}
@@ -6272,9 +6280,10 @@ bool ir_is_type_aggregate(Type *t) {
case Basic_any:
return true;
- // case Basic_complex32:
+ case Basic_complex32:
case Basic_complex64:
case Basic_complex128:
+ case Basic_quaternion64:
case Basic_quaternion128:
case Basic_quaternion256:
return true;
@@ -7025,6 +7034,7 @@ irValue *ir_emit_min(irProcedure *proc, Type *t, irValue *x, irValue *y) {
args[0] = x;
args[1] = y;
switch (sz) {
+ case 16: return ir_emit_runtime_call(proc, "min_f16", args);
case 32: return ir_emit_runtime_call(proc, "min_f32", args);
case 64: return ir_emit_runtime_call(proc, "min_f64", args);
}
@@ -7043,6 +7053,7 @@ irValue *ir_emit_max(irProcedure *proc, Type *t, irValue *x, irValue *y) {
args[0] = x;
args[1] = y;
switch (sz) {
+ case 16: return ir_emit_runtime_call(proc, "max_f16", args);
case 32: return ir_emit_runtime_call(proc, "max_f32", args);
case 64: return ir_emit_runtime_call(proc, "max_f64", args);
}
@@ -7487,6 +7498,7 @@ irValue *ir_build_builtin_proc(irProcedure *proc, Ast *expr, TypeAndValue tv, Bu
auto args = array_make<irValue *>(ir_allocator(), 1);
args[0] = x;
switch (sz) {
+ case 64: return ir_emit_runtime_call(proc, "abs_quaternion64", args);
case 128: return ir_emit_runtime_call(proc, "abs_quaternion128", args);
case 256: return ir_emit_runtime_call(proc, "abs_quaternion256", args);
}
@@ -7496,6 +7508,7 @@ irValue *ir_build_builtin_proc(irProcedure *proc, Ast *expr, TypeAndValue tv, Bu
auto args = array_make<irValue *>(ir_allocator(), 1);
args[0] = x;
switch (sz) {
+ case 32: return ir_emit_runtime_call(proc, "abs_complex32", args);
case 64: return ir_emit_runtime_call(proc, "abs_complex64", args);
case 128: return ir_emit_runtime_call(proc, "abs_complex128", args);
}
@@ -7505,6 +7518,7 @@ irValue *ir_build_builtin_proc(irProcedure *proc, Ast *expr, TypeAndValue tv, Bu
auto args = array_make<irValue *>(ir_allocator(), 1);
args[0] = x;
switch (sz) {
+ case 16: return ir_emit_runtime_call(proc, "abs_f16", args);
case 32: return ir_emit_runtime_call(proc, "abs_f32", args);
case 64: return ir_emit_runtime_call(proc, "abs_f64", args);
}
@@ -12162,11 +12176,13 @@ void ir_setup_type_info_data(irProcedure *proc) { // NOTE(bill): Setup type_info
tag = ir_emit_conv(proc, variant_ptr, t_type_info_rune_ptr);
break;
- // case Basic_f16:
+ case Basic_f16:
case Basic_f32:
case Basic_f64:
+ case Basic_f16le:
case Basic_f32le:
case Basic_f64le:
+ case Basic_f16be:
case Basic_f32be:
case Basic_f64be:
{
@@ -12185,12 +12201,13 @@ void ir_setup_type_info_data(irProcedure *proc) { // NOTE(bill): Setup type_info
break;
- // case Basic_complex32:
+ case Basic_complex32:
case Basic_complex64:
case Basic_complex128:
tag = ir_emit_conv(proc, variant_ptr, t_type_info_complex_ptr);
break;
+ case Basic_quaternion64:
case Basic_quaternion128:
case Basic_quaternion256:
tag = ir_emit_conv(proc, variant_ptr, t_type_info_quaternion_ptr);