Don't load M0 byte count from memory.

This count is only written by the M0, so there's no need to reload it
when the current value is already retained in a register.

Removing this load saves two cycles in all code paths.
This commit is contained in:
Martin Ling
2021-12-24 14:50:22 +00:00
parent 4e205994e3
commit 0e99419be2

View File

@ -66,10 +66,10 @@ shadow registers.
There are four key code paths, with the following worst-case timings:
RX, normal: 145 cycles
RX, overrun: 74 cycles
TX, normal: 134 cycles
TX, underrun: 141 cycles
RX, normal: 143 cycles
RX, overrun: 72 cycles
TX, normal: 132 cycles
TX, underrun: 139 cycles
Design
======
@ -161,6 +161,7 @@ buf_ptr .req r4
str zero, [state, #NUM_SHORTFALLS] // state.num_shortfalls = zero // 2
str zero, [state, #LONGEST_SHORTFALL] // state.longest_shortfall = zero // 2
mov shortfall_length, zero // shortfall_length = zero // 1
mov count, zero // count = zero // 1
.endm
.macro await_sgpio name
@ -196,7 +197,6 @@ buf_ptr .req r4
.macro update_buf_ptr
// Update the address of the buffer segment we want to write to / read from.
ldr count, [state, #M0_COUNT] // count = state.m0_count // 2
mov buf_ptr, buf_mask // buf_ptr = buf_mask // 1
and buf_ptr, count // buf_ptr &= count // 1
add buf_ptr, buf_base // buf_ptr += buf_base // 1
@ -311,7 +311,7 @@ tx_loop:
await_sgpio tx // await_sgpio() // 34
// Update buffer pointer.
update_buf_ptr // update_buf_ptr() // 5
update_buf_ptr // update_buf_ptr() // 3
// Load mode, and return to idle if requested.
mode .req r3
@ -392,7 +392,7 @@ rx_loop:
await_sgpio rx // await_sgpio() // 34
// Update buffer pointer.
update_buf_ptr // update_buf_ptr() // 5
update_buf_ptr // update_buf_ptr() // 3
// Load mode, and return to idle if requested.
mode .req r3