Rust character drawing

This commit is contained in:
2025-11-14 09:58:58 +01:00
9 changed files with 334 additions and 108 deletions

View File

@@ -50,7 +50,7 @@ OBJCOPY := $(PREFIX)objcopy
OBTOMEM := common/objtomem.awk OBTOMEM := common/objtomem.awk
## Flags ## Flags
ASFLAGS :=-march=rv64im -mabi=lp64 -ffreestanding -nostdlib -T $(BENCH_DIR)/link.ld ASFLAGS :=-march=rv64i -mabi=lp64 -ffreestanding -nostdlib -T $(BENCH_DIR)/link.ld
CFLAGS :=$(ASFLAGS) CFLAGS :=$(ASFLAGS)
ELFFLAGS :=$(ASFLAGS) $(MEM_DIR)/crt.o -Os -fno-unroll-loops ELFFLAGS :=$(ASFLAGS) $(MEM_DIR)/crt.o -Os -fno-unroll-loops
ODFLAGS :=-j .text -j .rodata -j .data -s ODFLAGS :=-j .text -j .rodata -j .data -s
@@ -70,7 +70,7 @@ $(MEM_DIR):
@mkdir -p $@/programs @mkdir -p $@/programs
@mkdir -p $@/programs_rust @mkdir -p $@/programs_rust
$(MEM_DIR)/programs_rust/%.elf: bench/programs_rust/% force |$(MEM_DIR) $(MEM_DIR)/programs_rust/%.elf: bench/programs_rust/% force $(MEM_DIR)/crt.o |$(MEM_DIR)
cd bench/programs_rust && cargo build --release --bin=$(basename $(notdir $@)) cd bench/programs_rust && cargo build --release --bin=$(basename $(notdir $@))
cp -f bench/programs_rust/target/riscv64i/release/$(basename $(notdir $@)) $@ cp -f bench/programs_rust/target/riscv64i/release/$(basename $(notdir $@)) $@
$(MEM_DIR)/crt.o: $(BENCH_DIR)/crt.S |$(MEM_DIR) $(MEM_DIR)/crt.o: $(BENCH_DIR)/crt.S |$(MEM_DIR)

View File

