xref: /titanic_44/usr/src/lib/libast/common/features/align.c (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
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