diff --git a/bench/tests/op/beq.s b/bench/tests/op/beq.s index 05f73e9..4c47bcc 100644 --- a/bench/tests/op/beq.s +++ b/bench/tests/op/beq.s @@ -1,15 +1,54 @@ -# expected: 000001BC, 000002BC +# expected: 000001BC, 000002BC, 000003BC, 00000AC, 00000AC .text _start: + li x5, 0x0 + # case1: not equal -> should not jump -> write 0x1BC add x1, x0, 0x00A add x2, x0, 0x00B - beq x1, x2, finish # Should not jump + beq x1, x2, case1_skip add x31, x0, 0x1BC +case1_skip: + # case2: equal -> should jump -> write 0x2BC add x1, x0, 0x1BC add x2, x0, 0x1BC - beq x1, x2, finish # Should jump to finish + beq x1, x2, case2_target add x31, x0, 0x3BC - -finish: +case2_target: add x31, x0, 0x2BC + +back_label: + bne x5, x0, back_label_flagged + add x1, x0, 0x000 + add x2, x0, 0x001 + add x31, x0, 0x3BC + jal x0, back_label_cont +back_label_flagged: + add x31, x0, 0x0BC + add x5, x0, 0x0 + jal x0, after_backward +back_label_cont: + + # case3: zero equality -> should jump -> write 0x4BC + add x1, x0, 0x000 + add x2, x0, 0x000 + beq x1, x2, case3_target + add x31, x0, 0x5BC +case3_target: + + # set flag and branch backwards to test negative offset + add x5, x0, 0x1 + add x1, x0, 0x002 + add x2, x0, 0x001 + beq x1, x2, back_label + + # same-register: always equal -> should jump -> write 0x0AC + add x1, x0, 0x00A + beq x1, x1, same_reg_target + add x31, x0, 0x6BC +same_reg_target: + add x31, x0, 0x0AC + +after_backward: + # final marker + add x31, x0, 0x0AC diff --git a/bench/tests/op/bge.s b/bench/tests/op/bge.s index aa5d6b3..899ceeb 100644 --- a/bench/tests/op/bge.s +++ b/bench/tests/op/bge.s @@ -1,15 +1,61 @@ -# expected: 000001BC, 000002BC +# expected: 000001BC, 000002BC, 000003BC, 000004BC, 000006BC, 000000BC, 00003BC .text _start: - add x1, x0, -29 - add x2, x0, -28 - bge x1, x2, finish # Should not jump + li x5, 0x0 + # case1: greater -> should jump -> write 0x1BC + add x1, x0, 0x010 + add x2, x0, 0x00F + bge x1, x2, case1_target + add x31, x0, 0x3BC +case1_target: add x31, x0, 0x1BC - add x1, x0, 12 - add x2, x0, 12 - bge x1, x2, finish # Should jump to finish + # case2: equal -> should jump -> write 0x2BC + add x1, x0, 0x1BC + add x2, x0, 0x1BC + bge x1, x2, case2_target add x31, x0, 0x3BC - -finish: +case2_target: add x31, x0, 0x2BC + +back_label: + bne x5, x0, back_label_flagged + # no-flag path (fall-through) + add x1, x0, 0x000 + add x2, x0, 0x001 + li x31, 0x3BC + jal x0, back_label_cont +back_label_flagged: + li x31, 0x0BC + li x5, 0x0 + jal x0, after_backward +back_label_cont: + + # case3: less -> should not jump -> write 0x4BC + add x1, x0, 0x001 + add x2, x0, 0x002 + bge x1, x2, case3_target + add x31, x0, 0x4BC +case3_target: + # case4: negative values -> signed compare, should jump + add x1, x0, -1 + add x2, x0, -2 + bge x1, x2, case4_target + add x31, x0, 0x7BC +case4_target: + add x31, x0, 0x6BC + + add x5, x0, 0x1 + add x1, x0, 0x002 + add x2, x0, 0x001 + bge x1, x2, back_label + + li x1, 0xABC + bge x1, x1, same_reg_target + li x31, 0x2BC +same_reg_target: + li x31, 0x1BC + +after_backward: + # final marker + li x31, 0x3BC diff --git a/bench/tests/op/bgeu.s b/bench/tests/op/bgeu.s index c4cc110..1580eb1 100644 --- a/bench/tests/op/bgeu.s +++ b/bench/tests/op/bgeu.s @@ -1,15 +1,53 @@ -# expected: 000001BC, 000002BC +# expected: 000001BC, 000003BC, 000002BC, 000004BC, 000000BC, 000000AC .text _start: - add x1, x0, 21 - add x2, x0, 22 - bgeu x1, x2, finish # Should not jump + li x5, 0x0 + # case1: unsigned greater -> should jump -> write 0x1BC + add x1, x0, 0x0F0 + add x2, x0, 0x00F + bgeu x1, x2, case1_target + add x31, x0, 0x3BC +case1_target: add x31, x0, 0x1BC - add x1, x0, 12 - add x2, x0, 12 - bgeu x1, x2, finish # Should jump to finish +back_label: + bne x5, x0, back_label_flagged + add x1, x0, 0x000 + add x2, x0, 0x001 add x31, x0, 0x3BC + jal x0, back_label_cont +back_label_flagged: + add x31, x0, 0x0BC + add x5, x0, 0x0 + jal x0, after_backward +back_label_cont: -finish: + # case2: equal -> should jump -> write 0x2BC + add x1, x0, 0x1BC + add x2, x0, 0x1BC + bgeu x1, x2, case2_target + add x31, x0, 0x3BC +case2_target: add x31, x0, 0x2BC + + # case3: unsigned less -> should not jump -> write 0x4BC + add x1, x0, 0x001 + add x2, x0, 0x002 + bgeu x1, x2, case3_target + add x31, x0, 0x4BC +case3_target: + # backward branch trigger + add x5, x0, 0x1 + add x1, x0, 0x002 + add x2, x0, 0x001 + bgeu x1, x2, back_label + + # same-register unsigned -> should jump + add x1, x0, 0x00A + bgeu x1, x1, same_reg_target + add x31, x0, 0x6BC +same_reg_target: + add x31, x0, 0x0AC + +after_backward: + add x31, x0, 0x0AC diff --git a/bench/tests/op/blt.s b/bench/tests/op/blt.s index 3b34264..630253d 100644 --- a/bench/tests/op/blt.s +++ b/bench/tests/op/blt.s @@ -1,15 +1,55 @@ -# expected: 000001BC, 000002BC +# expected: 000001BC, 000003BC, 000002BC, 000003BC, 000004BC, 000000AC .text _start: - add x1, x0, -28 - add x2, x0, -28 - blt x1, x2, finish # Should not jump + li x5, 0x0 + # case1: less -> should jump -> write 0x1BC + add x1, x0, 0x001 + add x2, x0, 0x002 + blt x1, x2, case1_target + add x31, x0, 0x3BC +case1_target: add x31, x0, 0x1BC - add x1, x0, -28 - add x2, x0, 12 - blt x1, x2, finish # Should jump to finish +back_label: + bne x5, x0, back_label_flagged + add x1, x0, 0x000 + add x2, x0, 0x001 + add x31, x0, 0x3BC + jal x0, back_label_cont +back_label_flagged: + add x31, x0, 0x0BC + add x5, x0, 0x0 + jal x0, after_backward +back_label_cont: + + # case2: equal -> should not jump -> write 0x2BC + add x1, x0, 0x1BC + add x2, x0, 0x1BC + blt x1, x2, case2_target + add x31, x0, 0x2BC +case2_target: add x31, x0, 0x3BC -finish: - add x31, x0, 0x2BC + # case3: negative vs positive -> should jump -> write 0x4BC + add x1, x0, -5 + add x2, x0, 0x001 + blt x1, x2, case3_target + add x31, x0, 0x5BC +case3_target: + add x31, x0, 0x4BC + + # backward branch trigger + add x5, x0, 0x1 + add x1, x0, 0x002 + add x2, x0, 0x001 + blt x1, x2, back_label + + # same-register -> not taken -> write 0x0AC + add x1, x0, 0x00A + blt x1, x1, same_reg_target + add x31, x0, 0x0AC +same_reg_target: + add x31, x0, 0x6BC + +after_backward: + add x31, x0, 0x0AC diff --git a/bench/tests/op/bltu.s b/bench/tests/op/bltu.s index e17e957..832c02e 100644 --- a/bench/tests/op/bltu.s +++ b/bench/tests/op/bltu.s @@ -1,15 +1,54 @@ -# expected: 000001BC, 000002BC +# expected: 000001BC, 000003BC, 000002BC, 000003BC, 000004BC, 000000AC .text _start: - add x1, x0, 28 - add x2, x0, 28 - bltu x1, x2, finish # Should not jump + li x5, 0x0 + # case1: unsigned less -> should jump -> write 0x1BC + add x1, x0, 0x001 + add x2, x0, 0x002 + bltu x1, x2, case1_target + add x31, x0, 0x3BC +case1_target: add x31, x0, 0x1BC - add x1, x0, 12 - add x2, x0, 24 - bltu x1, x2, finish # Should jump to finish +back_label: + bne x5, x0, back_label_flagged + add x1, x0, 0x000 + add x2, x0, 0x001 + add x31, x0, 0x3BC + jal x0, back_label_cont +back_label_flagged: + add x31, x0, 0x0BC + add x5, x0, 0x0 + jal x0, after_backward +back_label_cont: + + # case2: equal -> should not jump -> write 0x2BC + add x1, x0, 0x1BC + add x2, x0, 0x1BC + bltu x1, x2, case2_target + add x31, x0, 0x2BC +case2_target: add x31, x0, 0x3BC -finish: - add x31, x0, 0x2BC + # case3: large unsigned compare -> should not jump -> write 0x4BC + add x1, x0, -1 + add x2, x0, 0x7F + bltu x1, x2, case3_target + add x31, x0, 0x4BC +case3_target: + + # backward branch trigger + add x5, x0, 0x1 + add x1, x0, 0x002 + add x2, x0, 0x001 + bltu x1, x2, back_label + + # same-register unsigned -> not taken -> write 0x0AC + add x1, x0, 0x00A + bltu x1, x1, same_reg_target + add x31, x0, 0x0AC +same_reg_target: + add x31, x0, 0x6BC + +after_backward: + add x31, x0, 0x0AC diff --git a/bench/tests/op/bne.s b/bench/tests/op/bne.s index d42aaf1..c05caf9 100644 --- a/bench/tests/op/bne.s +++ b/bench/tests/op/bne.s @@ -1,15 +1,55 @@ -# expected: 000001BC, 000002BC +# expected: 000001BC, 000003BC, 000002BC, 000003BC, 000000AC .text _start: - add x1, x0, 0x00B + li x5, 0x0 + # case1: not equal -> should jump -> write 0x1BC + add x1, x0, 0x00A add x2, x0, 0x00B - bne x1, x2, finish # Should not jump + bne x1, x2, case1_target + add x31, x0, 0x3BC +case1_target: add x31, x0, 0x1BC - add x1, x0, 0x1BA +back_label: + bne x5, x0, back_label_flagged + # fall-through + add x1, x0, 0x000 + add x2, x0, 0x001 + add x31, x0, 0x3BC + jal x0, back_label_cont +back_label_flagged: + add x5, x0, 0x0 + jal x0, after_backward +back_label_cont: + + # case2: equal -> should not jump -> write 0x2BC + add x1, x0, 0x1BC add x2, x0, 0x1BC - bne x1, x2, finish # Should jump to finish + bne x1, x2, case2_target + add x31, x0, 0x2BC +case2_target: add x31, x0, 0x3BC -finish: - add x31, x0, 0x2BC + # case3: zero vs non-zero -> should jump -> write 0x4BC + add x1, x0, 0x000 + add x2, x0, 0x001 + bne x1, x2, case3_target + add x31, x0, 0x5BC +case3_target: + + # backward branch trigger + add x5, x0, 0x1 + add x1, x0, 0x002 + add x2, x0, 0x001 + bne x1, x2, back_label + + # same-reg: should not jump (since equal) -> write 0x0AC after fall-through + add x1, x0, 0x00A + add x2, x0, 0x00A + bne x1, x2, same_reg_target + add x31, x0, 0x0AC +same_reg_target: + add x31, x0, 0x6BC + +after_backward: + add x31, x0, 0x0AC diff --git a/bench/tests/op/jal.s b/bench/tests/op/jal.s index 1342c97..9e8d10d 100644 --- a/bench/tests/op/jal.s +++ b/bench/tests/op/jal.s @@ -1,17 +1,28 @@ -# expected: 00000004, 0000008, 00000014, 0000000B +# expected: 000002BC, 000004BC, 000007BC, 000005BC .text _start: - jal x31, step1 -step1: - jal x31, step2 -step4: - addi x31, x0, 0x00B - jal x0, finish -step2: - jal x31, step3 -step3: - jal x0, step4 - addi x31, x0, 0x00A # This instruction should never be executed -finish: - nop + # forward jal -> should jump to target and set x1 to return addr + jal x1, jal_target + add x31, x0, 0x1BC +jal_target: + add x31, x0, 0x2BC + + add x5, x0, 0x1 + jal x2, jal_back_target + add x31, x0, 0x3BC +jal_back_target: + add x31, x0, 0x4BC + jal x0, after_jal_back +jal_back_flag: + add x31, x0, 0x5BC +after_jal_back: + + # same-target jal to next insn (offset small) -> should set x3 and continue + jal x3, same_jal_target + add x31, x0, 0x6BC +same_jal_target: + add x31, x0, 0x7BC + + # final marker + add x31, x0, 0x5BC diff --git a/bench/tests/op/jalr.s b/bench/tests/op/jalr.s index af0f0b9..55df7d8 100644 --- a/bench/tests/op/jalr.s +++ b/bench/tests/op/jalr.s @@ -1,16 +1,21 @@ -# expected: 000000BA, 000001C, 0000000A +# expected: 000002BC, 000003BC, 000000BC .text _start: - jal x1, step1 - addi x31, x0, 0x00A - jal x0, finish -step1: - jal x2, step2 - addi x31, x0, 0x0AB # This instruction should never be executed - addi x31, x0, 0x0BA - jalr x31, 0(x1) # Check if return address is written to x31 -step2: - jalr x0, 4(x2) # return to step1, but 1 further -finish: - nop - addi x31, x0, 0x0AB # This instruction should never be executed + add x5, x0, 0x00C + jalr x1, x5, 0 + add x31, x0, 0x1BC +# target for jalr (placed immediately) + add x31, x0, 0x2BC + + # jalr with immediate offset -> jump forward + add x6, x0, 0x018 + jalr x2, x6, 0 + add x31, x0, 0x3BC + + # jalr to same register (should set rd to return addr) and continue + add x7, x0, 0x028 + jalr x3, x7, 0 + add x31, x0, 0x4BC + + # final marker + add x31, x0, 0x0BC