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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue