RISCVEMUは高速RISC-Vエミュレータだが、その実装の仕組みを探っていると、どうやら2つのビルドモードがありそうだということが分かった。
RISCVEMUはLinuxも立ち上げることが出来る高速エミュレータだが、その実装の仕組みを探っていると、大きくソースコードが#define
により分割されていることが分かった。
- risvemu.c
#ifdef EMSCRIPTEN #include "list.h" #include <emscripten.h> #else #include <getopt.h> #include <termios.h> #endif
EMSCRIPTEN
というのは何だろうと思ったが、どうやらC言語とJavascriptを接続するためのツールらしい。
デフォルトでは、このEMSCRIPTEN
はオフになっており、C言語でごりごりに記述されたRISCVエミュレータが起動する。
- riscvemu_template.h
switch(opcode) { #ifdef CONFIG_EXT_C C_QUADRANT(0) pc_next = (intx_t)(s->pc + 2); ... } if (rd != 0) s->reg[rd] = val; break; #if XLEN >= 64 case 0x3b: /* OP-32 */ imm = insn >> 25; val = s->reg[rs1]; val2 = s->reg[rs2]; if (imm == 1) { funct3 = (insn >> 12) & 7; switch(funct3) { case 0: /* mulw */ val = (int32_t)((int32_t)val * (int32_t)val2); break; case 4:/* divw */ val = div32(val, val2); break; case 5:/* divuw */ val = (int32_t)divu32(val, val2); break; case 6:/* remw */ val = rem32(val, val2); break; case 7:/* remuw */ val = (int32_t)remu32(val, val2); break; default: goto illegal_insn; } } else { if (imm & ~0x20) goto illegal_insn; funct3 = ((insn >> 12) & 7) | ((insn >> (30 - 3)) & (1 << 3)); switch(funct3) { case 0: /* addw */ val = (int32_t)(val + val2); break; case 0 | 8: /* subw */
EMSCRIPTEN
を有効にすると、Javascriptでの実装が有効になるみたいなのだが、このためにはEmscriptenのインストールが必要になる。
Download and install — Emscripten 1.36.14 documentation
emscripten.h — Emscripten 1.36.14 documentation
上記のウェブサイトの指示の元にインストールしてみたのだが、上手くいかなかった。
/emsdk_portable$ sudo ./emsdk install latest Installing SDK 'sdk-master-64bit'.. Installing tool 'clang-master-64bit'.. Repository 'https://github.com/kripken/emscripten-fastcomp/' already cloned to directory '/home/vagrant/work/emsdk_portable/clang/fastcomp/src', skipping. Fetching latest changes to the branch 'master' for '/home/vagrant/work/emsdk_portable/clang/fastcomp/src'... Already up-to-date. Successfully updated and checked out branch 'master' on repository '/home/vagrant/work/emsdk_portable/clang/fastcomp/src' Current repository version: "Fri, 23 Dec 2016 15:47:53 -0800 881bd352731d21c7117ad7e2ece347aacae83965" Repository 'https://github.com/kripken/emscripten-fastcomp-clang/' already cloned to directory '/home/vagrant/work/emsdk_portable/clang/fastcomp/src/tools/clang', skipping. Fetching latest changes to the branch 'master' for '/home/vagrant/work/emsdk_portable/clang/fastcomp/src/tools/clang'... Already up-to-date. Successfully updated and checked out branch 'master' on repository '/home/vagrant/work/emsdk_portable/clang/fastcomp/src/tools/clang' Current repository version: "Fri, 23 Dec 2016 15:47:47 -0800 60a7e9a9c22b67309e5b1258d38fadfa481a25d3" Running CMake: ['cmake', '-G', 'Unix Makefiles', '-DCMAKE_BUILD_TYPE=Release', '-DPYTHON_EXECUTABLE=/usr/bin/python', '-DLLVM_TARGETS_TO_BUILD=X86;JSBackend', '-DLLVM_INCLUDE_EXAMPLES=OFF', '-DCLANG_INCLUDE_EXAMPLES=OFF', '-DLLVM_INCLUDE_TESTS=OFF', '-DCLANG_INCLUDE_TESTS=OFF', '/home/vagrant/work/emsdk_portable/clang/fastcomp/src'] CMake Error at CMakeLists.txt:3 (cmake_minimum_required): CMake 3.4.3 or higher is required. You are running version 3.2.2 -- Configuring incomplete, errors occurred! CMake invocation failed due to exception! Working directory: /home/vagrant/work/emsdk_portable/clang/fastcomp/build_master_64 Command '['cmake', '-G', 'Unix Makefiles', '-DCMAKE_BUILD_TYPE=Release', '-DPYTHON_EXECUTABLE=/usr/bin/python', '-DLLVM_TARGETS_TO_BUILD=X86;JSBackend', '-DLLVM_INCLUDE_EXAMPLES=OFF', '-DCLANG_INCLUDE_EXAMPLES=OFF', '-DLLVM_INCLUDE_TESTS=OFF', '-DCLANG_INCLUDE_TESTS=OFF', '/home/vagrant/work/emsdk_portable/clang/fastcomp/src']' returned non-zero exit status 1 Installation failed!
まずはCMakeの最新版をダウンロードしてきた。
wget https://cmake.org/files/v3.7/cmake-3.7.2-Linux-x86_64.tar.gz
CMakeを最新版にアップデートしてemsdk insntall latest
を実行すると前に進みだしたようだ。
これにはもうちょっと時間がかかる。今日は時間切れ。