1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin * *
3da2e3ebdSchin * This software is part of the ast package *
4*3e14f97fSRoger A. Faulkner * Copyright (c) 1985-2010 AT&T Intellectual Property *
5da2e3ebdSchin * and is licensed under the *
6da2e3ebdSchin * Common Public License, Version 1.0 *
77c2fbfb3SApril Chin * by AT&T Intellectual Property *
8da2e3ebdSchin * *
9da2e3ebdSchin * A copy of the License is available at *
10da2e3ebdSchin * http://www.opensource.org/licenses/cpl1.0.txt *
11da2e3ebdSchin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
12da2e3ebdSchin * *
13da2e3ebdSchin * Information and Software Systems Research *
14da2e3ebdSchin * AT&T Research *
15da2e3ebdSchin * Florham Park NJ *
16da2e3ebdSchin * *
17da2e3ebdSchin * Glenn Fowler <gsf@research.att.com> *
18da2e3ebdSchin * David Korn <dgk@research.att.com> *
19da2e3ebdSchin * Phong Vo <kpv@research.att.com> *
20da2e3ebdSchin * *
21da2e3ebdSchin ***********************************************************************/
22da2e3ebdSchin #pragma prototyped
23da2e3ebdSchin /*
24da2e3ebdSchin * Glenn Fowler
25da2e3ebdSchin * AT&T Bell Laboratories
26da2e3ebdSchin *
27da2e3ebdSchin * generate align features
28da2e3ebdSchin *
29da2e3ebdSchin * NOTE: two's complement binary integral representation assumed
30da2e3ebdSchin */
31da2e3ebdSchin
32da2e3ebdSchin #include "FEATURE/common"
33da2e3ebdSchin
34da2e3ebdSchin #include <setjmp.h>
35da2e3ebdSchin
36da2e3ebdSchin union _u_
37da2e3ebdSchin {
38da2e3ebdSchin long u1;
39da2e3ebdSchin char* u2;
40da2e3ebdSchin double u3;
41da2e3ebdSchin char u4[1024];
42da2e3ebdSchin intmax_t u5;
43da2e3ebdSchin uintmax_t u6;
44da2e3ebdSchin _ast_fltmax_t u7;
45da2e3ebdSchin void* u8;
46da2e3ebdSchin char* (*u9)();
47da2e3ebdSchin jmp_buf u10;
48da2e3ebdSchin };
49da2e3ebdSchin
50da2e3ebdSchin struct _s_
51da2e3ebdSchin {
52da2e3ebdSchin char s1;
53da2e3ebdSchin union _u_ s2;
54da2e3ebdSchin };
55da2e3ebdSchin
56da2e3ebdSchin #define roundof(x,y) (((x)+((y)-1))&~((y)-1))
57da2e3ebdSchin
58da2e3ebdSchin static union _u_ u;
59da2e3ebdSchin static union _u_ v;
60da2e3ebdSchin
61da2e3ebdSchin int
main()62da2e3ebdSchin main()
63da2e3ebdSchin {
64da2e3ebdSchin register int i;
65da2e3ebdSchin register int j;
66da2e3ebdSchin register int k;
67da2e3ebdSchin
68da2e3ebdSchin int align0;
69da2e3ebdSchin int align1;
70da2e3ebdSchin int align2;
71da2e3ebdSchin unsigned long bit1;
72da2e3ebdSchin unsigned long bit2;
73da2e3ebdSchin unsigned long bits0;
74da2e3ebdSchin unsigned long bits1;
75da2e3ebdSchin unsigned long bits2;
76da2e3ebdSchin
77da2e3ebdSchin u.u2 = u.u4;
78da2e3ebdSchin v.u2 = u.u2 + 1;
79da2e3ebdSchin bit1 = u.u1 ^ v.u1;
80da2e3ebdSchin v.u2 = u.u2 + 2;
81da2e3ebdSchin bit2 = u.u1 ^ v.u1;
82da2e3ebdSchin align0 = sizeof(struct _s_) - sizeof(union _u_);
83da2e3ebdSchin bits0 = 0;
84da2e3ebdSchin k = 0;
85da2e3ebdSchin for (j = 0; j < align0; j++)
86da2e3ebdSchin {
87da2e3ebdSchin u.u2 = u.u4 + j;
88da2e3ebdSchin bits1 = 0;
89da2e3ebdSchin for (i = 0; i < align0; i++)
90da2e3ebdSchin {
91da2e3ebdSchin v.u2 = u.u2 + i;
92da2e3ebdSchin bits1 |= u.u1 ^ v.u1;
93da2e3ebdSchin }
94da2e3ebdSchin if (!bits0 || bits1 < bits0)
95da2e3ebdSchin {
96da2e3ebdSchin bits0 = bits1;
97da2e3ebdSchin k = j;
98da2e3ebdSchin }
99da2e3ebdSchin }
100da2e3ebdSchin align1 = roundof(align0, 2);
101da2e3ebdSchin u.u2 = u.u4 + k;
102da2e3ebdSchin for (bits1 = bits0; i < align1; i++)
103da2e3ebdSchin {
104da2e3ebdSchin v.u2 = u.u2 + i;
105da2e3ebdSchin bits1 |= u.u1 ^ v.u1;
106da2e3ebdSchin }
107da2e3ebdSchin align2 = roundof(align0, 4);
108da2e3ebdSchin for (bits2 = bits1; i < align2; i++)
109da2e3ebdSchin {
110da2e3ebdSchin v.u2 = u.u2 + i;
111da2e3ebdSchin bits2 |= u.u1 ^ v.u1;
112da2e3ebdSchin }
113da2e3ebdSchin printf("typedef unsigned %s ALIGN_INTEGRAL;\n", sizeof(char*) >= sizeof(long) ? "long" : sizeof(char*) >= sizeof(int) ? "int" : "short");
114da2e3ebdSchin printf("\n");
115da2e3ebdSchin printf("#define ALIGN_CHUNK %d\n", sizeof(char*) >= 4 ? 8192 : 1024);
116da2e3ebdSchin printf("#define ALIGN_INTEGRAL %s\n", sizeof(char*) >= sizeof(long) ? "long" : sizeof(char*) >= sizeof(int) ? "int" : "short");
117da2e3ebdSchin printf("#define ALIGN_INTEGER(x) ((ALIGN_INTEGRAL)(x))\n");
118da2e3ebdSchin printf("#define ALIGN_POINTER(x) ((char*)(x))\n");
119da2e3ebdSchin if (bits2 == (align2 - 1)) printf("#define ALIGN_ROUND(x,y) ALIGN_POINTER(ALIGN_INTEGER((x)+(y)-1)&~((y)-1))\n");
120da2e3ebdSchin 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);
121da2e3ebdSchin printf("\n");
122da2e3ebdSchin if (align0 == align2)
123da2e3ebdSchin {
124da2e3ebdSchin printf("#define ALIGN_BOUND ALIGN_BOUND2\n");
125da2e3ebdSchin printf("#define ALIGN_ALIGN(x) ALIGN_ALIGN2(x)\n");
126da2e3ebdSchin printf("#define ALIGN_TRUNC(x) ALIGN_TRUNC2(x)\n");
127da2e3ebdSchin }
128da2e3ebdSchin else if (align0 == align1)
129da2e3ebdSchin {
130da2e3ebdSchin printf("#define ALIGN_BOUND ALIGN_BOUND1\n");
131da2e3ebdSchin printf("#define ALIGN_ALIGN(x) ALIGN_ALIGN1(x)\n");
132da2e3ebdSchin printf("#define ALIGN_TRUNC(x) ALIGN_TRUNC1(x)\n");
133da2e3ebdSchin }
134da2e3ebdSchin else
135da2e3ebdSchin {
136da2e3ebdSchin printf("#define ALIGN_BOUND 1\n");
137da2e3ebdSchin printf("#define ALIGN_ALIGN(x) ALIGN_POINTER(x)\n");
138da2e3ebdSchin printf("#define ALIGN_TRUNC(x) ALIGN_POINTER(x)\n");
139da2e3ebdSchin }
140da2e3ebdSchin printf("\n");
141da2e3ebdSchin printf("#define ALIGN_BIT1 0x%lx\n", bit1);
142da2e3ebdSchin if (align1 == align2)
143da2e3ebdSchin {
144da2e3ebdSchin printf("#define ALIGN_BOUND1 ALIGN_BOUND2\n");
145da2e3ebdSchin printf("#define ALIGN_ALIGN1(x) ALIGN_ALIGN2(x)\n");
146da2e3ebdSchin printf("#define ALIGN_TRUNC1(x) ALIGN_TRUNC2(x)\n");
147da2e3ebdSchin }
148da2e3ebdSchin else
149da2e3ebdSchin {
150da2e3ebdSchin printf("#define ALIGN_BOUND1 %d\n", align1);
151da2e3ebdSchin printf("#define ALIGN_ALIGN1(x) ALIGN_TRUNC1((x)+%d)\n", align1 - 1);
152da2e3ebdSchin printf("#define ALIGN_TRUNC1(x) ALIGN_POINTER(ALIGN_INTEGER((x)+%d)&0x%lx)\n", align1 - 1, ~(bits0|bits1));
153da2e3ebdSchin }
154da2e3ebdSchin printf("#define ALIGN_CLRBIT1(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", ~bit1);
155da2e3ebdSchin printf("#define ALIGN_SETBIT1(x) ALIGN_POINTER(ALIGN_INTEGER(x)|0x%lx)\n", bit1);
156da2e3ebdSchin printf("#define ALIGN_TSTBIT1(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", bit1);
157da2e3ebdSchin printf("\n");
158da2e3ebdSchin printf("#define ALIGN_BIT2 0x%lx\n", bit2);
159da2e3ebdSchin printf("#define ALIGN_BOUND2 %d\n", align2);
160da2e3ebdSchin printf("#define ALIGN_ALIGN2(x) ALIGN_TRUNC2((x)+%d)\n", align2 - 1);
161da2e3ebdSchin printf("#define ALIGN_TRUNC2(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", ~(bits0|bits1|bits2));
162da2e3ebdSchin printf("#define ALIGN_CLRBIT2(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", ~bit2);
163da2e3ebdSchin printf("#define ALIGN_SETBIT2(x) ALIGN_POINTER(ALIGN_INTEGER(x)|0x%lx)\n", bit2);
164da2e3ebdSchin printf("#define ALIGN_TSTBIT2(x) ALIGN_POINTER(ALIGN_INTEGER(x)&0x%lx)\n", bit2);
165da2e3ebdSchin printf("\n");
166da2e3ebdSchin return 0;
167da2e3ebdSchin }
168