Smarter MIN, MAX, ABS macros
Use macros that explicitly avoid double-evaluation and can be used for any datatype, replacing `min`, `max`, `abs`, `fabs`, `labs`, and `FABS`. Co-Authored-By: ejtagle <ejtagle@hotmail.com>
This commit is contained in:
@ -785,79 +785,6 @@ typedef struct
|
||||
|
||||
//! @}
|
||||
|
||||
|
||||
/*! \name Mathematics
|
||||
*
|
||||
* The same considerations as for clz and ctz apply here but GCC does not
|
||||
* provide built-in functions to access the assembly instructions abs, min and
|
||||
* max and it does not produce them by itself in most cases, so two sets of
|
||||
* macros are defined here:
|
||||
* - Abs, Min and Max to apply to constant expressions (values known at
|
||||
* compile time);
|
||||
* - abs, min and max to apply to non-constant expressions (values unknown at
|
||||
* compile time), abs is found in stdlib.h.
|
||||
*/
|
||||
//! @{
|
||||
|
||||
/*! \brief Takes the absolute value of \a a.
|
||||
*
|
||||
* \param a Input value.
|
||||
*
|
||||
* \return Absolute value of \a a.
|
||||
*
|
||||
* \note More optimized if only used with values known at compile time.
|
||||
*/
|
||||
#define Abs(a) (((a) < 0 ) ? -(a) : (a))
|
||||
|
||||
/*! \brief Takes the minimal value of \a a and \a b.
|
||||
*
|
||||
* \param a Input value.
|
||||
* \param b Input value.
|
||||
*
|
||||
* \return Minimal value of \a a and \a b.
|
||||
*
|
||||
* \note More optimized if only used with values known at compile time.
|
||||
*/
|
||||
#define Min(a, b) (((a) < (b)) ? (a) : (b))
|
||||
|
||||
/*! \brief Takes the maximal value of \a a and \a b.
|
||||
*
|
||||
* \param a Input value.
|
||||
* \param b Input value.
|
||||
*
|
||||
* \return Maximal value of \a a and \a b.
|
||||
*
|
||||
* \note More optimized if only used with values known at compile time.
|
||||
*/
|
||||
#define Max(a, b) (((a) > (b)) ? (a) : (b))
|
||||
|
||||
// abs() is already defined by stdlib.h
|
||||
|
||||
/*! \brief Takes the minimal value of \a a and \a b.
|
||||
*
|
||||
* \param a Input value.
|
||||
* \param b Input value.
|
||||
*
|
||||
* \return Minimal value of \a a and \a b.
|
||||
*
|
||||
* \note More optimized if only used with values unknown at compile time.
|
||||
*/
|
||||
#define min(a, b) Min(a, b)
|
||||
|
||||
/*! \brief Takes the maximal value of \a a and \a b.
|
||||
*
|
||||
* \param a Input value.
|
||||
* \param b Input value.
|
||||
*
|
||||
* \return Maximal value of \a a and \a b.
|
||||
*
|
||||
* \note More optimized if only used with values unknown at compile time.
|
||||
*/
|
||||
#define max(a, b) Max(a, b)
|
||||
|
||||
//! @}
|
||||
|
||||
|
||||
/*! \brief Calls the routine at address \a addr.
|
||||
*
|
||||
* It generates a long call opcode.
|
||||
|
@ -1904,7 +1904,7 @@ static void udd_ep_in_sent(udd_ep_id_t ep)
|
||||
ptr_src = &ptr_job->buf[ptr_job->buf_cnt];
|
||||
nb_remain = ptr_job->buf_size - ptr_job->buf_cnt;
|
||||
// Fill a bank even if no data (ZLP)
|
||||
nb_data = min(nb_remain, pkt_size);
|
||||
nb_data = MIN(nb_remain, pkt_size);
|
||||
// Modify job information
|
||||
ptr_job->buf_cnt += nb_data;
|
||||
ptr_job->buf_load = nb_data;
|
||||
|
@ -290,7 +290,7 @@ extern "C" {
|
||||
//! Bounds given integer size to allowed range and rounds it up to the nearest
|
||||
//! available greater size, then applies register format of UOTGHS controller
|
||||
//! for endpoint size bit-field.
|
||||
#define udd_format_endpoint_size(size) (32 - clz(((uint32_t)min(max(size, 8), 1024) << 1) - 1) - 1 - 3)
|
||||
#define udd_format_endpoint_size(size) (32 - clz(((uint32_t)MIN(MAX(size, 8), 1024) << 1) - 1) - 1 - 3)
|
||||
//! Configures the selected endpoint size
|
||||
#define udd_configure_endpoint_size(ep, size) (Wr_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPSIZE_Msk, udd_format_endpoint_size(size)))
|
||||
//! Gets the configured selected endpoint size
|
||||
|
Reference in New Issue
Block a user