aboutsummaryrefslogtreecommitdiff
path: root/src/bigfloat.cpp
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2018-06-27 16:20:04 +0200
committerBen Noordhuis <info@bnoordhuis.nl>2018-06-27 16:20:04 +0200
commitfd75e73ee9818f12fd81d8fdb3cb949c492d664a (patch)
tree84ee56a2ef7a65a0bbb3a7dd12f015970b4ed725 /src/bigfloat.cpp
parent1f45075a0e1d86fa110011f6cedbef61a9f6f056 (diff)
downloadzig-fd75e73ee9818f12fd81d8fdb3cb949c492d664a.tar.gz
zig-fd75e73ee9818f12fd81d8fdb3cb949c492d664a.zip
add f16 type
Add support for half-precision floating point operations. Introduce `__extendhfsf2` and `__truncsfhf2` in std/special/compiler_rt. Add `__gnu_h2f_ieee` and `__gnu_f2h_ieee` as aliases that are used in Windows builds. The logic in std/special/compiler_rt/extendXfYf2.zig has been reworked and can now operate on 16 bits floating point types. `extendXfYf2()` and `truncXfYf2()` are marked `inline` to work around a not entirely understood stack alignment issue on Windows when calling the f16 versions of the builtins. closes #1122
Diffstat (limited to 'src/bigfloat.cpp')
-rw-r--r--src/bigfloat.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/bigfloat.cpp b/src/bigfloat.cpp
index dcb6db61db..cc442fa3b7 100644
--- a/src/bigfloat.cpp
+++ b/src/bigfloat.cpp
@@ -18,6 +18,10 @@ void bigfloat_init_128(BigFloat *dest, float128_t x) {
dest->value = x;
}
+void bigfloat_init_16(BigFloat *dest, float16_t x) {
+ f16_to_f128M(x, &dest->value);
+}
+
void bigfloat_init_32(BigFloat *dest, float x) {
float32_t f32_val;
memcpy(&f32_val, &x, sizeof(float));
@@ -146,6 +150,10 @@ Cmp bigfloat_cmp(const BigFloat *op1, const BigFloat *op2) {
}
}
+float16_t bigfloat_to_f16(const BigFloat *bigfloat) {
+ return f128M_to_f16(&bigfloat->value);
+}
+
float bigfloat_to_f32(const BigFloat *bigfloat) {
float32_t f32_value = f128M_to_f32(&bigfloat->value);
float result;