abs_float関数
浮動小数点数の絶対値を返す abs_float 関数を追加。
code:diff
diff --git a/Makefile b/Makefile
index 4a293ff..f793a5b 100644
--- a/Makefile
+++ b/Makefile
@@ -64,7 +64,7 @@ firmware/firmware.hex:
# riscv64-unknown-elf-objcopy -O verilog --verilog-data-width 4 firmware/firmware.elf firmware/firmware.hex
# MinCaml のプログラムをビルド
-FIRMWARE_TARGET = test/mandelbrot
+FIRMWARE_TARGET = test/abs_float
firmware/firmware.hex: Makefile firmware/$(FIRMWARE_TARGET).ml firmware/libmincaml.S firmware/stub.S
firmware/bin/min-caml firmware/${FIRMWARE_TARGET}
riscv64-unknown-elf-gcc -nostdlib -march=rv32if -mabi=ilp32f -Wl,-Tfirmware/custom.ld firmware/stub.S firmware/${FIRMWARE_TARGET}.s firmware/libmincaml.S -o firmware/firmware.elf
diff --git a/firmware/libmincaml.S b/firmware/libmincaml.S
index fb979a9..5ce1086 100644
--- a/firmware/libmincaml.S
+++ b/firmware/libmincaml.S
@@ -450,12 +450,19 @@ min_caml_print_newline:
ret
//---------------------------------------------------------
-// min_caml_abs_float (float -> float)
+// min_caml_abs_float: 絶対値を返す
+// (float -> float)
//---------------------------------------------------------
.text
.globl min_caml_abs_float
min_caml_abs_float:
- // TODO: あとで実装する
+ // t1 = fa0
+ fmv.x.w t1, fa0
+ // 符号ビットに0(正)をセット
+ li t2, 0x7fffffff
+ and t1, t1, t2
+ // fa0 = t1
+ fmv.w.x fa0, t1
ret
//---------------------------------------------------------
diff --git a/firmware/test/abs_float.ml b/firmware/test/abs_float.ml
new file mode 100644
index 0000000..c36606a
--- /dev/null
+++ b/firmware/test/abs_float.ml
@@ -0,0 +1,27 @@
+(* abs_float 0.0 => 0.0 *)
+print_int (int_of_float (abs_float 0.0 *. 1000.0));
+print_newline ();
+(* abs_float 1.0 => 1.0 *)
+print_int (int_of_float (abs_float 1.0 *. 1000.0));
+print_newline ();
+(* abs_float (-1.0) => 1.0 *)
+print_int (int_of_float (abs_float (-1.0) *. 1000.0));
+print_newline ();
+(* abs_float 1.1 => 1.1 *)
+print_int (int_of_float (abs_float 1.1 *. 1000.0));
+print_newline ();
+(* abs_float (-1.1) => 1.1 *)
+print_int (int_of_float (abs_float (-1.1) *. 1000.0));
+print_newline ();
+(* abs_float 1.9 => 1.9 *)
+print_int (int_of_float (abs_float 1.9 *. 1000.0));
+print_newline ();
+(* abs_float (-1.9) => 1.9 *)
+print_int (int_of_float (abs_float (-1.9) *. 1000.0));
+print_newline ();
+(* abs_float 2.1 => 2.1 *)
+print_int (int_of_float (abs_float 2.1 *. 1000.0));
+print_newline ();
+(* abs_float (-2.1) => 2.1 *)
+print_int (int_of_float (abs_float (-2.1) *. 1000.0));
+print_newline ()