1/*
2 * Copyright (c) 2004 Marcel Moolenaar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD$");
29
30#include <stddef.h>
31#include <machine/reg.h>
32
33#define PRESERVED(x)    offsetof(struct reg, r_preserved)       \
34                        + offsetof(struct _callee_saved, x)
35#define SCRATCH(x)      offsetof(struct reg, r_scratch)         \
36                        + offsetof(struct _caller_saved, x)
37#define SPECIAL(x)      offsetof(struct reg, r_special)         \
38                        + offsetof(struct _special, x)
39
40#define HIGH_FP(x)      offsetof(struct fpreg, fpr_high)        \
41                        + offsetof(struct _high_fp, x)
42#define PRESERVED_FP(x) offsetof(struct fpreg, fpr_preserved)   \
43                        + offsetof(struct _callee_saved_fp, x)
44#define SCRATCH_FP(x)   offsetof(struct fpreg, fpr_scratch)     \
45                        + offsetof(struct _caller_saved_fp, x)
46
47static int regofs[] = {
48        /*
49	 * General registers (0-127)
50	 */
51        -1,             /* gr0 */
52        SPECIAL(gp),
53        SCRATCH(gr2),   SCRATCH(gr3),
54        PRESERVED(gr4), PRESERVED(gr5), PRESERVED(gr6), PRESERVED(gr7),
55        SCRATCH(gr8),   SCRATCH(gr9),   SCRATCH(gr10),  SCRATCH(gr11),
56        SPECIAL(sp),    SPECIAL(tp),
57        SCRATCH(gr14),  SCRATCH(gr15),  SCRATCH(gr16),  SCRATCH(gr17),
58        SCRATCH(gr18),  SCRATCH(gr19),  SCRATCH(gr20),  SCRATCH(gr21),
59        SCRATCH(gr22),  SCRATCH(gr23),  SCRATCH(gr24),  SCRATCH(gr25),
60        SCRATCH(gr26),  SCRATCH(gr27),  SCRATCH(gr28),  SCRATCH(gr29),
61        SCRATCH(gr30),  SCRATCH(gr31),
62        /*
63         * gr32 through gr127 are not directly available as they are
64         * stacked registers.
65         */
66        -1, -1, -1, -1, -1, -1, -1, -1,         /* gr32-gr39 */
67        -1, -1, -1, -1, -1, -1, -1, -1,         /* gr40-gr47 */
68        -1, -1, -1, -1, -1, -1, -1, -1,         /* gr48-gr55 */
69        -1, -1, -1, -1, -1, -1, -1, -1,         /* gr56-gr63 */
70        -1, -1, -1, -1, -1, -1, -1, -1,         /* gr64-gr71 */
71        -1, -1, -1, -1, -1, -1, -1, -1,         /* gr72-gr79 */
72        -1, -1, -1, -1, -1, -1, -1, -1,         /* gr80-gr87 */
73        -1, -1, -1, -1, -1, -1, -1, -1,         /* gr88-gr95 */
74        -1, -1, -1, -1, -1, -1, -1, -1,         /* gr96-gr103 */
75        -1, -1, -1, -1, -1, -1, -1, -1,         /* gr104-gr111 */
76        -1, -1, -1, -1, -1, -1, -1, -1,         /* gr112-gr119 */
77        -1, -1, -1, -1, -1, -1, -1, -1,         /* gr120-gr127 */
78        /*
79         * Floating-point registers (128-255)
80         */
81        -1,             /* fr0: constant 0.0 */
82        -1,             /* fr1: constant 1.0 */
83        PRESERVED_FP(fr2),      PRESERVED_FP(fr3),
84        PRESERVED_FP(fr4),      PRESERVED_FP(fr5),
85        SCRATCH_FP(fr6),        SCRATCH_FP(fr7),
86        SCRATCH_FP(fr8),        SCRATCH_FP(fr9),
87        SCRATCH_FP(fr10),       SCRATCH_FP(fr11),
88        SCRATCH_FP(fr12),       SCRATCH_FP(fr13),
89        SCRATCH_FP(fr14),       SCRATCH_FP(fr15),
90        PRESERVED_FP(fr16),     PRESERVED_FP(fr17),
91        PRESERVED_FP(fr18),     PRESERVED_FP(fr19),
92        PRESERVED_FP(fr20),     PRESERVED_FP(fr21),
93        PRESERVED_FP(fr22),     PRESERVED_FP(fr23),
94        PRESERVED_FP(fr24),     PRESERVED_FP(fr25),
95        PRESERVED_FP(fr26),     PRESERVED_FP(fr27),
96        PRESERVED_FP(fr28),     PRESERVED_FP(fr29),
97        PRESERVED_FP(fr30),     PRESERVED_FP(fr31),
98        HIGH_FP(fr32),  HIGH_FP(fr33),  HIGH_FP(fr34),  HIGH_FP(fr35),
99        HIGH_FP(fr36),  HIGH_FP(fr37),  HIGH_FP(fr38),  HIGH_FP(fr39),
100        HIGH_FP(fr40),  HIGH_FP(fr41),  HIGH_FP(fr42),  HIGH_FP(fr43),
101        HIGH_FP(fr44),  HIGH_FP(fr45),  HIGH_FP(fr46),  HIGH_FP(fr47),
102        HIGH_FP(fr48),  HIGH_FP(fr49),  HIGH_FP(fr50),  HIGH_FP(fr51),
103        HIGH_FP(fr52),  HIGH_FP(fr53),  HIGH_FP(fr54),  HIGH_FP(fr55),
104        HIGH_FP(fr56),  HIGH_FP(fr57),  HIGH_FP(fr58),  HIGH_FP(fr59),
105        HIGH_FP(fr60),  HIGH_FP(fr61),  HIGH_FP(fr62),  HIGH_FP(fr63),
106        HIGH_FP(fr64),  HIGH_FP(fr65),  HIGH_FP(fr66),  HIGH_FP(fr67),
107        HIGH_FP(fr68),  HIGH_FP(fr69),  HIGH_FP(fr70),  HIGH_FP(fr71),
108        HIGH_FP(fr72),  HIGH_FP(fr73),  HIGH_FP(fr74),  HIGH_FP(fr75),
109        HIGH_FP(fr76),  HIGH_FP(fr77),  HIGH_FP(fr78),  HIGH_FP(fr79),
110        HIGH_FP(fr80),  HIGH_FP(fr81),  HIGH_FP(fr82),  HIGH_FP(fr83),
111        HIGH_FP(fr84),  HIGH_FP(fr85),  HIGH_FP(fr86),  HIGH_FP(fr87),
112        HIGH_FP(fr88),  HIGH_FP(fr89),  HIGH_FP(fr90),  HIGH_FP(fr91),
113        HIGH_FP(fr92),  HIGH_FP(fr93),  HIGH_FP(fr94),  HIGH_FP(fr95),
114        HIGH_FP(fr96),  HIGH_FP(fr97),  HIGH_FP(fr98),  HIGH_FP(fr99),
115        HIGH_FP(fr100), HIGH_FP(fr101), HIGH_FP(fr102), HIGH_FP(fr103),
116        HIGH_FP(fr104), HIGH_FP(fr105), HIGH_FP(fr106), HIGH_FP(fr107),
117        HIGH_FP(fr108), HIGH_FP(fr109), HIGH_FP(fr110), HIGH_FP(fr111),
118        HIGH_FP(fr112), HIGH_FP(fr113), HIGH_FP(fr114), HIGH_FP(fr115),
119        HIGH_FP(fr116), HIGH_FP(fr117), HIGH_FP(fr118), HIGH_FP(fr119),
120        HIGH_FP(fr120), HIGH_FP(fr121), HIGH_FP(fr122), HIGH_FP(fr123),
121        HIGH_FP(fr124), HIGH_FP(fr125), HIGH_FP(fr126), HIGH_FP(fr127),
122        /*
123         * Predicate registers (256-319)
124	 * These are not individually available. Predicates are
125	 * in the pr register.
126         */
127        -1, -1, -1, -1, -1, -1, -1, -1,         /* pr0-pr7 */
128        -1, -1, -1, -1, -1, -1, -1, -1,         /* pr8-pr15 */
129        -1, -1, -1, -1, -1, -1, -1, -1,         /* pr16-pr23 */
130        -1, -1, -1, -1, -1, -1, -1, -1,         /* pr24-pr31 */
131        -1, -1, -1, -1, -1, -1, -1, -1,         /* pr32-pr39 */
132        -1, -1, -1, -1, -1, -1, -1, -1,         /* pr40-pr47 */
133        -1, -1, -1, -1, -1, -1, -1, -1,         /* pr48-pr55 */
134        -1, -1, -1, -1, -1, -1, -1, -1,         /* pr56-pr63 */
135        /*
136         * Branch registers (320-327)
137         */
138        SPECIAL(rp),
139        PRESERVED(br1), PRESERVED(br2), PRESERVED(br3), PRESERVED(br4),
140        PRESERVED(br5),
141        SCRATCH(br6),   SCRATCH(br7),
142        /*
143         * Misc other registers (328-333)
144         */
145        -1, -1,
146        SPECIAL(pr),
147        SPECIAL(iip),
148        SPECIAL(psr),
149        SPECIAL(cfm),
150        /*
151         * Application registers (334-461)
152         */
153        -1, -1, -1, -1, -1, -1, -1, -1,         /* ar.k0-ar.k7 */
154        -1, -1, -1, -1, -1, -1, -1, -1,         /* ar8-ar15 (reserved) */
155        SPECIAL(rsc),                           /* ar.rsc */
156        SPECIAL(ndirty),			/* ar.bsp !!YEDI!! */
157        SPECIAL(bspstore),                      /* ar.bspstore */
158        SPECIAL(rnat),                          /* ar.rnat */
159        -1,                                     /* ar20 (reserved) */
160        -1,                                     /* ar.fcr */
161        -1, -1,                                 /* ar22-ar23 (reserved) */
162        -1,                                     /* ar.eflag */
163        SCRATCH(csd),                           /* ar.csd */
164        SCRATCH(ssd),                           /* ar.ssd */
165        -1,                                     /* ar.cflg */
166        -1,                                     /* ar.fsr */
167        -1,                                     /* ar.fir */
168        -1,                                     /* ar.fdr */
169        -1,                                     /* ar31 (reserved) */
170        SCRATCH(ccv),                           /* ar.ccv */
171        -1, -1, -1,                             /* ar33-ar35 (reserved) */
172        SPECIAL(unat),                          /* ar.unat */
173        -1, -1, -1,                             /* ar37-ar39 (reserved) */
174        SPECIAL(fpsr),                          /* ar.fpsr */
175        -1, -1, -1,                             /* ar41-ar43 (reserved) */
176        -1,                                     /* ar.itc */
177        -1, -1, -1,                             /* ar45-ar47 (reserved) */
178        -1, -1, -1, -1, -1, -1, -1, -1,         /* ar48-ar55 (ignored) */
179        -1, -1, -1, -1, -1, -1, -1, -1,         /* ar56-ar63 (ignored) */
180        SPECIAL(pfs),                           /* ar.pfs */
181        PRESERVED(lc),                          /* ar.lc */
182        -1,                                     /* ar.ec */
183        -1, -1, -1, -1, -1, -1, -1, -1,         /* ar67-ar74 (reserved) */
184        -1, -1, -1, -1, -1, -1, -1, -1,         /* ar75-ar82 (reserved) */
185        -1, -1, -1, -1, -1, -1, -1, -1,         /* ar83-ar90 (reserved) */
186        -1, -1, -1, -1, -1, -1, -1, -1,         /* ar91-ar98 (reserved) */
187        -1, -1, -1, -1, -1, -1, -1, -1,         /* ar99-ar106 (reserved) */
188        -1, -1, -1, -1, -1,                     /* ar107-ar111 (reserved) */
189        -1, -1, -1, -1, -1, -1, -1, -1,         /* ar112-ar119 (ignored) */
190        -1, -1, -1, -1, -1, -1, -1, -1,         /* ar120-ar127 (ignored) */
191};
192
193int
194main()
195{
196	int elem, nelems;
197
198	nelems = sizeof(regofs)/sizeof(regofs[0]);
199	printf("static int reg_offset[%d] = {", nelems);
200	for (elem = 0; elem < nelems; elem++) {
201		if ((elem & 7) == 0)
202			printf("\n  ");
203		printf("%4d", regofs[elem]);
204		if (elem < nelems - 1)
205			putchar(',');
206		if ((elem & 7) != 7)
207			putchar(' ');
208		else
209			printf("\t/* Regs %d-%d. */", elem - 7, elem);
210	}
211	printf("\n};");
212	return (0);
213}
214