如何使用 LLVM 验证新创建的指令?
How can I validate a newly created instruction using LLVM?
如何使用 LLVM 验证新创建的指令?
我是 LLVM 和计算机体系结构的新手。
针对 RISCV-32 架构创建了一条新的 bfloat16 类型算术指令。
我想知道这个算术指令的输出是否正确。我想验证存储在浮点寄存器中的值是否为 IEEE754 bfloat16 格式。
clang-14 -c -g -v --target=riscv32-unknown-elf -march=rv32izfh0p1 -menable-experimental-extensions -I/usr/include -o main.o main.c
riscv32-unknown-elf-gcc -g -o main main.o
我是通过上面的命令编译的,确认汇编代码出来的很好,如下图
enter image description here
然后,我尝试运行用qemu-riscv32编译可执行文件并用gdb调试它。但是出现了错误的非法指令。
enter image description here
问题
我认为发生了非法指令错误,因为 QEMU 和 gdb 没有关于我创建的新指令的信息。除了修改QEMU和GDB,还有什么方法可以验证新创建的指令吗?
如果您通过向其添加新指令来扩展 CPU 体系结构,则您不仅需要在工具链(然后将使用该新指令输出代码)中,而且在 CPU 实现本身(以便它可以执行您的编译器现在生成的代码)。您可以在真实的硬件 CPU 上执行此操作,在实践中,这将从对其 RTL 的更改开始,这些更改可以在仿真中进行测试;或者您可以在 CPU 的模拟版本上执行此操作,例如 QEMU 提供的模拟版本。但是,如果您根本没有一个包含新指令的 CPU 的实现,那么让编译器发出它们是没有意义的,因为您没有任何可以 运行 的代码编译器生成。
如何使用 LLVM 验证新创建的指令?
我是 LLVM 和计算机体系结构的新手。 针对 RISCV-32 架构创建了一条新的 bfloat16 类型算术指令。 我想知道这个算术指令的输出是否正确。我想验证存储在浮点寄存器中的值是否为 IEEE754 bfloat16 格式。
clang-14 -c -g -v --target=riscv32-unknown-elf -march=rv32izfh0p1 -menable-experimental-extensions -I/usr/include -o main.o main.c
riscv32-unknown-elf-gcc -g -o main main.o
我是通过上面的命令编译的,确认汇编代码出来的很好,如下图
enter image description here
然后,我尝试运行用qemu-riscv32编译可执行文件并用gdb调试它。但是出现了错误的非法指令。
enter image description here
问题 我认为发生了非法指令错误,因为 QEMU 和 gdb 没有关于我创建的新指令的信息。除了修改QEMU和GDB,还有什么方法可以验证新创建的指令吗?
如果您通过向其添加新指令来扩展 CPU 体系结构,则您不仅需要在工具链(然后将使用该新指令输出代码)中,而且在 CPU 实现本身(以便它可以执行您的编译器现在生成的代码)。您可以在真实的硬件 CPU 上执行此操作,在实践中,这将从对其 RTL 的更改开始,这些更改可以在仿真中进行测试;或者您可以在 CPU 的模拟版本上执行此操作,例如 QEMU 提供的模拟版本。但是,如果您根本没有一个包含新指令的 CPU 的实现,那么让编译器发出它们是没有意义的,因为您没有任何可以 运行 的代码编译器生成。