Skip to content

Commit dcd343e

Browse files
committed
Speed up bulk copy
1 parent 53d3978 commit dcd343e

File tree

2 files changed

+34
-22
lines changed

2 files changed

+34
-22
lines changed

riscof/mlogv32/env/model_test.h

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,45 +17,49 @@
1717
.option norelax; \
1818
.section .text.init.rom; \
1919
\
20+
/* decode ROM */ \
2021
la t0, __etext_rom; \
2122
.insn i CUSTOM_0, 0, zero, t0, 0; \
2223
\
24+
/* initialize UART */ \
2325
li t0, 0xf0000010; \
2426
li t1, 0b111; \
2527
sb t1, 0x08(t0); \
2628
\
29+
/* copy .text from ROM to RAM */ \
2730
la t0, __sitext; \
2831
la t1, __stext; \
2932
la t2, __etext; \
30-
beqz t2, mlogv32_text_done; \
31-
mlogv32_load_text: \
3233
bgeu t1, t2, mlogv32_text_done; \
33-
lb t3, 0(t0); \
34-
sb t3, 0(t1); \
35-
addi t0, t0, 1; \
36-
addi t1, t1, 1; \
37-
j mlogv32_load_text; \
34+
mlogv32_load_text: \
35+
lw t3, 0(t0); \
36+
sw t3, 0(t1); \
37+
addi t0, t0, 4; \
38+
addi t1, t1, 4; \
39+
bltu t1, t2, mlogv32_load_text; \
3840
mlogv32_text_done: \
3941
\
42+
/* copy .data from ROM to RAM */ \
4043
la t0, __sidata; \
4144
la t1, __sdata; \
4245
la t2, __edata; \
43-
mlogv32_load_data: \
4446
bgeu t1, t2, mlogv32_data_done; \
45-
lb t3, 0(t0); \
46-
sb t3, 0(t1); \
47-
addi t0, t0, 1; \
48-
addi t1, t1, 1; \
49-
j mlogv32_load_data; \
47+
mlogv32_load_data: \
48+
lw t3, 0(t0); \
49+
sw t3, 0(t1); \
50+
addi t0, t0, 4; \
51+
addi t1, t1, 4; \
52+
bltu t1, t2, mlogv32_load_data; \
5053
mlogv32_data_done: \
5154
\
55+
/* zero out .bss */ \
5256
la t0, __sbss; \
5357
la t1, __ebss; \
54-
mlogv32_clear_bss: \
5558
bgeu t0, t1, mlogv32_bss_done; \
56-
sb zero, 0(t0); \
57-
addi t0, t0, 1; \
58-
j mlogv32_clear_bss; \
59+
mlogv32_clear_bss: \
60+
sw zero, 0(t0); \
61+
addi t0, t0, 4; \
62+
bltu t0, t1, mlogv32_clear_bss; \
5963
mlogv32_bss_done: \
6064
\
6165
RVMODEL_IO_WRITE_STR(t0, "\n--- ", MLOGV32_TEST_NAME, " ---\n") \

src/cpu/worker.mlog.jinja

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#% macro fetch_variables()
2+
read _rom prev_proc "_rom"
23
read __etext prev_proc "__etext"
34
read _address prev_proc "_address"
4-
read _rom prev_proc "_rom"
55
read address prev_proc "address"
66
read csr_mie prev_proc "csr_mie"
77
read csr_minstret prev_proc "csr_minstret"
@@ -89,9 +89,9 @@
8989
#% set labels = namespace()
9090
#% set _labels_vals = (labels|namespace_dict).values()
9191

92-
#% set labels.next_tick = 12
92+
#% set labels.next_tick = 11
9393

94-
#% set labels.end_instruction_with_rd_and_poll_interrupts = 144
94+
#% set labels.end_instruction_with_rd_and_poll_interrupts = 143
9595
#% set labels.end_instruction_with_rd_and_fire_interrupts = _labels_vals|last + 1
9696
#% set labels.end_instruction_with_rd = _labels_vals|last + 1
9797
#% set labels.end_instruction = _labels_vals|last + 2
@@ -101,7 +101,7 @@ reset:
101101
setrate 1000
102102

103103
# define this variable FIRST so that we can read other variables over it
104-
set _rom null
104+
# set _rom null
105105

106106
# load config
107107
read MEMORY_X {{CONFIG}} "MEMORY_X"
@@ -1564,6 +1564,11 @@ store_value:
15641564
# handle write-only MMIO
15651565
jump store_value__syscon equal address {{SYSCON}}
15661566

1567+
# fast path for 32-bit writes
1568+
set value rs2
1569+
op add ret2 @counter 13 # update this if anything below is changed
1570+
jump access_ram equal length 32
1571+
15671572
# create a bitmask with 0 in the section we want to replace and 1 everywhere else
15681573
op mod $shift address 4
15691574
op mul $shift $shift 8
@@ -1588,6 +1593,7 @@ store_value:
15881593
op add value result nonlocal2 # inserted value
15891594

15901595
# align address to word
1596+
# NOTE: we jump to this line from access_ram if length == 32
15911597
op and address address 0xfffffffc
15921598

15931599
# if it's in the MMIO range, handle it separately
@@ -2644,7 +2650,9 @@ modify_csr__minstreth:
26442650

26452651
MLOGSYS:
26462652
# I-type: rs1, imm=funct12, rd_id
2647-
jump ILLEGAL_OP greaterThan imm 0
2653+
2654+
# for now we can just ignore imm, since MLOGSYS is only used for decoding
2655+
# jump ILLEGAL_OP greaterThan imm 0
26482656

26492657
# init icache
26502658
# require M-mode so that we don't need to do address translation

0 commit comments

Comments
 (0)