test/float.ml をRISC-Vで動かす
from MinCamlでRISC-Vのアセンブリコードを出力したい
単精度向けに命令をちょろっと修正しただけ。あと、ユーティリティーメソッドをいくつか stub.c へ追加した。
MinCaml版は単精度浮動小数点数だがOCaml版は倍精度浮動小数点数のため、test/float.ml で差異が出てしまった。やむなし。
code:diff
diff --git a/RV32/emit.ml b/RV32/emit.ml
index 590bcb3..bfe5617 100644
--- a/RV32/emit.ml
+++ b/RV32/emit.ml
@@ -88,11 +88,11 @@ and g' oc = function (* 各命令のアセンブリ生成 (caml2html: emit_gprim
| NonTail(_), Stw(x, y, C(z)) -> Printf.fprintf oc "\tstw\t%s, %d(%s)\n" (reg x) z (reg y)
| NonTail(x), FMr(y) when x = y -> ()
| NonTail(x), FMr(y) -> Printf.fprintf oc "\tfmr\t%s, %s\n" (reg x) (reg y)
- | NonTail(x), FNeg(y) -> Printf.fprintf oc "\tfneg\t%s, %s\n" (reg x) (reg y)
- | NonTail(x), FAdd(y, z) -> Printf.fprintf oc "\tfadd\t%s, %s, %s\n" (reg x) (reg y) (reg z)
- | NonTail(x), FSub(y, z) -> Printf.fprintf oc "\tfsub\t%s, %s, %s\n" (reg x) (reg y) (reg z)
- | NonTail(x), FMul(y, z) -> Printf.fprintf oc "\tfmul\t%s, %s, %s\n" (reg x) (reg y) (reg z)
- | NonTail(x), FDiv(y, z) -> Printf.fprintf oc "\tfdiv\t%s, %s, %s\n" (reg x) (reg y) (reg z)
+ | NonTail(x), FNeg(y) -> Printf.fprintf oc "\tfneg.s %s, %s\n" (reg x) (reg y)
+ | NonTail(x), FAdd(y, z) -> Printf.fprintf oc "\tfadd.s %s, %s, %s\n" (reg x) (reg y) (reg z)
+ | NonTail(x), FSub(y, z) -> Printf.fprintf oc "\tfsub.s %s, %s, %s\n" (reg x) (reg y) (reg z)
+ | NonTail(x), FMul(y, z) -> Printf.fprintf oc "\tfmul.s %s, %s, %s\n" (reg x) (reg y) (reg z)
+ | NonTail(x), FDiv(y, z) -> Printf.fprintf oc "\tfdiv.s %s, %s, %s\n" (reg x) (reg y) (reg z)
| NonTail(x), Lfd(y, V(z)) -> Printf.fprintf oc "\tlfdx\t%s, %s, %s\n" (reg x) (reg y) (reg z)
| NonTail(x), Lfd(y, C(z)) -> Printf.fprintf oc "\tlfd\t%s, %d(%s)\n" (reg x) z (reg y)
| NonTail(_), Stfd(x, y, V(z)) -> Printf.fprintf oc "\tstfdx\t%s, %s, %s\n" (reg x) (reg y) (reg z)
diff --git a/stub.c b/stub.c
index 58b9d11..7aacca3 100644
--- a/stub.c
+++ b/stub.c
@@ -83,3 +83,24 @@ float min_caml_floor(float x) {
float min_caml_sin(float x) {
return sin(x);
}
+
+// test/float.ml を実行するために以下を追加した
+// ここから
+
+float min_caml_abs_float(float x) {
+ return fabs(x);
+}
+
+float min_caml_sqrt(float x) {
+ return sqrt(x);
+}
+
+float min_caml_float_of_int(int x) {
+ return (float)x;
+}
+
+int min_caml_int_of_float(float x) {
+ return (int)x;
+}
+
+// ここまで
diff --git a/test/float.ml b/test/float.ml
index c438ad2..2237d2a 100644
--- a/test/float.ml
+++ b/test/float.ml
@@ -36,4 +36,5 @@ print_int
((sin (cos (sqrt (abs_float (-12.3))))
+. 4.5 -. 6.7 *. 8.9 /. 1.23456789)
*. float_of_int 1000000))
-(* => -48300296 *)
+(* float な min-caml だと -44604260 が返る *)
+(* double な OCaml だと -44604262 が返る *)