Mercurial > hg > x
view align8.h @ 1:6422640a802f
first upload
author | Wen X <xue.wen@elec.qmul.ac.uk> |
---|---|
date | Tue, 05 Oct 2010 10:45:57 +0100 |
parents | |
children | 5f3c32dc6e17 |
line wrap: on
line source
//--------------------------------------------------------------------------- #ifndef align8H #define align8H /* align8.cpp - 8-byte (64-bit) alignment routines. This file provides tools for aligning boundaries of arrays, particularly of 64-byte units, e.g. double- precision floating points, to physical addresses divisible by 8, including aligning dynamically allocated memory block and aligning call stack. Currently stack alignment is disabled due to lack of compiler support for Intel assembly. Further reading: "Double precision floating point alignment issue.pdf" */ //--stack alignment---------------------------------------------------------- /* These two macros are used to envelop a function call so that the function is called with a stack pointer that is a multiple of 8. Aligning the stack does not automatically ensure that local double -precision floating-point variables (or other variables one wants to align to 8-byte boundaries) are aligned to 8-byte boundaries; one has to adjust the variable declaration order, using dummy variables if necessary, to make the alignment happen. */ //macro ALIGN_STACK_8 moves the current stack pointer to a multiple of 8 #define ALIGN_STACK_8 {int alignstack; asm {mov alignstack, esp} asm {and esp, 0xFFFFFFF8} //macro RESTORE_STACK moves the stack pointer back to where it was before ALIGN_STACK_8 #define RESTORE_STACK asm {mov esp, alignstack}} //ALIGN8 ensures F is executed with a start stack pointer divisible by 8. Currently disabled. #define ALIGN8(F) F //uncomment the following line to enable stack alignment //#define ALIGN8(F) ALIGN_STACK_8 F RESTORE_STACK //--64-bit aligned memory allocation routines-------------------------------- void* malloc8(unsigned size); void free8(void* buffer8); #endif