align.c revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync/***********************************************************************
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* This software is part of the ast package *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* Copyright (c) 1985-2011 AT&T Intellectual Property *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* and is licensed under the *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* Eclipse Public License, Version 1.0 *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* by AT&T Intellectual Property *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* A copy of the License is available at *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* http://www.eclipse.org/org/documents/epl-v10.html *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* Information and Software Systems Research *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* AT&T Research *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* Florham Park NJ *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* Glenn Fowler <gsf@research.att.com> *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* David Korn <dgk@research.att.com> *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* Phong Vo <kpv@research.att.com> *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync* *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync***********************************************************************/
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync#pragma prototyped
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync/*
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync * Glenn Fowler
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync * AT&T Bell Laboratories
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync * generate align features
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync *
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync * NOTE: two's complement binary integral representation assumed
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync */
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync#include "FEATURE/common"
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync#include <setjmp.h>
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsyncunion _u_
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync{
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync long u1;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync char* u2;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync double u3;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync char u4[1024];
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync intmax_t u5;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync uintmax_t u6;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync _ast_fltmax_t u7;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync void* u8;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync char* (*u9)();
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync jmp_buf u10;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync};
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsyncstruct _s_
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync{
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync char s1;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync union _u_ s2;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync};
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync#define roundof(x,y) (((x)+((y)-1))&~((y)-1))
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsyncstatic union _u_ u;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsyncstatic union _u_ v;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsyncint
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsyncmain()
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync{
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync register int i;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync register int j;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync register int k;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync int align0;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync int align1;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync int align2;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync unsigned long bit1;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync unsigned long bit2;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync unsigned long bits0;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync unsigned long bits1;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync unsigned long bits2;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync u.u2 = u.u4;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync v.u2 = u.u2 + 1;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync bit1 = u.u1 ^ v.u1;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync v.u2 = u.u2 + 2;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync bit2 = u.u1 ^ v.u1;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync align0 = sizeof(struct _s_) - sizeof(union _u_);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync bits0 = 0;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync k = 0;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync for (j = 0; j < align0; j++)
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync {
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync u.u2 = u.u4 + j;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync bits1 = 0;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync for (i = 0; i < align0; i++)
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync {
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync v.u2 = u.u2 + i;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync bits1 |= u.u1 ^ v.u1;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync }
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync if (!bits0 || bits1 < bits0)
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync {
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync bits0 = bits1;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync k = j;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync }
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync }
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync align1 = roundof(align0, 2);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync u.u2 = u.u4 + k;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync for (bits1 = bits0; i < align1; i++)
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync {
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync v.u2 = u.u2 + i;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync bits1 |= u.u1 ^ v.u1;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync }
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync align2 = roundof(align0, 4);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync for (bits2 = bits1; i < align2; i++)
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync {
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync v.u2 = u.u2 + i;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync bits2 |= u.u1 ^ v.u1;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync }
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_CHUNK %d\n", sizeof(char*) >= 4 ? 8192 : 1024);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_INTEGRAL uintptr_t\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_INTEGER(x) ((char*)(x)-(char*)0)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_POINTER(x) ((char*)(x))\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync if (bits2 == (align2 - 1))
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_ROUND(x,y) ALIGN_POINTER(ALIGN_INTEGER((x)+(y)-1)&~((y)-1))\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync else
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_ROUND(x,y) ALIGN_POINTER(ALIGN_INTEGER(ALIGN_ALIGN(x)+(((y)+%d)/%d)-1)&~((((y)+%d)/%d)-1))\n", align0, align0, align0, align0);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync if (align0 == align2)
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync {
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_BOUND ALIGN_BOUND2\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_ALIGN(x) ALIGN_ALIGN2(x)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_TRUNC(x) ALIGN_TRUNC2(x)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync }
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync else if (align0 == align1)
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync {
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_BOUND ALIGN_BOUND1\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_ALIGN(x) ALIGN_ALIGN1(x)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_TRUNC(x) ALIGN_TRUNC1(x)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync }
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync else
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync {
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_BOUND 1\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_ALIGN(x) ALIGN_POINTER(x)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_TRUNC(x) ALIGN_POINTER(x)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync }
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_BIT1 0x%lx\n", bit1);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync if (align1 == align2)
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync {
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_BOUND1 ALIGN_BOUND2\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_ALIGN1(x) ALIGN_ALIGN2(x)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_TRUNC1(x) ALIGN_TRUNC2(x)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync }
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync else
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync {
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_BOUND1 %d\n", align1);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_ALIGN1(x) ALIGN_TRUNC1((x)+%d)\n", align1 - 1);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_TRUNC1(x) ALIGN_POINTER(ALIGN_INTEGER((x)+%d)&0x%lx)\n", align1 - 1, ~(bits0|bits1));
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync }
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync#if _X86_ || _X64_
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#if _X64_\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_CLRBIT1(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0xfffffffffffffffeULL)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#else\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_CLRBIT1(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0xfffffffe)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#endif\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync#else
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_CLRBIT1(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", ~bit1);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync#endif
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_SETBIT1(x) ALIGN_POINTER(ALIGN_INTEGER(x)|0x%lx)\n", bit1);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_TSTBIT1(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", bit1);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_BIT2 0x%lx\n", bit2);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync#if _X86_ || _X64_
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#if _X64_\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_BOUND2 16\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_ALIGN2(x) ALIGN_TRUNC2((x)+15)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_TRUNC2(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0xfffffffffffffffeULL)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#else\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_BOUND2 8\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_ALIGN2(x) ALIGN_TRUNC2((x)+7)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_TRUNC2(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0xfffffff8)\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#endif\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync#else
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_BOUND2 %d\n", align2);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_ALIGN2(x) ALIGN_TRUNC2((x)+%d)\n", align2 - 1);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_TRUNC2(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", ~(bits0|bits1|bits2));
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync#endif
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_CLRBIT2(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", ~bit2);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_SETBIT2(x) ALIGN_POINTER(ALIGN_INTEGER(x)|0x%lx)\n", bit2);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("#define ALIGN_TSTBIT2(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", bit2);
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync printf("\n");
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync return 0;
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync}
d58a25651be819045c8e77b89a2f563f0b8982b0vboxsync