Don't update buffer pointer until after checking for shortfall.

The buffer pointer is not needed in the shortfall paths. Moving this
update after the shortfall checks saves 3 cycles in each shortfall path.
This commit is contained in:
Martin Ling
2021-12-29 23:13:10 +00:00
parent 0e99419be2
commit a5e1521535

View File

@ -67,9 +67,9 @@ shadow registers.
There are four key code paths, with the following worst-case timings:
RX, normal: 143 cycles
RX, overrun: 72 cycles
RX, overrun: 69 cycles
TX, normal: 132 cycles
TX, underrun: 139 cycles
TX, underrun: 136 cycles
Design
======
@ -310,9 +310,6 @@ tx_loop:
// Wait for and clear SGPIO interrupt.
await_sgpio tx // await_sgpio() // 34
// Update buffer pointer.
update_buf_ptr // update_buf_ptr() // 3
// Load mode, and return to idle if requested.
mode .req r3
ldr mode, [state, #MODE] // mode = state.mode // 2
@ -334,6 +331,9 @@ tx_loop:
sub buf_margin, #32 // buf_margin -= 32 // 1
bmi tx_zeros // if buf_margin < 0: goto tx_zeros // 1 thru, 3 taken
// Update buffer pointer.
update_buf_ptr // update_buf_ptr() // 3
// At this point we know there is TX data available.
// If still in TX start mode, switch to TX run.
cmp mode, #MODE_TX_START // if mode != TX_START: // 1
@ -391,9 +391,6 @@ rx_loop:
// Wait for and clear SGPIO interrupt.
await_sgpio rx // await_sgpio() // 34
// Update buffer pointer.
update_buf_ptr // update_buf_ptr() // 3
// Load mode, and return to idle if requested.
mode .req r3
ldr mode, [state, #MODE] // mode = state.mode // 2
@ -419,6 +416,9 @@ rx_loop:
sub buf_margin, count // buf_margin -= count // 1
bmi rx_shortfall // if buf_margin < 0: goto rx_shortfall // 1 thru, 3 taken
// Update buffer pointer.
update_buf_ptr // update_buf_ptr() // 3
// Read data from SGPIO.
ldr r0, [sgpio_data, #SLICE0] // r0 = SGPIO_REG_SS[SLICE0] // 10
ldr r1, [sgpio_data, #SLICE1] // r1 = SGPIO_REG_SS[SLICE1] // 10