レイトレをRISC-Vで動かす
https://gyazo.com/63ab0e542c80a4a8b1e9dde3a6cd01ad
MinCamlがRISC-Vのコードを出力できるようになったので、例のレイトレ(min-rt)を動かしてみる。
globals.s を用意する
AArch64 の時に用意した globals.s をそのまま利用する。
code:sh
$ cd min-caml
$ mkdir min-rt/RV32
$ cp AArch64/globals.s min-rt/RV32/
入力をファイルから受け取るように改修
spike シミュレータが標準入力の50バイトぐらいを捨ててしまう謎の挙動のため、標準入力の代わりに引数で渡したファイルから入力を受け取るように stub.c 改修する。
code:diff
diff --git a/stub.c b/stub.c
index ac59d84..d4e195b 100644
--- a/stub.c
+++ b/stub.c
@@ -4,7 +4,7 @@
extern int min_caml_start(char *, char *);
-// static FILE *fp;
+static FILE *fp;
int main( int argc, char *argv[] ) {
char *hp, *sp;
@@ -16,17 +16,17 @@ int main( int argc, char *argv[] ) {
}
// NOTE: 標準入力から読み込むとlldbやXcodeでデバッグしづらいので、その時は引数で渡したファイルから読み込むようにする
- // // 引数で渡したファイルを開く
- // if (argc < 2) {
- // fprintf(stderr, "Usage: %s <file.sld>", argv0); - // return 1;
- // }
- // fp = fopen(argv1, "r"); + // 引数で渡したファイルを開く
+ if (argc < 2) {
+ fprintf(stderr, "Usage: %s <file.sld>", argv0); + return 1;
+ }
+ fp = fopen(argv1, "r"); // fprintf(stderr, "sp = %p, hp = %p\n", sp, hp);
min_caml_start(sp, hp);
- // fclose(fp);
+ fclose(fp);
return 0;
}
@@ -47,16 +47,16 @@ void min_caml_print_byte(int n) {
// OK
int min_caml_read_int() {
int i;
- // fscanf(fp, "%ld", &l);
- scanf("%d", &i);
+ fscanf(fp, "%d", &i);
+ // scanf("%d", &i);
return i;
}
// OK
float min_caml_read_float() {
float f;
- // fscanf(fp, "%lf", &d);
- scanf("%f", &f);
+ fscanf(fp, "%f", &f);
+ // scanf("%f", &f);
return f;
}
min-rt をビルド
code:sh
$ cd min-caml
$ make clean min-caml
$ cd min-rt
$ ../min-caml -inline 100 min-rt
$ riscv32-unknown-elf-gcc min-rt.s globals.s ../libmincaml.S ../stub.c -lm -o min-rt.min-caml
レイトレを実行
code:sh
$ spike /opt/riscv/pk/riscv32-unknown-elf/bin/pk min-rt.min-caml shuttle.sld > shuttle.ppm
レイトレの結果が出力される。
https://gyazo.com/63ab0e542c80a4a8b1e9dde3a6cd01ad