Add shortcuts to SwapEndian_16() and SwapEndian_32() internal functions to improve optimization if called with constant inputs.
This commit is contained in:
parent
ef4cff29c3
commit
3478178127
5 changed files with 53 additions and 25 deletions
|
|
@ -70,26 +70,26 @@
|
|||
*
|
||||
* \param[in, out] StructPtr Pointer to a structure which is to be forced into indirect access mode.
|
||||
*/
|
||||
#define GCC_FORCE_POINTER_ACCESS(StructPtr) __asm__ __volatile__("" : "=b" (StructPtr) : "0" (StructPtr))
|
||||
#define GCC_FORCE_POINTER_ACCESS(StructPtr) __asm__ __volatile__("" : "=b" (StructPtr) : "0" (StructPtr))
|
||||
|
||||
/** Forces GCC to create a memory barrier, ensuring that memory accesses are not reordered past the barrier point.
|
||||
* This can be used before ordering-critical operations, to ensure that the compiler does not re-order the resulting
|
||||
* assembly output in an unexpected manner on sections of code that are ordering-specific.
|
||||
*/
|
||||
#define GCC_MEMORY_BARRIER() __asm__ __volatile__("" ::: "memory");
|
||||
#define GCC_MEMORY_BARRIER() __asm__ __volatile__("" ::: "memory");
|
||||
|
||||
/** Evaluates to boolean true if the specified value can be determined at compile time to be a constant value
|
||||
* when compiling under GCC.
|
||||
*
|
||||
* \param[in] x Value to check compile time constantness of.
|
||||
*
|
||||
* \return Boolean true if the given value is known to be a compile time constant.
|
||||
* \return Boolean true if the given value is known to be a compile time constant, false otherwise.
|
||||
*/
|
||||
#define GCC_IS_COMPILE_CONST(x) __builtin_constant_p(x)
|
||||
#define GCC_IS_COMPILE_CONST(x) __builtin_constant_p(x)
|
||||
#else
|
||||
#define GCC_FORCE_POINTER_ACCESS(StructPtr)
|
||||
#define GCC_MEMORY_BARRIER()
|
||||
#define GCC_IS_COMPILE_CONST(x) 0
|
||||
#define GCC_IS_COMPILE_CONST(x) 0
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -394,6 +394,9 @@
|
|||
static inline uint16_t SwapEndian_16(const uint16_t Word) ATTR_WARN_UNUSED_RESULT ATTR_CONST;
|
||||
static inline uint16_t SwapEndian_16(const uint16_t Word)
|
||||
{
|
||||
if (GCC_IS_COMPILE_CONST(Word))
|
||||
return SWAPENDIAN_16(Word);
|
||||
|
||||
uint8_t Temp;
|
||||
|
||||
union
|
||||
|
|
@ -420,6 +423,9 @@
|
|||
static inline uint32_t SwapEndian_32(const uint32_t DWord) ATTR_WARN_UNUSED_RESULT ATTR_CONST;
|
||||
static inline uint32_t SwapEndian_32(const uint32_t DWord)
|
||||
{
|
||||
if (GCC_IS_COMPILE_CONST(DWord))
|
||||
return SWAPENDIAN_32(DWord);
|
||||
|
||||
uint8_t Temp;
|
||||
|
||||
union
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@
|
|||
* - Fixed KeyboardHost and KeyboardHostWithParser demos displaying incorrect values when numerical keys were pressed
|
||||
* - Fixed compile errors in the incomplete BluetoothHost demo application (thanks to Timo Lindfors)
|
||||
* - Fixed incorrect Dataflash buffer use in the DataflashManager_WriteBlocks_RAM() function of several demos/projects (thanks to Jeremy Willden)
|
||||
* - Fixed incorrect logging interval (always 500ms longer than requested) in the TempDataLogger project
|
||||
*
|
||||
* \section Sec_ChangeLog110528 Version 110528
|
||||
* <b>New:</b>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue