14887Schin /***********************************************************************
24887Schin * *
34887Schin * This software is part of the ast package *
4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property *
54887Schin * and is licensed under the *
64887Schin * Common Public License, Version 1.0 *
78462SApril.Chin@Sun.COM * by AT&T Intellectual Property *
84887Schin * *
94887Schin * A copy of the License is available at *
104887Schin * http://www.opensource.org/licenses/cpl1.0.txt *
114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
124887Schin * *
134887Schin * Information and Software Systems Research *
144887Schin * AT&T Research *
154887Schin * Florham Park NJ *
164887Schin * *
174887Schin * Glenn Fowler <gsf@research.att.com> *
184887Schin * David Korn <dgk@research.att.com> *
194887Schin * Phong Vo <kpv@research.att.com> *
204887Schin * *
214887Schin ***********************************************************************/
224887Schin #pragma prototyped
234887Schin /*
244887Schin * Glenn Fowler
254887Schin * AT&T Bell Laboratories
264887Schin *
274887Schin * generate align features
284887Schin *
294887Schin * NOTE: two's complement binary integral representation assumed
304887Schin */
314887Schin
324887Schin #include "FEATURE/common"
334887Schin
344887Schin #include <setjmp.h>
354887Schin
364887Schin union _u_
374887Schin {
384887Schin long u1;
394887Schin char* u2;
404887Schin double u3;
414887Schin char u4[1024];
424887Schin intmax_t u5;
434887Schin uintmax_t u6;
444887Schin _ast_fltmax_t u7;
454887Schin void* u8;
464887Schin char* (*u9)();
474887Schin jmp_buf u10;
484887Schin };
494887Schin
504887Schin struct _s_
514887Schin {
524887Schin char s1;
534887Schin union _u_ s2;
544887Schin };
554887Schin
564887Schin #define roundof(x,y) (((x)+((y)-1))&~((y)-1))
574887Schin
584887Schin static union _u_ u;
594887Schin static union _u_ v;
604887Schin
614887Schin int
main()624887Schin main()
634887Schin {
644887Schin register int i;
654887Schin register int j;
664887Schin register int k;
674887Schin
684887Schin int align0;
694887Schin int align1;
704887Schin int align2;
714887Schin unsigned long bit1;
724887Schin unsigned long bit2;
734887Schin unsigned long bits0;
744887Schin unsigned long bits1;
754887Schin unsigned long bits2;
764887Schin
774887Schin u.u2 = u.u4;
784887Schin v.u2 = u.u2 + 1;
794887Schin bit1 = u.u1 ^ v.u1;
804887Schin v.u2 = u.u2 + 2;
814887Schin bit2 = u.u1 ^ v.u1;
824887Schin align0 = sizeof(struct _s_) - sizeof(union _u_);
834887Schin bits0 = 0;
844887Schin k = 0;
854887Schin for (j = 0; j < align0; j++)
864887Schin {
874887Schin u.u2 = u.u4 + j;
884887Schin bits1 = 0;
894887Schin for (i = 0; i < align0; i++)
904887Schin {
914887Schin v.u2 = u.u2 + i;
924887Schin bits1 |= u.u1 ^ v.u1;
934887Schin }
944887Schin if (!bits0 || bits1 < bits0)
954887Schin {
964887Schin bits0 = bits1;
974887Schin k = j;
984887Schin }
994887Schin }
1004887Schin align1 = roundof(align0, 2);
1014887Schin u.u2 = u.u4 + k;
1024887Schin for (bits1 = bits0; i < align1; i++)
1034887Schin {
1044887Schin v.u2 = u.u2 + i;
1054887Schin bits1 |= u.u1 ^ v.u1;
1064887Schin }
1074887Schin align2 = roundof(align0, 4);
1084887Schin for (bits2 = bits1; i < align2; i++)
1094887Schin {
1104887Schin v.u2 = u.u2 + i;
1114887Schin bits2 |= u.u1 ^ v.u1;
1124887Schin }
1134887Schin printf("typedef unsigned %s ALIGN_INTEGRAL;\n", sizeof(char*) >= sizeof(long) ? "long" : sizeof(char*) >= sizeof(int) ? "int" : "short");
1144887Schin printf("\n");
1154887Schin printf("#define ALIGN_CHUNK %d\n", sizeof(char*) >= 4 ? 8192 : 1024);
1164887Schin printf("#define ALIGN_INTEGRAL %s\n", sizeof(char*) >= sizeof(long) ? "long" : sizeof(char*) >= sizeof(int) ? "int" : "short");
1174887Schin printf("#define ALIGN_INTEGER(x) ((ALIGN_INTEGRAL)(x))\n");
1184887Schin printf("#define ALIGN_POINTER(x) ((char*)(x))\n");
1194887Schin if (bits2 == (align2 - 1)) printf("#define ALIGN_ROUND(x,y) ALIGN_POINTER(ALIGN_INTEGER((x)+(y)-1)&~((y)-1))\n");
1204887Schin else 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);
1214887Schin printf("\n");
1224887Schin if (align0 == align2)
1234887Schin {
1244887Schin printf("#define ALIGN_BOUND ALIGN_BOUND2\n");
1254887Schin printf("#define ALIGN_ALIGN(x) ALIGN_ALIGN2(x)\n");
1264887Schin printf("#define ALIGN_TRUNC(x) ALIGN_TRUNC2(x)\n");
1274887Schin }
1284887Schin else if (align0 == align1)
1294887Schin {
1304887Schin printf("#define ALIGN_BOUND ALIGN_BOUND1\n");
1314887Schin printf("#define ALIGN_ALIGN(x) ALIGN_ALIGN1(x)\n");
1324887Schin printf("#define ALIGN_TRUNC(x) ALIGN_TRUNC1(x)\n");
1334887Schin }
1344887Schin else
1354887Schin {
1364887Schin printf("#define ALIGN_BOUND 1\n");
1374887Schin printf("#define ALIGN_ALIGN(x) ALIGN_POINTER(x)\n");
1384887Schin printf("#define ALIGN_TRUNC(x) ALIGN_POINTER(x)\n");
1394887Schin }
1404887Schin printf("\n");
1414887Schin printf("#define ALIGN_BIT1 0x%lx\n", bit1);
1424887Schin if (align1 == align2)
1434887Schin {
1444887Schin printf("#define ALIGN_BOUND1 ALIGN_BOUND2\n");
1454887Schin printf("#define ALIGN_ALIGN1(x) ALIGN_ALIGN2(x)\n");
1464887Schin printf("#define ALIGN_TRUNC1(x) ALIGN_TRUNC2(x)\n");
1474887Schin }
1484887Schin else
1494887Schin {
1504887Schin printf("#define ALIGN_BOUND1 %d\n", align1);
1514887Schin printf("#define ALIGN_ALIGN1(x) ALIGN_TRUNC1((x)+%d)\n", align1 - 1);
1524887Schin printf("#define ALIGN_TRUNC1(x) ALIGN_POINTER(ALIGN_INTEGER((x)+%d)&0x%lx)\n", align1 - 1, ~(bits0|bits1));
1534887Schin }
1544887Schin printf("#define ALIGN_CLRBIT1(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", ~bit1);
1554887Schin printf("#define ALIGN_SETBIT1(x) ALIGN_POINTER(ALIGN_INTEGER(x)|0x%lx)\n", bit1);
1564887Schin printf("#define ALIGN_TSTBIT1(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", bit1);
1574887Schin printf("\n");
1584887Schin printf("#define ALIGN_BIT2 0x%lx\n", bit2);
1594887Schin printf("#define ALIGN_BOUND2 %d\n", align2);
1604887Schin printf("#define ALIGN_ALIGN2(x) ALIGN_TRUNC2((x)+%d)\n", align2 - 1);
1614887Schin printf("#define ALIGN_TRUNC2(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", ~(bits0|bits1|bits2));
1624887Schin printf("#define ALIGN_CLRBIT2(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", ~bit2);
1634887Schin printf("#define ALIGN_SETBIT2(x) ALIGN_POINTER(ALIGN_INTEGER(x)|0x%lx)\n", bit2);
1644887Schin printf("#define ALIGN_TSTBIT2(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", bit2);
1654887Schin printf("\n");
1664887Schin return 0;
1674887Schin }
168