diff --git a/vm/Makefile b/vm/Makefile index 0c18abfc5..21c8aaddd 100644 --- a/vm/Makefile +++ b/vm/Makefile @@ -12,9 +12,9 @@ RUST_PROGRAM_DIRS := $(dir $(wildcard $(RUST_PROGRAMS_DIR)/*/Cargo.toml)) RUST_PROGRAMS := $(notdir $(basename $(RUST_PROGRAM_DIRS:%/=%))) RUST_ARTIFACTS := $(addprefix $(RUST_ARTIFACTS_DIR)/, $(addsuffix .elf, $(RUST_PROGRAMS))) -compile-programs-asm: clean $(ARTIFACTS_ASM) +compile-programs-asm: clean-asm $(ARTIFACTS_ASM) -compile-programs-rust: clean $(RUST_ARTIFACTS) +compile-programs-rust: clean-rust $(RUST_ARTIFACTS) compile-programs: compile-programs-asm compile-programs-rust @@ -36,12 +36,16 @@ $(RUST_ARTIFACTS_DIR)/%.elf: $(RUST_PROGRAMS_DIR)/%/Cargo.toml cp $(RUST_PROGRAMS_DIR)/$*/target/riscv32im-unknown-none-elf/debug/$* $@ rm -rf $(RUST_PROGRAMS_DIR)/$*/target -clean: +clean-asm: -rm -rf $(ASM_ARTIFACTS_DIR) mkdir -p $(ASM_ARTIFACTS_DIR) + +clean-rust: -rm -rf $(RUST_ARTIFACTS_DIR) mkdir -p $(RUST_ARTIFACTS_DIR) +clean: clean-asm clean-rust + test: compile-programs test-no-compile test-asm: compile-programs-asm diff --git a/vm/program_artifacts/asm/add.elf b/vm/program_artifacts/asm/add.elf new file mode 100755 index 000000000..8bb0ec36a Binary files /dev/null and b/vm/program_artifacts/asm/add.elf differ diff --git a/vm/program_artifacts/asm/add_max.elf b/vm/program_artifacts/asm/add_max.elf new file mode 100755 index 000000000..6133405d6 Binary files /dev/null and b/vm/program_artifacts/asm/add_max.elf differ diff --git a/vm/program_artifacts/asm/add_max_plus_one.elf b/vm/program_artifacts/asm/add_max_plus_one.elf new file mode 100755 index 000000000..82416a2a0 Binary files /dev/null and b/vm/program_artifacts/asm/add_max_plus_one.elf differ diff --git a/vm/program_artifacts/asm/add_min.elf b/vm/program_artifacts/asm/add_min.elf new file mode 100755 index 000000000..f57c1e9b7 Binary files /dev/null and b/vm/program_artifacts/asm/add_min.elf differ diff --git a/vm/program_artifacts/asm/add_min_minus_one.elf b/vm/program_artifacts/asm/add_min_minus_one.elf new file mode 100755 index 000000000..9f54ef4d3 Binary files /dev/null and b/vm/program_artifacts/asm/add_min_minus_one.elf differ diff --git a/vm/program_artifacts/asm/add_neg.elf b/vm/program_artifacts/asm/add_neg.elf new file mode 100755 index 000000000..4f215d006 Binary files /dev/null and b/vm/program_artifacts/asm/add_neg.elf differ diff --git a/vm/program_artifacts/asm/addi_255.elf b/vm/program_artifacts/asm/addi_255.elf new file mode 100755 index 000000000..f0179eeba Binary files /dev/null and b/vm/program_artifacts/asm/addi_255.elf differ diff --git a/vm/program_artifacts/asm/addi_max.elf b/vm/program_artifacts/asm/addi_max.elf new file mode 100755 index 000000000..f120b83dc Binary files /dev/null and b/vm/program_artifacts/asm/addi_max.elf differ diff --git a/vm/program_artifacts/asm/addi_min.elf b/vm/program_artifacts/asm/addi_min.elf new file mode 100755 index 000000000..b673eb92d Binary files /dev/null and b/vm/program_artifacts/asm/addi_min.elf differ diff --git a/vm/program_artifacts/asm/addi_minus_one.elf b/vm/program_artifacts/asm/addi_minus_one.elf new file mode 100755 index 000000000..c1e881117 Binary files /dev/null and b/vm/program_artifacts/asm/addi_minus_one.elf differ diff --git a/vm/program_artifacts/asm/addi_one.elf b/vm/program_artifacts/asm/addi_one.elf new file mode 100755 index 000000000..b2a2635bb Binary files /dev/null and b/vm/program_artifacts/asm/addi_one.elf differ diff --git a/vm/program_artifacts/asm/addi_reg.elf b/vm/program_artifacts/asm/addi_reg.elf new file mode 100755 index 000000000..03d33cbe1 Binary files /dev/null and b/vm/program_artifacts/asm/addi_reg.elf differ diff --git a/vm/program_artifacts/asm/addi_reg_max.elf b/vm/program_artifacts/asm/addi_reg_max.elf new file mode 100755 index 000000000..42e0885b8 Binary files /dev/null and b/vm/program_artifacts/asm/addi_reg_max.elf differ diff --git a/vm/program_artifacts/asm/addi_reg_min.elf b/vm/program_artifacts/asm/addi_reg_min.elf new file mode 100755 index 000000000..eb40dd92f Binary files /dev/null and b/vm/program_artifacts/asm/addi_reg_min.elf differ diff --git a/vm/program_artifacts/asm/andi.elf b/vm/program_artifacts/asm/andi.elf new file mode 100755 index 000000000..f47f9ac5d Binary files /dev/null and b/vm/program_artifacts/asm/andi.elf differ diff --git a/vm/program_artifacts/asm/andi_max.elf b/vm/program_artifacts/asm/andi_max.elf new file mode 100755 index 000000000..00f26001f Binary files /dev/null and b/vm/program_artifacts/asm/andi_max.elf differ diff --git a/vm/program_artifacts/asm/andi_one.elf b/vm/program_artifacts/asm/andi_one.elf new file mode 100755 index 000000000..43f8af529 Binary files /dev/null and b/vm/program_artifacts/asm/andi_one.elf differ diff --git a/vm/program_artifacts/asm/andi_one_and_two.elf b/vm/program_artifacts/asm/andi_one_and_two.elf new file mode 100755 index 000000000..bd48790c4 Binary files /dev/null and b/vm/program_artifacts/asm/andi_one_and_two.elf differ diff --git a/vm/program_artifacts/asm/andi_one_and_zero.elf b/vm/program_artifacts/asm/andi_one_and_zero.elf new file mode 100755 index 000000000..7e56b48fc Binary files /dev/null and b/vm/program_artifacts/asm/andi_one_and_zero.elf differ diff --git a/vm/program_artifacts/asm/ori.elf b/vm/program_artifacts/asm/ori.elf new file mode 100755 index 000000000..99c31ef5b Binary files /dev/null and b/vm/program_artifacts/asm/ori.elf differ diff --git a/vm/program_artifacts/asm/ori_five_and_four.elf b/vm/program_artifacts/asm/ori_five_and_four.elf new file mode 100755 index 000000000..01dc3a35c Binary files /dev/null and b/vm/program_artifacts/asm/ori_five_and_four.elf differ diff --git a/vm/program_artifacts/asm/ori_max.elf b/vm/program_artifacts/asm/ori_max.elf new file mode 100755 index 000000000..f5689f3f8 Binary files /dev/null and b/vm/program_artifacts/asm/ori_max.elf differ diff --git a/vm/program_artifacts/asm/ori_one.elf b/vm/program_artifacts/asm/ori_one.elf new file mode 100755 index 000000000..c0e1a7a0e Binary files /dev/null and b/vm/program_artifacts/asm/ori_one.elf differ diff --git a/vm/program_artifacts/asm/ori_one_and_one.elf b/vm/program_artifacts/asm/ori_one_and_one.elf new file mode 100755 index 000000000..19f1279ac Binary files /dev/null and b/vm/program_artifacts/asm/ori_one_and_one.elf differ diff --git a/vm/program_artifacts/asm/ori_three_and_five.elf b/vm/program_artifacts/asm/ori_three_and_five.elf new file mode 100755 index 000000000..db582d654 Binary files /dev/null and b/vm/program_artifacts/asm/ori_three_and_five.elf differ diff --git a/vm/program_artifacts/asm/ori_two_and_one.elf b/vm/program_artifacts/asm/ori_two_and_one.elf new file mode 100755 index 000000000..de2c4adfa Binary files /dev/null and b/vm/program_artifacts/asm/ori_two_and_one.elf differ diff --git a/vm/program_artifacts/asm/slli.elf b/vm/program_artifacts/asm/slli.elf new file mode 100755 index 000000000..0d7b1ef76 Binary files /dev/null and b/vm/program_artifacts/asm/slli.elf differ diff --git a/vm/program_artifacts/asm/slli_ff_four.elf b/vm/program_artifacts/asm/slli_ff_four.elf new file mode 100755 index 000000000..951f28729 Binary files /dev/null and b/vm/program_artifacts/asm/slli_ff_four.elf differ diff --git a/vm/program_artifacts/asm/slli_max.elf b/vm/program_artifacts/asm/slli_max.elf new file mode 100755 index 000000000..5a8fee9d1 Binary files /dev/null and b/vm/program_artifacts/asm/slli_max.elf differ diff --git a/vm/program_artifacts/asm/slli_max_half.elf b/vm/program_artifacts/asm/slli_max_half.elf new file mode 100755 index 000000000..f76d99e09 Binary files /dev/null and b/vm/program_artifacts/asm/slli_max_half.elf differ diff --git a/vm/program_artifacts/asm/slli_max_max.elf b/vm/program_artifacts/asm/slli_max_max.elf new file mode 100755 index 000000000..5bb5c0475 Binary files /dev/null and b/vm/program_artifacts/asm/slli_max_max.elf differ diff --git a/vm/program_artifacts/asm/slli_one.elf b/vm/program_artifacts/asm/slli_one.elf new file mode 100755 index 000000000..6aa543586 Binary files /dev/null and b/vm/program_artifacts/asm/slli_one.elf differ diff --git a/vm/program_artifacts/asm/slli_one_one.elf b/vm/program_artifacts/asm/slli_one_one.elf new file mode 100755 index 000000000..592be33f8 Binary files /dev/null and b/vm/program_artifacts/asm/slli_one_one.elf differ diff --git a/vm/program_artifacts/asm/slli_one_zero.elf b/vm/program_artifacts/asm/slli_one_zero.elf new file mode 100755 index 000000000..af00306cd Binary files /dev/null and b/vm/program_artifacts/asm/slli_one_zero.elf differ diff --git a/vm/program_artifacts/asm/slti.elf b/vm/program_artifacts/asm/slti.elf new file mode 100755 index 000000000..1539f8d20 Binary files /dev/null and b/vm/program_artifacts/asm/slti.elf differ diff --git a/vm/program_artifacts/asm/slti_minus_one.elf b/vm/program_artifacts/asm/slti_minus_one.elf new file mode 100755 index 000000000..08a70fb00 Binary files /dev/null and b/vm/program_artifacts/asm/slti_minus_one.elf differ diff --git a/vm/program_artifacts/asm/slti_negative.elf b/vm/program_artifacts/asm/slti_negative.elf new file mode 100755 index 000000000..4c5a21ddc Binary files /dev/null and b/vm/program_artifacts/asm/slti_negative.elf differ diff --git a/vm/program_artifacts/asm/slti_negative_minus.elf b/vm/program_artifacts/asm/slti_negative_minus.elf new file mode 100755 index 000000000..54ca79156 Binary files /dev/null and b/vm/program_artifacts/asm/slti_negative_minus.elf differ diff --git a/vm/program_artifacts/asm/slti_one.elf b/vm/program_artifacts/asm/slti_one.elf new file mode 100755 index 000000000..25fcc241d Binary files /dev/null and b/vm/program_artifacts/asm/slti_one.elf differ diff --git a/vm/program_artifacts/asm/sltiu.elf b/vm/program_artifacts/asm/sltiu.elf new file mode 100755 index 000000000..bc9580706 Binary files /dev/null and b/vm/program_artifacts/asm/sltiu.elf differ diff --git a/vm/program_artifacts/asm/sltiu_negative.elf b/vm/program_artifacts/asm/sltiu_negative.elf new file mode 100755 index 000000000..074aea251 Binary files /dev/null and b/vm/program_artifacts/asm/sltiu_negative.elf differ diff --git a/vm/program_artifacts/asm/sltiu_one.elf b/vm/program_artifacts/asm/sltiu_one.elf new file mode 100755 index 000000000..f25b5af04 Binary files /dev/null and b/vm/program_artifacts/asm/sltiu_one.elf differ diff --git a/vm/program_artifacts/asm/sltiu_two_negatives.elf b/vm/program_artifacts/asm/sltiu_two_negatives.elf new file mode 100755 index 000000000..43ff0e85d Binary files /dev/null and b/vm/program_artifacts/asm/sltiu_two_negatives.elf differ diff --git a/vm/program_artifacts/asm/srli.elf b/vm/program_artifacts/asm/srli.elf new file mode 100755 index 000000000..df2672ae2 Binary files /dev/null and b/vm/program_artifacts/asm/srli.elf differ diff --git a/vm/program_artifacts/asm/srli_max.elf b/vm/program_artifacts/asm/srli_max.elf new file mode 100755 index 000000000..24b6cd10e Binary files /dev/null and b/vm/program_artifacts/asm/srli_max.elf differ diff --git a/vm/program_artifacts/asm/srli_max_max.elf b/vm/program_artifacts/asm/srli_max_max.elf new file mode 100755 index 000000000..afd130b30 Binary files /dev/null and b/vm/program_artifacts/asm/srli_max_max.elf differ diff --git a/vm/program_artifacts/asm/srli_one.elf b/vm/program_artifacts/asm/srli_one.elf new file mode 100755 index 000000000..d09bcd186 Binary files /dev/null and b/vm/program_artifacts/asm/srli_one.elf differ diff --git a/vm/program_artifacts/asm/srli_one_one.elf b/vm/program_artifacts/asm/srli_one_one.elf new file mode 100755 index 000000000..32fb060d0 Binary files /dev/null and b/vm/program_artifacts/asm/srli_one_one.elf differ diff --git a/vm/program_artifacts/asm/srli_one_zero.elf b/vm/program_artifacts/asm/srli_one_zero.elf new file mode 100755 index 000000000..c51987daa Binary files /dev/null and b/vm/program_artifacts/asm/srli_one_zero.elf differ diff --git a/vm/program_artifacts/asm/srli_two_one.elf b/vm/program_artifacts/asm/srli_two_one.elf new file mode 100755 index 000000000..7fac2f603 Binary files /dev/null and b/vm/program_artifacts/asm/srli_two_one.elf differ diff --git a/vm/program_artifacts/asm/xori.elf b/vm/program_artifacts/asm/xori.elf new file mode 100755 index 000000000..43dac4a65 Binary files /dev/null and b/vm/program_artifacts/asm/xori.elf differ diff --git a/vm/program_artifacts/asm/xori_max.elf b/vm/program_artifacts/asm/xori_max.elf new file mode 100755 index 000000000..a6a90286b Binary files /dev/null and b/vm/program_artifacts/asm/xori_max.elf differ diff --git a/vm/program_artifacts/asm/xori_negate.elf b/vm/program_artifacts/asm/xori_negate.elf new file mode 100755 index 000000000..4dcdac0f3 Binary files /dev/null and b/vm/program_artifacts/asm/xori_negate.elf differ diff --git a/vm/program_artifacts/asm/xori_one.elf b/vm/program_artifacts/asm/xori_one.elf new file mode 100755 index 000000000..7499e8e85 Binary files /dev/null and b/vm/program_artifacts/asm/xori_one.elf differ diff --git a/vm/program_artifacts/asm/xori_one_and_one.elf b/vm/program_artifacts/asm/xori_one_and_one.elf new file mode 100755 index 000000000..dd943e6c0 Binary files /dev/null and b/vm/program_artifacts/asm/xori_one_and_one.elf differ diff --git a/vm/programs/asm/add.s b/vm/programs/asm/add.s new file mode 100644 index 000000000..f20b31bcb --- /dev/null +++ b/vm/programs/asm/add.s @@ -0,0 +1,10 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 10 + addi a3, zero, 20 + add a0, a2, a3 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/add_max.s b/vm/programs/asm/add_max.s new file mode 100644 index 000000000..b250980b4 --- /dev/null +++ b/vm/programs/asm/add_max.s @@ -0,0 +1,30 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 2047 # 2_047 + add a2, a2, a2 # 4_094 + add a2, a2, a2 # 8_188 + add a2, a2, a2 # 16_376 + add a2, a2, a2 # 32_752 + add a2, a2, a2 # 65_504 + add a2, a2, a2 # 131_008 + add a2, a2, a2 # 262_016 + add a2, a2, a2 # 524_032 + add a3, a2, a2 # 1_048_064 + add a2, a3, a3 # 2_096_128 + add a2, a2, a2 # 4_192_256 + add a2, a2, a2 # 8_384_512 + add a2, a2, a2 # 16_769_024 + add a2, a2, a2 # 33_538_048 + add a2, a2, a2 # 67_076_096 + add a2, a2, a2 # 134_152_192 + add a2, a2, a2 # 268_304_384 + add a2, a2, a2 # 536_608_768 + add a2, a2, a2 # 1_073_217_536 + add a2, a2, a2 # 2_146_435_072 + add a2, a2, a3 # 2_147_483_136 + addi a0, a2, 511 # 2_147_483_647 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/add_max_plus_one.s b/vm/programs/asm/add_max_plus_one.s new file mode 100644 index 000000000..0a6b5e152 --- /dev/null +++ b/vm/programs/asm/add_max_plus_one.s @@ -0,0 +1,31 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 2047 # 2_047 + add a2, a2, a2 # 4_094 + add a2, a2, a2 # 8_188 + add a2, a2, a2 # 16_376 + add a2, a2, a2 # 32_752 + add a2, a2, a2 # 65_504 + add a2, a2, a2 # 131_008 + add a2, a2, a2 # 262_016 + add a2, a2, a2 # 524_032 + add a3, a2, a2 # 1_048_064 + add a2, a3, a3 # 2_096_128 + add a2, a2, a2 # 4_192_256 + add a2, a2, a2 # 8_384_512 + add a2, a2, a2 # 16_769_024 + add a2, a2, a2 # 33_538_048 + add a2, a2, a2 # 67_076_096 + add a2, a2, a2 # 134_152_192 + add a2, a2, a2 # 268_304_384 + add a2, a2, a2 # 536_608_768 + add a2, a2, a2 # 1_073_217_536 + add a2, a2, a2 # 2_146_435_072 + add a2, a2, a3 # 2_147_483_136 + addi a0, a2, 511 # 2_147_483_647 + addi a0, a0, 1 # -2_147_483_648 (overflow) + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/add_min.s b/vm/programs/asm/add_min.s new file mode 100644 index 000000000..14fbeb7da --- /dev/null +++ b/vm/programs/asm/add_min.s @@ -0,0 +1,30 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -2047 # -2_047 + add a2, a2, a2 # -4_094 + add a2, a2, a2 # -8_188 + add a2, a2, a2 # -16_376 + add a2, a2, a2 # -32_752 + add a2, a2, a2 # -65_504 + add a2, a2, a2 # -131_008 + add a2, a2, a2 # -262_016 + add a2, a2, a2 # -524_032 + add a3, a2, a2 # -1_048_064 + add a2, a3, a3 # -2_096_128 + add a2, a2, a2 # -4_192_256 + add a2, a2, a2 # -8_384_512 + add a2, a2, a2 # -16_769_024 + add a2, a2, a2 # -33_538_048 + add a2, a2, a2 # -67_076_096 + add a2, a2, a2 # -134_152_192 + add a2, a2, a2 # -268_304_384 + add a2, a2, a2 # -536_608_768 + add a2, a2, a2 # -1_073_217_536 + add a2, a2, a2 # -2_146_435_072 + add a2, a2, a3 # -2_147_483_136 + addi a0, a2, -512 # -2_147_483_648 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/add_min_minus_one.s b/vm/programs/asm/add_min_minus_one.s new file mode 100644 index 000000000..5638b6fd3 --- /dev/null +++ b/vm/programs/asm/add_min_minus_one.s @@ -0,0 +1,31 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -2047 # -2_047 + add a2, a2, a2 # -4_094 + add a2, a2, a2 # -8_188 + add a2, a2, a2 # -16_376 + add a2, a2, a2 # -32_752 + add a2, a2, a2 # -65_504 + add a2, a2, a2 # -131_008 + add a2, a2, a2 # -262_016 + add a2, a2, a2 # -524_032 + add a3, a2, a2 # -1_048_064 + add a2, a3, a3 # -2_096_128 + add a2, a2, a2 # -4_192_256 + add a2, a2, a2 # -8_384_512 + add a2, a2, a2 # -16_769_024 + add a2, a2, a2 # -33_538_048 + add a2, a2, a2 # -67_076_096 + add a2, a2, a2 # -134_152_192 + add a2, a2, a2 # -268_304_384 + add a2, a2, a2 # -536_608_768 + add a2, a2, a2 # -1_073_217_536 + add a2, a2, a2 # -2_146_435_072 + add a2, a2, a3 # -2_147_483_136 + addi a0, a2, -512 # -2_147_483_648 + addi a0, a0, -1 # 2_147_483_647 (overflow) + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/add_neg.s b/vm/programs/asm/add_neg.s new file mode 100644 index 000000000..c20fc5edd --- /dev/null +++ b/vm/programs/asm/add_neg.s @@ -0,0 +1,10 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -10 + addi a3, zero, 20 + add a0, a2, a3 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/addi_255.s b/vm/programs/asm/addi_255.s new file mode 100644 index 000000000..c275ae129 --- /dev/null +++ b/vm/programs/asm/addi_255.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 255 + addi a0, a2, 0 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/addi_max.s b/vm/programs/asm/addi_max.s new file mode 100644 index 000000000..4931d2547 --- /dev/null +++ b/vm/programs/asm/addi_max.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a0, zero, 2047 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/addi_min.s b/vm/programs/asm/addi_min.s new file mode 100644 index 000000000..c1afcb5ac --- /dev/null +++ b/vm/programs/asm/addi_min.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a0, zero, -2048 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/addi_minus_one.s b/vm/programs/asm/addi_minus_one.s new file mode 100644 index 000000000..aee9dc82e --- /dev/null +++ b/vm/programs/asm/addi_minus_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a0, zero, -1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/addi_one.s b/vm/programs/asm/addi_one.s new file mode 100644 index 000000000..98dfaf2bc --- /dev/null +++ b/vm/programs/asm/addi_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a0, zero, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/addi_reg.s b/vm/programs/asm/addi_reg.s new file mode 100644 index 000000000..3e74d7be1 --- /dev/null +++ b/vm/programs/asm/addi_reg.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 10 + addi a0, a2, 20 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/addi_reg_max.s b/vm/programs/asm/addi_reg_max.s new file mode 100644 index 000000000..0be5e0f02 --- /dev/null +++ b/vm/programs/asm/addi_reg_max.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 2047 + addi a0, a2, 33 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/addi_reg_min.s b/vm/programs/asm/addi_reg_min.s new file mode 100644 index 000000000..b61156f09 --- /dev/null +++ b/vm/programs/asm/addi_reg_min.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -2048 + addi a0, a2, -22 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/andi.s b/vm/programs/asm/andi.s new file mode 100644 index 000000000..67cae5d58 --- /dev/null +++ b/vm/programs/asm/andi.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + andi a0, zero, 0x00 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/andi_max.s b/vm/programs/asm/andi_max.s new file mode 100644 index 000000000..d0875da8f --- /dev/null +++ b/vm/programs/asm/andi_max.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 0xFFFFFFFF # -1 + andi a0, a2, 0xFFFFFFFF + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/andi_one.s b/vm/programs/asm/andi_one.s new file mode 100644 index 000000000..409b0208d --- /dev/null +++ b/vm/programs/asm/andi_one.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 0x01 + andi a0, a2, 0x01 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/andi_one_and_two.s b/vm/programs/asm/andi_one_and_two.s new file mode 100644 index 000000000..d4731fbc1 --- /dev/null +++ b/vm/programs/asm/andi_one_and_two.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 0x01 + andi a0, a2, 0x02 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/andi_one_and_zero.s b/vm/programs/asm/andi_one_and_zero.s new file mode 100644 index 000000000..ec0f7a06e --- /dev/null +++ b/vm/programs/asm/andi_one_and_zero.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + andi a0, zero, 0x01 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori.s b/vm/programs/asm/ori.s new file mode 100644 index 000000000..ce4fd062a --- /dev/null +++ b/vm/programs/asm/ori.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a0, zero, 0x00 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori_five_and_four.s b/vm/programs/asm/ori_five_and_four.s new file mode 100644 index 000000000..58273ffc4 --- /dev/null +++ b/vm/programs/asm/ori_five_and_four.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a2, zero, 0x04 + ori a0, a2, 0x05 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori_max.s b/vm/programs/asm/ori_max.s new file mode 100644 index 000000000..29f3ad032 --- /dev/null +++ b/vm/programs/asm/ori_max.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a2, zero, 0xFFFFFFFF + ori a0, a2, 0xFFFFFFFF + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori_one.s b/vm/programs/asm/ori_one.s new file mode 100644 index 000000000..376c1b295 --- /dev/null +++ b/vm/programs/asm/ori_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a0, zero, 0x01 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori_one_and_one.s b/vm/programs/asm/ori_one_and_one.s new file mode 100644 index 000000000..fdbb73c3f --- /dev/null +++ b/vm/programs/asm/ori_one_and_one.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a2, zero, 0x01 + ori a0, a2, 0x01 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori_three_and_five.s b/vm/programs/asm/ori_three_and_five.s new file mode 100644 index 000000000..9b8743e2f --- /dev/null +++ b/vm/programs/asm/ori_three_and_five.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a2, zero, 0x03 # 0011 + ori a0, a2, 0x05 # 0101 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/ori_two_and_one.s b/vm/programs/asm/ori_two_and_one.s new file mode 100644 index 000000000..42d30e3f5 --- /dev/null +++ b/vm/programs/asm/ori_two_and_one.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + ori a2, zero, 0x01 + ori a0, a2, 0x02 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slli.s b/vm/programs/asm/slli.s new file mode 100644 index 000000000..b4994ec2c --- /dev/null +++ b/vm/programs/asm/slli.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + slli a0, zero, 0 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slli_ff_four.s b/vm/programs/asm/slli_ff_four.s new file mode 100644 index 000000000..67084d752 --- /dev/null +++ b/vm/programs/asm/slli_ff_four.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 0xFF + slli a0, a2, 4 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slli_max.s b/vm/programs/asm/slli_max.s new file mode 100644 index 000000000..73da6be88 --- /dev/null +++ b/vm/programs/asm/slli_max.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 0xFFFFFFFF + slli a0, a2, 4 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slli_max_half.s b/vm/programs/asm/slli_max_half.s new file mode 100644 index 000000000..4426b20e8 --- /dev/null +++ b/vm/programs/asm/slli_max_half.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 0xFFFFFFFF + slli a0, a2, 15 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slli_max_max.s b/vm/programs/asm/slli_max_max.s new file mode 100644 index 000000000..12b6188fb --- /dev/null +++ b/vm/programs/asm/slli_max_max.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 0xFFFFFFFF + slli a0, a2, 31 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slli_one.s b/vm/programs/asm/slli_one.s new file mode 100644 index 000000000..23d906673 --- /dev/null +++ b/vm/programs/asm/slli_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + slli a0, zero, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slli_one_one.s b/vm/programs/asm/slli_one_one.s new file mode 100644 index 000000000..b6c0af78d --- /dev/null +++ b/vm/programs/asm/slli_one_one.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 1 + slli a0, a2, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slli_one_zero.s b/vm/programs/asm/slli_one_zero.s new file mode 100644 index 000000000..21e7cd389 --- /dev/null +++ b/vm/programs/asm/slli_one_zero.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 1 + slli a0, a2, 0 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slti.s b/vm/programs/asm/slti.s new file mode 100644 index 000000000..3a1d82598 --- /dev/null +++ b/vm/programs/asm/slti.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + slti a0, zero, 0 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slti_minus_one.s b/vm/programs/asm/slti_minus_one.s new file mode 100644 index 000000000..f8334deaa --- /dev/null +++ b/vm/programs/asm/slti_minus_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + slti a0, zero, -1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slti_negative.s b/vm/programs/asm/slti_negative.s new file mode 100644 index 000000000..035e895ca --- /dev/null +++ b/vm/programs/asm/slti_negative.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -1 + slti a0, a2, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slti_negative_minus.s b/vm/programs/asm/slti_negative_minus.s new file mode 100644 index 000000000..200fead24 --- /dev/null +++ b/vm/programs/asm/slti_negative_minus.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -1 + slti a0, a2, -2 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/slti_one.s b/vm/programs/asm/slti_one.s new file mode 100644 index 000000000..ae2738bb5 --- /dev/null +++ b/vm/programs/asm/slti_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + slti a0, zero, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/sltiu.s b/vm/programs/asm/sltiu.s new file mode 100644 index 000000000..23ab35a66 --- /dev/null +++ b/vm/programs/asm/sltiu.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + sltiu a0, zero, 0 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/sltiu_negative.s b/vm/programs/asm/sltiu_negative.s new file mode 100644 index 000000000..bdaaded24 --- /dev/null +++ b/vm/programs/asm/sltiu_negative.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -1 + sltiu a0, a2, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/sltiu_one.s b/vm/programs/asm/sltiu_one.s new file mode 100644 index 000000000..ae2738bb5 --- /dev/null +++ b/vm/programs/asm/sltiu_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + slti a0, zero, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/sltiu_two_negatives.s b/vm/programs/asm/sltiu_two_negatives.s new file mode 100644 index 000000000..63461155f --- /dev/null +++ b/vm/programs/asm/sltiu_two_negatives.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, -10 + sltiu a0, a2, -5 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/srli.s b/vm/programs/asm/srli.s new file mode 100644 index 000000000..55b7b0ab8 --- /dev/null +++ b/vm/programs/asm/srli.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + srli a0, zero, 0 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/srli_max.s b/vm/programs/asm/srli_max.s new file mode 100644 index 000000000..582accd9b --- /dev/null +++ b/vm/programs/asm/srli_max.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 0xFFFFFFFF + srli a0, a2, 4 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/srli_max_max.s b/vm/programs/asm/srli_max_max.s new file mode 100644 index 000000000..78f1fafd9 --- /dev/null +++ b/vm/programs/asm/srli_max_max.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 0xFFFFFFFF + srli a0, a2, 31 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/srli_one.s b/vm/programs/asm/srli_one.s new file mode 100644 index 000000000..86cf922cb --- /dev/null +++ b/vm/programs/asm/srli_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + srli a0, zero, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/srli_one_one.s b/vm/programs/asm/srli_one_one.s new file mode 100644 index 000000000..e73b62661 --- /dev/null +++ b/vm/programs/asm/srli_one_one.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 1 + srli a0, a2, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/srli_one_zero.s b/vm/programs/asm/srli_one_zero.s new file mode 100644 index 000000000..0d1681125 --- /dev/null +++ b/vm/programs/asm/srli_one_zero.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 1 + srli a0, a2, 0 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/srli_two_one.s b/vm/programs/asm/srli_two_one.s new file mode 100644 index 000000000..dbb753451 --- /dev/null +++ b/vm/programs/asm/srli_two_one.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + addi a2, zero, 2 + srli a0, a2, 1 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/xori.s b/vm/programs/asm/xori.s new file mode 100644 index 000000000..b48ec54e6 --- /dev/null +++ b/vm/programs/asm/xori.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + xori a0, zero, 0x00 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/xori_max.s b/vm/programs/asm/xori_max.s new file mode 100644 index 000000000..b96cb5d6a --- /dev/null +++ b/vm/programs/asm/xori_max.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + xori a0, zero, 0xFFFFFFFF + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/xori_negate.s b/vm/programs/asm/xori_negate.s new file mode 100644 index 000000000..5c734d2fd --- /dev/null +++ b/vm/programs/asm/xori_negate.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + xori a2, zero, 0xFFFFFFFE + xori a0, a2, 0xFFFFFFFF + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/xori_one.s b/vm/programs/asm/xori_one.s new file mode 100644 index 000000000..857324743 --- /dev/null +++ b/vm/programs/asm/xori_one.s @@ -0,0 +1,8 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + xori a0, zero, 0x01 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/programs/asm/xori_one_and_one.s b/vm/programs/asm/xori_one_and_one.s new file mode 100644 index 000000000..5da02bd47 --- /dev/null +++ b/vm/programs/asm/xori_one_and_one.s @@ -0,0 +1,9 @@ + .attribute 5, "rv32i2p1_m2p0_zmmul1p0" +.Lfunc_end0: + .globl main +main: + xori a2, zero, 0x01 + xori a0, a2, 0x01 + jalr zero, 0(ra) +.Lfunc_end1: + .size main, .Lfunc_end1-main diff --git a/vm/src/vm/execution.rs b/vm/src/vm/execution.rs index 822dff66c..8ad647489 100644 --- a/vm/src/vm/execution.rs +++ b/vm/src/vm/execution.rs @@ -20,7 +20,7 @@ fn load_program(instruction_map: BTreeMap, memory: &mut Memory) { fn run_from_entrypoint(memory: &mut Memory, entrypoint: u32) -> (i32, i32) { let mut pc = entrypoint; let mut registers = Registers::default(); - registers.0[2] = 0xFFFFFFFF; // 4GB + registers.0[2] = 0xFFFFFFFFu32; // 4GB while pc != registers.0[1] { let next_instruction = memory.0[&pc]; let instruction = Instruction::parse(next_instruction); @@ -73,18 +73,20 @@ fn run_instruction( pc: &mut u32, memory: &mut Memory, ) { + println!("registers: {:?}", ®isters); + println!("Executing instruction at 0x{:08x}: {:?}", pc.clone(), inst); *pc += 4; match inst { Instruction::ArithImm { dst, src, imm, op } => { let (a, b) = (registers.0[*src as usize] as i32, *imm); let res = match op { - ArithOp::Add => a + b, + ArithOp::Add => a.wrapping_add(b), ArithOp::Sub => panic!("SubImm not supported"), ArithOp::Xor => a ^ b, ArithOp::Or => a | b, ArithOp::And => a & b, ArithOp::ShiftLeftLogical => a << b, - ArithOp::ShiftRightLogical => a >> b, + ArithOp::ShiftRightLogical => ((a as u32) >> (b as u32)) as i32, ArithOp::ShiftRightArith => a >> b, ArithOp::SetLessThan => (a < b) as i32, ArithOp::SetLessThanU => ((a as u32) < (b as u32)) as i32, @@ -151,6 +153,29 @@ fn run_instruction( *pc += offset } } - _ => unimplemented!(), + Instruction::Arith { + dst, + src1, + src2, + op, + } => { + let (a, b) = ( + registers.0[*src1 as usize] as i32, + registers.0[*src2 as usize] as i32, + ); + let res = match op { + ArithOp::Add => a.wrapping_add(b), + ArithOp::Sub => a - b, + ArithOp::Xor => a ^ b, + ArithOp::Or => a | b, + ArithOp::And => a & b, + ArithOp::ShiftLeftLogical => a << b, + ArithOp::ShiftRightLogical => ((a as u32) >> (b as u32)) as i32, + ArithOp::ShiftRightArith => a >> b, + ArithOp::SetLessThan => (a < b) as i32, + ArithOp::SetLessThanU => ((a as u32) < (b as u32)) as i32, + }; + registers.0[*dst as usize] = res as u32; + } } } diff --git a/vm/src/vm/instructions.rs b/vm/src/vm/instructions.rs index 2370dce1d..73f80605a 100644 --- a/vm/src/vm/instructions.rs +++ b/vm/src/vm/instructions.rs @@ -251,12 +251,12 @@ fn parse_i_instruction(instruction: u32, opcode: Opcode) -> Instruction { AND_FUNC_IDENTIFIER => ArithOp::And, SHL_FUNC_IDENTIFIER => { assert!(imm >> 5 == 0); - imm &= 0xF; + imm &= 0x1F; ArithOp::ShiftLeftLogical } SR_FUNC_IDENTIFIER => { let func_id = imm >> 5; - imm &= 0xF; + imm &= 0x1F; match func_id { 0x00 => ArithOp::ShiftRightLogical, 0x20 => ArithOp::ShiftRightArith, diff --git a/vm/tests/asm.rs b/vm/tests/asm.rs index 4d08ba639..0da72f6cf 100644 --- a/vm/tests/asm.rs +++ b/vm/tests/asm.rs @@ -1,9 +1,8 @@ use vm::{elf::Elf, vm::execution::run_program}; -#[test] -fn test_basic_program() { - println!("Testing basic_program.elf"); - let elf_data = std::fs::read("./program_artifacts/asm/basic_program.elf").unwrap(); +fn run_program_and_check_output(elf_path: &str, expected_output: i32) { + println!("Testing {}", elf_path); + let elf_data = std::fs::read(elf_path).unwrap(); let program = Elf::load(&elf_data).unwrap(); println!("Program entry: 0x{:08x}", program.entry_point); program.image.iter().for_each(|(addr, word)| { @@ -11,5 +10,291 @@ fn test_basic_program() { }); let results = run_program(program.image, program.entry_point); - assert!(results.0 == 0); + assert!(results.0 == expected_output); +} + +#[test] +fn test_basic_program() { + run_program_and_check_output("./program_artifacts/asm/basic_program.elf", 0); +} + +#[test] +fn test_addi_one() { + run_program_and_check_output("./program_artifacts/asm/addi_one.elf", 1); +} + +#[test] +fn test_addi_minus_one() { + run_program_and_check_output("./program_artifacts/asm/addi_minus_one.elf", -1); +} + +#[test] +fn test_addi_max() { + run_program_and_check_output("./program_artifacts/asm/addi_max.elf", 2047); +} + +#[test] +fn test_addi_min() { + run_program_and_check_output("./program_artifacts/asm/addi_min.elf", -2048); +} + +#[test] +fn test_addi_reg() { + run_program_and_check_output("./program_artifacts/asm/addi_reg.elf", 30); +} + +#[test] +fn test_addi_reg_max() { + run_program_and_check_output("./program_artifacts/asm/addi_reg_max.elf", 2080); +} + +#[test] +fn test_addi_reg_min() { + run_program_and_check_output("./program_artifacts/asm/addi_reg_min.elf", -2070); +} + +#[test] +fn test_addi_255() { + run_program_and_check_output("./program_artifacts/asm/addi_255.elf", 255); +} + +#[test] +fn test_add() { + run_program_and_check_output("./program_artifacts/asm/add.elf", 30); +} + +#[test] +fn test_add_neg() { + run_program_and_check_output("./program_artifacts/asm/add_neg.elf", 10); +} + +#[test] +fn test_add_max() { + run_program_and_check_output("./program_artifacts/asm/add_max.elf", i32::MAX); +} + +#[test] +fn test_add_max_plus_one() { + run_program_and_check_output("./program_artifacts/asm/add_max_plus_one.elf", i32::MIN); +} + +#[test] +fn test_add_min() { + run_program_and_check_output("./program_artifacts/asm/add_min.elf", i32::MIN); +} + +#[test] +fn test_add_min_minus_one() { + run_program_and_check_output("./program_artifacts/asm/add_min_minus_one.elf", i32::MAX); +} + +#[test] +fn test_andi() { + run_program_and_check_output("./program_artifacts/asm/andi.elf", 0x00); +} + +#[test] +fn test_andi_one() { + run_program_and_check_output("./program_artifacts/asm/andi_one.elf", 0x01); +} + +#[test] +fn test_andi_one_and_zero() { + run_program_and_check_output("./program_artifacts/asm/andi_one_and_zero.elf", 0x00); +} + +#[test] +fn test_andi_one_and_two() { + run_program_and_check_output("./program_artifacts/asm/andi_one_and_two.elf", 0x00); +} + +#[test] +fn test_andi_max() { + run_program_and_check_output("./program_artifacts/asm/andi_max.elf", 0xFFFFFFFFu32 as i32); +} + +#[test] +fn test_ori() { + run_program_and_check_output("./program_artifacts/asm/ori.elf", 0x00); +} + +#[test] +fn test_ori_one() { + run_program_and_check_output("./program_artifacts/asm/ori_one.elf", 0x01); +} + +#[test] +fn test_ori_one_and_one() { + run_program_and_check_output("./program_artifacts/asm/ori_one_and_one.elf", 0x01); +} + +#[test] +fn test_ori_two_and_one() { + run_program_and_check_output("./program_artifacts/asm/ori_two_and_one.elf", 0x03); +} + +#[test] +fn test_ori_five_and_four() { + run_program_and_check_output("./program_artifacts/asm/ori_five_and_four.elf", 0x05); +} + +#[test] +fn test_ori_three_and_five() { + run_program_and_check_output("./program_artifacts/asm/ori_three_and_five.elf", 0x07); +} + +#[test] +fn test_ori_max() { + run_program_and_check_output("./program_artifacts/asm/ori_max.elf", 0xFFFFFFFFu32 as i32); +} + +#[test] +fn test_xori() { + run_program_and_check_output("./program_artifacts/asm/xori.elf", 0x00); +} + +#[test] +fn test_xori_one() { + run_program_and_check_output("./program_artifacts/asm/xori_one.elf", 0x01); +} + +#[test] +fn test_xori_one_and_one() { + run_program_and_check_output("./program_artifacts/asm/xori_one_and_one.elf", 0x00); +} + +#[test] +fn test_xori_max() { + run_program_and_check_output("./program_artifacts/asm/xori_max.elf", 0xFFFFFFFFu32 as i32); +} + +#[test] +fn test_xori_negate() { + run_program_and_check_output("./program_artifacts/asm/xori_negate.elf", 0x01); +} + +#[test] +fn test_slti() { + run_program_and_check_output("./program_artifacts/asm/slti.elf", 0); +} + +#[test] +fn test_slti_one() { + run_program_and_check_output("./program_artifacts/asm/slti_one.elf", 1); +} + +#[test] +fn test_slti_minus_one() { + run_program_and_check_output("./program_artifacts/asm/slti_minus_one.elf", 0); +} + +#[test] +fn test_slti_negative() { + run_program_and_check_output("./program_artifacts/asm/slti_negative.elf", 1); +} + +#[test] +fn test_slti_negative_minus() { + run_program_and_check_output("./program_artifacts/asm/slti_negative_minus.elf", 0); +} + +#[test] +fn test_sltiu() { + run_program_and_check_output("./program_artifacts/asm/sltiu.elf", 0); +} + +#[test] +fn test_sltiu_one() { + run_program_and_check_output("./program_artifacts/asm/sltiu_one.elf", 1); +} + +#[test] +fn test_sltiu_negative() { + run_program_and_check_output("./program_artifacts/asm/sltiu_negative.elf", 0); +} + +#[test] +fn test_sltiu_two_negatives() { + run_program_and_check_output("./program_artifacts/asm/sltiu_two_negatives.elf", 1); +} + +#[test] +fn test_slli() { + run_program_and_check_output("./program_artifacts/asm/slli.elf", 0); +} + +#[test] +fn test_slli_one() { + run_program_and_check_output("./program_artifacts/asm/slli_one.elf", 0); +} + +#[test] +fn test_slli_one_one() { + run_program_and_check_output("./program_artifacts/asm/slli_one_one.elf", 2); +} + +#[test] +fn test_slli_one_zero() { + run_program_and_check_output("./program_artifacts/asm/slli_one_zero.elf", 1); +} + +#[test] +fn test_slli_ff_four() { + run_program_and_check_output("./program_artifacts/asm/slli_ff_four.elf", 0xFF0); +} + +#[test] +fn test_slli_max() { + run_program_and_check_output("./program_artifacts/asm/slli_max.elf", 0xFFFFFFF0u32 as i32); +} + +#[test] +fn test_slli_max_half() { + run_program_and_check_output( + "./program_artifacts/asm/slli_max_half.elf", + 0xFFFF8000u32 as i32, + ); +} + +#[test] +fn test_slli_max_max() { + run_program_and_check_output( + "./program_artifacts/asm/slli_max_max.elf", + 0x80000000u32 as i32, + ); +} + +#[test] +fn test_srli() { + run_program_and_check_output("./program_artifacts/asm/srli.elf", 0); +} + +#[test] +fn test_srli_one() { + run_program_and_check_output("./program_artifacts/asm/srli_one.elf", 0); +} + +#[test] +fn test_srli_one_zero() { + run_program_and_check_output("./program_artifacts/asm/srli_one_zero.elf", 1); +} + +#[test] +fn test_srli_one_one() { + run_program_and_check_output("./program_artifacts/asm/srli_one_one.elf", 0); +} + +#[test] +fn test_srli_two_one() { + run_program_and_check_output("./program_artifacts/asm/srli_two_one.elf", 1); +} + +#[test] +fn test_srli_max() { + run_program_and_check_output("./program_artifacts/asm/srli_max.elf", 0x0FFFFFFFu32 as i32); +} + +#[test] +fn test_srli_max_max() { + run_program_and_check_output("./program_artifacts/asm/srli_max_max.elf", 0x00000001); }