From a5e1521535e60ef17793e0bb4e565d8bd626bcd4 Mon Sep 17 00:00:00 2001 From: Martin Ling Date: Wed, 29 Dec 2021 23:13:10 +0000 Subject: [PATCH] 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. --- firmware/hackrf_usb/sgpio_m0.s | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/firmware/hackrf_usb/sgpio_m0.s b/firmware/hackrf_usb/sgpio_m0.s index bb710936..d7a58699 100644 --- a/firmware/hackrf_usb/sgpio_m0.s +++ b/firmware/hackrf_usb/sgpio_m0.s @@ -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