summaryrefslogtreecommitdiffstatshomepage
path: root/stmhal/math.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-03-23 00:34:49 +0000
committerDamien George <damien.p.george@gmail.com>2014-03-23 00:34:49 +0000
commit5a16658b219cc4ddfe12d6a541aaeb2b5160c90d (patch)
treed1f9fc5c84040e7af3ab265feca3847fa03e469c /stmhal/math.c
parente43e27cf79910a1a9235db0cdaa439f575c49e53 (diff)
downloadmicropython-5a16658b219cc4ddfe12d6a541aaeb2b5160c90d.tar.gz
micropython-5a16658b219cc4ddfe12d6a541aaeb2b5160c90d.zip
stmhal: Copy changes to math.c from stm port.
Diffstat (limited to 'stmhal/math.c')
-rw-r--r--stmhal/math.c51
1 files changed, 41 insertions, 10 deletions
diff --git a/stmhal/math.c b/stmhal/math.c
index cdb55a8ada..9197d850c8 100644
--- a/stmhal/math.c
+++ b/stmhal/math.c
@@ -1,18 +1,49 @@
#include <stdint.h>
-#include <math.h>
-
-// these 2 functions seem to actually work... no idea why
-// replacing with libgcc does not work (probably due to wrong calling conventions)
-double __aeabi_f2d(float x) {
- // TODO
- return 0.0;
+typedef float float_t;
+typedef union {
+ float f;
+ struct {
+ uint64_t m : 23;
+ uint64_t e : 8;
+ uint64_t s : 1;
+ };
+} float_s_t;
+
+typedef union {
+ double d;
+ struct {
+ uint64_t m : 52;
+ uint64_t e : 11;
+ uint64_t s : 1;
+ };
+} double_s_t;
+
+double __attribute__((pcs("aapcs"))) __aeabi_f2d(float x) {
+ float_s_t fx={0};
+ double_s_t dx={0};
+
+ fx.f = x;
+ dx.s = (fx.s);
+ dx.e = (fx.e-127+1023) & 0x7FF;
+ dx.m = fx.m;
+ dx.m <<=(52-23); // left justify
+ return dx.d;
}
-float __aeabi_d2f(double x) {
- // TODO
- return 0.0;
+float __attribute__((pcs("aapcs"))) __aeabi_d2f(double x) {
+ float_s_t fx={0};
+ double_s_t dx={0};
+
+ dx.d = x;
+ fx.s = (dx.s);
+ fx.e = (dx.e-1023+127) & 0xFF;
+ fx.m = (dx.m>>(52-23)); // right justify
+ return fx.f;
}
+double __aeabi_dmul(double x , double y) {
+ return 0.0;
+}
/*
double sqrt(double x) {
// TODO