implemented some missing libm functions too
diff --git a/aos/build/libgcc-additions/libm.c b/aos/build/libgcc-additions/libm.c
new file mode 100644
index 0000000..ce04ce5
--- /dev/null
+++ b/aos/build/libgcc-additions/libm.c
@@ -0,0 +1,47 @@
+// Some of the Compiler-RT implementations we use want to use functions from
+// libm. However, GCC provides builtins for them, so they don't need to show up
+// in <math.h> Unfortunately, those GCC builtins seem to (sometimes, at least)
+// just emit calls to the functions themselves, so we have our own
+// implementations here. They might not be as fast as they could be, but they
+// are correct as far as I can tell.
+
+#include <stdint.h>
+
+double fmax(double a, double b) {
+ if (__builtin_isnan(a)) return b;
+ if (__builtin_isnan(b)) return a;
+ if (a > b) return a;
+ return b;
+}
+float fmaxf(float a, float b) {
+ if (__builtin_isnan(a)) return b;
+ if (__builtin_isnan(b)) return a;
+ if (a > b) return a;
+ return b;
+}
+
+double scalbn(double x, int exp) {
+ return x * (2 << exp);
+}
+float scalbnf(float x, int exp) {
+ return x * (2 << exp);
+}
+
+float logbf(float x) {
+ union {
+ float f;
+ int32_t d;
+ } converter;
+ converter.f = x;
+ int32_t ix = converter.d & 0x7fffffff;
+ int32_t rix;
+
+ if (ix == 0) {
+ return (float)-1.0 / __builtin_fabsf(x);
+ } else if (ix >= 0x7f800000) {
+ return x * x;
+ } else if (__builtin_expect((rix = ix >> 23) == 0, 0)) {
+ rix -= __builtin_clz(ix) - 9;
+ }
+ return (float)(rix - 127);
+}