Improves test for jumps

This commit is contained in:
2025-11-14 08:52:41 +01:00
parent 6bbecc252e
commit f5d8c77d06
8 changed files with 333 additions and 75 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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