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