@@ -1,15 +1,54 @@
# expected: 000001BC, 000002BC # expected: 000001BC, 000002BC, 000003BC, 00000AC, 00000AC
.text .text
_start: _start:
li x5, 0x0
# case1: not equal -> should not jump -> write 0x1BC
add x1, x0, 0x00A add x1, x0, 0x00A
add x2, x0, 0x00B add x2, x0, 0x00B
beq x1, x2, finish # Should not jump beq x1, x2, case1_skip
add x31, x0, 0x1BC add x31, x0, 0x1BC
case1_skip:
# case2: equal -> should jump -> write 0x2BC
add x1, x0, 0x1BC add x1, x0, 0x1BC
add x2, x0, 0x1BC add x2, x0, 0x1BC
beq x1, x2, finish # Should jump to finish beq x1, x2, case2_target
add x31, x0, 0x3BC add x31, x0, 0x3BC
case2_target:
finish:
add x31, x0, 0x2BC 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 .text
_start: _start:
add x1, x0, -29 li x5, 0x0
add x2, x0, -28 # case1: greater -> should jump -> write 0x1BC
bge x1, x2, finish # Should not jump add x1, x0, 0x010
add x2, x0, 0x00F
bge x1, x2, case1_target
add x31, x0, 0x3BC
case1_target:
add x31, x0, 0x1BC add x31, x0, 0x1BC
add x1, x0, 12 # case2: equal -> should jump -> write 0x2BC
add x2, x0, 12 add x1, x0, 0x1BC
bge x1, x2, finish # Should jump to finish add x2, x0, 0x1BC
bge x1, x2, case2_target
add x31, x0, 0x3BC add x31, x0, 0x3BC
case2_target:
finish:
add x31, x0, 0x2BC 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 .text
_start: _start:
add x1, x0, 21 li x5, 0x0
add x2, x0, 22 # case1: unsigned greater -> should jump -> write 0x1BC
bgeu x1, x2, finish # Should not jump add x1, x0, 0x0F0
add x2, x0, 0x00F
bgeu x1, x2, case1_target
add x31, x0, 0x3BC
case1_target:
add x31, x0, 0x1BC add x31, x0, 0x1BC
add x1, x0, 12 back_label:
add x2, x0, 12 bne x5, x0, back_label_flagged
bgeu x1, x2, finish # Should jump to finish add x1, x0, 0x000
add x2, x0, 0x001
add x31, x0, 0x3BC 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 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 .text
_start: _start:
add x1, x0, -28 li x5, 0x0
add x2, x0, -28 # case1: less -> should jump -> write 0x1BC
blt x1, x2, finish # Should not jump add x1, x0, 0x001
add x2, x0, 0x002
blt x1, x2, case1_target
add x31, x0, 0x3BC
case1_target:
add x31, x0, 0x1BC add x31, x0, 0x1BC
add x1, x0, -28 back_label:
add x2, x0, 12 bne x5, x0, back_label_flagged
blt x1, x2, finish # Should jump to finish 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 add x31, x0, 0x3BC
finish: # case3: negative vs positive -> should jump -> write 0x4BC
add x31, x0, 0x2BC 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,47 +1,54 @@
# expected: 0000000000000001, 0000000000000004, 0000000000000008, 000000000000000D, 0000000000000014 # expected: 000001BC, 000003BC, 000002BC, 000003BC, 000004BC, 000000AC
.text .text
_start: _start:
# Test 1: Equal values (should NOT branch) li x5, 0x0
li x1, 5 # case1: unsigned less -> should jump -> write 0x1BC
li x2, 5 add x1, x0, 0x001
bltu x1, x2, label1 add x2, x0, 0x002
addi x31, x0, 1 # expected path (not taken) bltu x1, x2, case1_target
label1: add x31, x0, 0x3BC
case1_target:
# Test 2: x1 < x2 unsigned (should branch) add x31, x0, 0x1BC
li x1, 5
li x2, 10
bltu x1, x2, label2
addi x31, x31, 2 # skipped if branch taken
j label2_end
label2:
addi x31, x31, 3 # expected path (branch taken)
label2_end:
# Test 3: x1 > x2 unsigned (should NOT branch) back_label:
li x1, 10 bne x5, x0, back_label_flagged
li x2, 5 add x1, x0, 0x000
bltu x1, x2, label3 add x2, x0, 0x001
addi x31, x31, 4 # expected path (not taken) add x31, x0, 0x3BC
label3: jal x0, back_label_cont
back_label_flagged:
add x31, x0, 0x0BC
add x5, x0, 0x0
jal x0, after_backward
back_label_cont:
# Test 4: x1 = 0xFFFFFFFFFFFFFFFF, x2 = 0 (max unsigned vs min unsigned) # case2: equal -> should not jump -> write 0x2BC
li x1, -1 # 0xFFFFFFFFFFFFFFFF add x1, x0, 0x1BC
li x2, 0 add x2, x0, 0x1BC
bltu x1, x2, label4 bltu x1, x2, case2_target
addi x31, x31, 5 # expected path (not taken) add x31, x0, 0x2BC
label4: case2_target:
add x31, x0, 0x3BC
# Test 5: x1 = 0, x2 = 0xFFFFFFFFFFFFFFFF (min unsigned vs max unsigned) # case3: large unsigned compare -> should not jump -> write 0x4BC
li x1, 0 add x1, x0, -1
li x2, -1 add x2, x0, 0x7F
bltu x1, x2, label5 bltu x1, x2, case3_target
addi x31, x31, 6 # skipped if branch taken add x31, x0, 0x4BC
j label5_end case3_target:
label5:
addi x31, x31, 7 # expected path (branch taken)
label5_end:
# Done # backward branch trigger
nop 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 .text
_start: _start:
add x1, x0, 0x00B li x5, 0x0
# case1: not equal -> should jump -> write 0x1BC
add x1, x0, 0x00A
add x2, x0, 0x00B 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 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 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 add x31, x0, 0x3BC
finish: # case3: zero vs non-zero -> should jump -> write 0x4BC
add x31, x0, 0x2BC 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 .text
_start: _start:
jal x31, step1 # forward jal -> should jump to target and set x1 to return addr
step1: jal x1, jal_target
jal x31, step2 add x31, x0, 0x1BC
step4: jal_target:
addi x31, x0, 0x00B add x31, x0, 0x2BC
jal x0, finish
step2: add x5, x0, 0x1
jal x31, step3 jal x2, jal_back_target
step3: add x31, x0, 0x3BC
jal x0, step4 jal_back_target:
addi x31, x0, 0x00A # This instruction should never be executed add x31, x0, 0x4BC
finish: jal x0, after_jal_back
nop 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 .text
_start: _start:
jal x1, step1 add x5, x0, 0x00C
addi x31, x0, 0x00A jalr x1, x5, 0
jal x0, finish add x31, x0, 0x1BC
step1: # target for jalr (placed immediately)
jal x2, step2 add x31, x0, 0x2BC
addi x31, x0, 0x0AB # This instruction should never be executed
addi x31, x0, 0x0BA # jalr with immediate offset -> jump forward
jalr x31, 0(x1) # Check if return address is written to x31 add x6, x0, 0x018
step2: jalr x2, x6, 0
jalr x0, 4(x2) # return to step1, but 1 further add x31, x0, 0x3BC
finish:
nop # jalr to same register (should set rd to return addr) and continue
addi x31, x0, 0x0AB # This instruction should never be executed add x7, x0, 0x028
jalr x3, x7, 0
add x31, x0, 0x4BC
# final marker
add x31, x0, 0x0BC