レイトレを動かすのに必要なライブラリ関数
ひとまずビルドしてみる
code:sh
$ firmware/bin/min-caml -inline 100 firmware/min-rt/min-rt
$ riscv64-unknown-elf-gcc -nostdlib -march=rv32if -mabi=ilp32f -Wl,-Tfirmware/custom.ld firmware/stub.S firmware/min-rt/min-rt.s firmware/min-rt/globals.s firmware/libmincaml.S -o firmware/firmware.elf
出力されたエラーを見て、不足してる関数を確認する
平方根
min_caml_sqrt (float -> float) → sqrt関数 min_caml_cos (float -> float)
https://gyazo.com/21f2d4fee58157f01376454cfcf1ce91
min_caml_sin (float -> float)
https://gyazo.com/ff74e6fcfd06ef5cac694db486f9005c
min_caml_atan (float -> float)
https://gyazo.com/66bb8342f18b07c1b12e0b088b2a63d3
浮動小数点数変換
min_caml_floor (float -> float)
min_caml_abs_float (float -> float)
入出力
min_caml_read_float (void -> float)
min_caml_read_int (void -> int)
min_caml_print_byte (int -> void)
sin x のマクローリン展開
3! = 6
5! = 120
7! = 5040
9! = 362880
11! = 39916800
13! = 6227020800
C言語での実装
code:c
float min_caml_sqrt(float x) {
return sqrt(x);
}
float min_caml_cos(float x) {
return cos(x);
}
float min_caml_sin(float x) {
return sin(x);
}
float min_caml_atan(float x) {
return atan(x);
}
float min_caml_floor(float x) {
return floor(x);
}
float min_caml_abs_float(float x) {
return fabs(x);
}
float min_caml_read_float() {
float f;
fscanf(fp, "%f", &f);
// scanf("%f", &f);
return f;
}
int min_caml_read_int() {
int i;
fscanf(fp, "%d", &i);
// scanf("%d", &i);
return i;
}
void min_caml_print_byte(int n) {
putchar(n);
}