aboutsummaryrefslogtreecommitdiff
path: root/VexRiscv/src/test/cpp/fpu/math
diff options
context:
space:
mode:
Diffstat (limited to 'VexRiscv/src/test/cpp/fpu/math')
-rw-r--r--VexRiscv/src/test/cpp/fpu/math/.gitignore2
-rw-r--r--VexRiscv/src/test/cpp/fpu/math/fpu_math.c79
-rw-r--r--VexRiscv/src/test/cpp/fpu/math/libcode.version4
3 files changed, 85 insertions, 0 deletions
diff --git a/VexRiscv/src/test/cpp/fpu/math/.gitignore b/VexRiscv/src/test/cpp/fpu/math/.gitignore
new file mode 100644
index 0000000..56d9c77
--- /dev/null
+++ b/VexRiscv/src/test/cpp/fpu/math/.gitignore
@@ -0,0 +1,2 @@
+*.so
+*.a
diff --git a/VexRiscv/src/test/cpp/fpu/math/fpu_math.c b/VexRiscv/src/test/cpp/fpu/math/fpu_math.c
new file mode 100644
index 0000000..da45fe2
--- /dev/null
+++ b/VexRiscv/src/test/cpp/fpu/math/fpu_math.c
@@ -0,0 +1,79 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <stdint.h>
+#include <jni.h>
+#include <softfloat.h>
+
+extern void miaou();
+
+
+//#include <fenv.h>
+//#pragma STDC FENV_ACCESS ON
+//int applyRounding(int rounding){
+// int ret = fegetround( );
+// switch(rounding){
+// case 0: fesetround(FE_TONEAREST); break;
+// case 1: fesetround(FE_TOWARDZERO); break;
+// case 2: fesetround(FE_DOWNWARD); break;
+// case 3: fesetround(FE_UPWARD); break;
+// }
+// return ret;
+//}
+// const int originalRounding = applyRounding(rounding);
+// fesetround(originalRounding);
+
+void applyRounding(int rounding){
+ switch(rounding){
+ case 0: softfloat_roundingMode = 0; break;
+ case 1: softfloat_roundingMode = 1; break;
+ case 2: softfloat_roundingMode = 2; break;
+ case 3: softfloat_roundingMode = 3; break;
+ case 4: softfloat_roundingMode = 4; break;
+ }
+}
+
+#define API __attribute__((visibility("default")))
+
+//float32_t toF32(float v){
+// float32_t x;
+// x.v = ;
+// return x;
+//}
+
+#define toF32(v) (*((float32_t*)&v))
+#define fromF32(x) (*((float*)&(x.v)))
+
+
+#define toF64(v) (*((float64_t*)&v))
+#define fromF64(x) (*((double*)&(x.v)))
+
+JNIEXPORT jfloat API JNICALL Java_vexriscv_ip_fpu_FpuMath_addF32(JNIEnv * env, jobject obj, jfloat a, jfloat b, jint rounding){
+ applyRounding(rounding);
+ float32_t v = f32_add(toF32(a), toF32(b));
+ return fromF32(v);
+}
+
+JNIEXPORT jfloat API JNICALL Java_vexriscv_ip_fpu_FpuMath_mulF32(JNIEnv * env, jobject obj, jfloat a, jfloat b, jint rounding){
+ applyRounding(rounding);
+ float32_t v = f32_mul(toF32(a), toF32(b));
+ return fromF32(v);
+}
+JNIEXPORT jint API JNICALL Java_vexriscv_ip_fpu_FpuMath_mulFlagF32(JNIEnv * env, jobject obj, jfloat a, jfloat b, jint rounding){
+ applyRounding(rounding);
+ softfloat_exceptionFlags = 0;
+ float32_t v = f32_mul(toF32(a), toF32(b));
+ return softfloat_exceptionFlags;
+}
+
+
+JNIEXPORT jfloat API JNICALL Java_vexriscv_ip_fpu_FpuMath_d2f(JNIEnv * env, jobject obj, jdouble a, jint rounding){
+ applyRounding(rounding);
+ float32_t v = f64_to_f32(toF64(a));
+ return fromF32(v);
+}
+JNIEXPORT jint API JNICALL Java_vexriscv_ip_fpu_FpuMath_d2fFlag(JNIEnv * env, jobject obj, jdouble a, jint rounding){
+ applyRounding(rounding);
+ softfloat_exceptionFlags = 0;
+ float32_t v = f64_to_f32(toF64(a));
+ return softfloat_exceptionFlags;
+} \ No newline at end of file
diff --git a/VexRiscv/src/test/cpp/fpu/math/libcode.version b/VexRiscv/src/test/cpp/fpu/math/libcode.version
new file mode 100644
index 0000000..f039be6
--- /dev/null
+++ b/VexRiscv/src/test/cpp/fpu/math/libcode.version
@@ -0,0 +1,4 @@
+CODEABI_1.0 {
+ global: FpuMath_*;
+ local: *;
+} \ No newline at end of file