7#ifndef _HARDWARE_DIVIDER_H
8#define _HARDWARE_DIVIDER_H
11#include "hardware/structs/sio.h"
43typedef uint64_t divmod_result_t;
55 check_hw_layout(
sio_hw_t, div_sdividend, SIO_DIV_SDIVIDEND_OFFSET);
56 sio_hw->div_sdividend = (uint32_t)a;
57 sio_hw->div_sdivisor = (uint32_t)b;
71 sio_hw_t, div_udividend, SIO_DIV_UDIVIDEND_OFFSET);
72 sio_hw->div_udividend = a;
73 sio_hw->div_udivisor = b;
83 static_assert(SIO_DIV_CSR_READY_BITS == 1,
"");
88 pico_default_asm_volatile (
89 "hw_divider_result_loop_%=:"
90 "ldr %0, [%1, %2]\n\t"
92 "bcc hw_divider_result_loop_%=\n\t"
94 :
"l" (sio_hw),
"I" (SIO_DIV_CSR_OFFSET)
108 divmod_result_t rc = ((divmod_result_t) sio_hw->div_remainder) << 32u;
109 rc |= sio_hw->div_quotient;
134 return sio_hw->div_quotient;
146 return (int32_t)sio_hw->div_quotient;
158 uint32_t rc = sio_hw->div_remainder;
159 sio_hw->div_quotient;
172 int32_t rc = (int32_t)sio_hw->div_remainder;
173 sio_hw->div_quotient;
216 return (int32_t)(uint32_t)r;
228 return (uint32_t)(r >> 32u);
240 return (int32_t)(r >> 32u);
299 pico_default_asm_volatile(
323 return sio_hw->div_quotient;
338 uint32_t rc = sio_hw->div_remainder;
339 sio_hw->div_quotient;
355 return (int32_t)sio_hw->div_quotient;
370 int32_t rc = (int32_t)sio_hw->div_remainder;
371 sio_hw->div_quotient;
divmod_result_t hw_divider_divmod_u32(uint32_t a, uint32_t b)
Do an unsigned HW divide and wait for result.
static int32_t hw_divider_quotient_s32(int32_t a, int32_t b)
Do a signed HW divide, wait for result, return quotient.
Definition divider.h:278
static uint32_t to_quotient_u32(divmod_result_t r)
Efficient extraction of unsigned quotient from 32p32 fixed point.
Definition divider.h:205
static int32_t hw_divider_s32_quotient_inlined(int32_t a, int32_t b)
Do a hardware signed HW divide, wait for result, return quotient.
Definition divider.h:352
static uint32_t hw_divider_u32_remainder_wait(void)
Return result of last asynchronous HW divide, unsigned remainder only.
Definition divider.h:156
static void hw_divider_divmod_u32_start(uint32_t a, uint32_t b)
Start an unsigned asynchronous divide.
Definition divider.h:69
static void hw_divider_divmod_s32_start(int32_t a, int32_t b)
Start a signed asynchronous divide.
Definition divider.h:54
static int32_t hw_divider_remainder_s32(int32_t a, int32_t b)
Do a signed HW divide, wait for result, return remainder.
Definition divider.h:291
static uint32_t hw_divider_u32_remainder_inlined(uint32_t a, uint32_t b)
Do a hardware unsigned HW divide, wait for result, return remainder.
Definition divider.h:335
static uint32_t hw_divider_u32_quotient_wait(void)
Return result of last asynchronous HW divide, unsigned quotient only.
Definition divider.h:132
static divmod_result_t hw_divider_result_nowait(void)
Return result of HW divide, nowait.
Definition divider.h:106
static int32_t to_quotient_s32(divmod_result_t r)
Efficient extraction of signed quotient from 32p32 fixed point.
Definition divider.h:215
static int32_t to_remainder_s32(divmod_result_t r)
Efficient extraction of signed remainder from 32p32 fixed point.
Definition divider.h:239
static void hw_divider_wait_ready(void)
Wait for a divide to complete.
Definition divider.h:81
static int32_t hw_divider_s32_remainder_inlined(int32_t a, int32_t b)
Do a hardware signed HW divide, wait for result, return remainder.
Definition divider.h:367
static uint32_t hw_divider_u32_quotient(uint32_t a, uint32_t b)
Do an unsigned HW divide, wait for result, return quotient.
Definition divider.h:252
static uint32_t hw_divider_u32_remainder(uint32_t a, uint32_t b)
Do an unsigned HW divide, wait for result, return remainder.
Definition divider.h:265
static int32_t hw_divider_s32_quotient_wait(void)
Return result of last asynchronous HW divide, signed quotient only.
Definition divider.h:144
static divmod_result_t hw_divider_result_wait(void)
Return result of last asynchronous HW divide.
Definition divider.h:120
static void hw_divider_pause(void)
Pause for exact amount of time needed for a asynchronous divide to complete.
Definition divider.h:298
static uint32_t hw_divider_u32_quotient_inlined(uint32_t a, uint32_t b)
Do a hardware unsigned HW divide, wait for result, return quotient.
Definition divider.h:320
static int32_t hw_divider_s32_remainder_wait(void)
Return result of last asynchronous HW divide, signed remainder only.
Definition divider.h:170
divmod_result_t hw_divider_divmod_s32(int32_t a, int32_t b)
Do a signed HW divide and wait for result.
static uint32_t to_remainder_u32(divmod_result_t r)
Efficient extraction of unsigned remainder from 32p32 fixed point.
Definition divider.h:227
void hw_divider_save_state(hw_divider_state_t *dest)
Save the calling cores hardware divider state.
void hw_divider_restore_state(hw_divider_state_t *src)
Load a saved hardware divider state into the current core's hardware divider.