blob: 670114de6ae86562e2031bc9a72c7c9cdea48a88 [file] [log] [blame]
sewardjc97096c2004-06-30 09:28:04 +00001
2/*---------------------------------------------------------------*/
sewardj752f9062010-05-03 21:38:49 +00003/*--- begin host_generic_regs.h ---*/
sewardjc97096c2004-06-30 09:28:04 +00004/*---------------------------------------------------------------*/
5
sewardjf8ed9d82004-11-12 17:40:23 +00006/*
sewardj752f9062010-05-03 21:38:49 +00007 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
sewardjf8ed9d82004-11-12 17:40:23 +00009
Elliott Hughesed398002017-06-21 14:41:24 -070010 Copyright (C) 2004-2017 OpenWorks LLP
sewardj752f9062010-05-03 21:38:49 +000011 info@open-works.net
sewardjf8ed9d82004-11-12 17:40:23 +000012
sewardj752f9062010-05-03 21:38:49 +000013 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
sewardjf8ed9d82004-11-12 17:40:23 +000017
sewardj752f9062010-05-03 21:38:49 +000018 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
sewardj7bd6ffe2005-08-03 16:07:36 +000026 02110-1301, USA.
27
sewardj752f9062010-05-03 21:38:49 +000028 The GNU General Public License is contained in the file COPYING.
sewardjf8ed9d82004-11-12 17:40:23 +000029
30 Neither the names of the U.S. Department of Energy nor the
31 University of California nor the names of its contributors may be
32 used to endorse or promote products derived from this software
33 without prior written permission.
sewardjf8ed9d82004-11-12 17:40:23 +000034*/
35
sewardjcef7d3e2009-07-02 12:21:59 +000036#ifndef __VEX_HOST_GENERIC_REGS_H
37#define __VEX_HOST_GENERIC_REGS_H
sewardjc97096c2004-06-30 09:28:04 +000038
sewardj887a11a2004-07-05 17:26:47 +000039#include "libvex_basictypes.h"
sewardj35421a32004-07-05 13:12:34 +000040
sewardjc97096c2004-06-30 09:28:04 +000041
sewardj8bc26ee2004-07-01 18:30:32 +000042/*---------------------------------------------------------*/
43/*--- Representing HOST REGISTERS ---*/
44/*---------------------------------------------------------*/
45
sewardjc97096c2004-06-30 09:28:04 +000046/* Host registers. Stuff to represent:
47
sewardja5b50222015-03-26 07:18:32 +000048 - The register index. This is a zero-based, sequential index that
49 facilitates indexing into arrays or virtual or real registers.
50 Virtual and real registers both have indices starting at zero.
51 Interpreting a real register index requires having the host's
52 RRegUniverse to hand.
53
54 - The register's hardware encoding. This applies only for real
55 registers and should be zero for virtual registers. This is the
56 number as used in a target architecture encoding.
57
sewardjc97096c2004-06-30 09:28:04 +000058 - The register class
sewardja5b50222015-03-26 07:18:32 +000059
sewardjc97096c2004-06-30 09:28:04 +000060 - Whether or not the register is a virtual reg.
61
sewardja5b50222015-03-26 07:18:32 +000062 Registers are sized so as to fit into 32 bits.
sewardjc97096c2004-06-30 09:28:04 +000063
sewardja5b50222015-03-26 07:18:32 +000064 Note that since the class field is never 1111b, no valid register
65 can have the value INVALID_HREG.
sewardjc97096c2004-06-30 09:28:04 +000066
sewardj6c299f32009-12-31 18:00:12 +000067 There are currently 6 register classes:
sewardjc97096c2004-06-30 09:28:04 +000068
sewardj6c299f32009-12-31 18:00:12 +000069 int32 int64 float32 float64 simd64 simd128
sewardjc97096c2004-06-30 09:28:04 +000070*/
71
sewardja5b50222015-03-26 07:18:32 +000072/* Registers are represented as 32 bit integers, with the following layout:
sewardjc97096c2004-06-30 09:28:04 +000073
sewardja5b50222015-03-26 07:18:32 +000074 31 30..27 26..20 19..0
75 isV:1 rc:4 enc:7 ix:20
76
77 where
78 UInt ix:20; // Zero based index
79 UInt enc:7; // Hardware encoding number
80 HRegClass rc:4; // the register's HRegClass
81 Bool isV:1; // is it a virtual register?
82
83 The obvious thing to do here would be to use bitfields. But gcc
84 seems to have problems constant folding calls to mkHReg() with all
85 4 parameters constant to a 32 bit number, when using bitfields.
86 Hence the use of the traditional shift-and-mask by-hand bitfields
87 instead.
88*/
89typedef struct { UInt u32; } HReg;
90
sewardj4a31b262004-12-01 02:24:44 +000091/* HRegClass describes host register classes which the instruction
92 selectors can speak about. We would not expect all of them to be
93 available on any specific host. For example on x86, the available
94 classes are: Int32, Flt64, Vec128 only.
sewardj1e6ad742004-12-02 16:16:11 +000095
sewardj6c299f32009-12-31 18:00:12 +000096 IMPORTANT NOTE: host_generic_reg_alloc2.c needs how much space is
97 needed to spill each class of register. It allocates the following
98 amount of space:
sewardj7fb65eb2007-03-25 04:14:58 +000099
sewardj6c299f32009-12-31 18:00:12 +0000100 HRcInt32 64 bits
sewardj7fb65eb2007-03-25 04:14:58 +0000101 HRcInt64 64 bits
sewardj6c299f32009-12-31 18:00:12 +0000102 HRcFlt32 64 bits
103 HRcFlt64 128 bits (on x86 these are spilled by fstpt/fldt and
104 so won't fit in a 64-bit slot)
sewardj7fb65eb2007-03-25 04:14:58 +0000105 HRcVec64 64 bits
106 HRcVec128 128 bits
107
108 If you add another regclass, you must remember to update
sewardja5b50222015-03-26 07:18:32 +0000109 host_generic_reg_alloc2.c accordingly.
110
111 When adding entries to enum HRegClass, do not use any value > 14 or < 1.
sewardj4a31b262004-12-01 02:24:44 +0000112*/
sewardjc97096c2004-06-30 09:28:04 +0000113typedef
sewardj4a31b262004-12-01 02:24:44 +0000114 enum {
115 HRcINVALID=1, /* NOT A VALID REGISTER CLASS */
sewardj6c299f32009-12-31 18:00:12 +0000116 HRcInt32=3, /* 32-bit int */
117 HRcInt64=4, /* 64-bit int */
118 HRcFlt32=5, /* 32-bit float */
sewardj4a31b262004-12-01 02:24:44 +0000119 HRcFlt64=6, /* 64-bit float */
120 HRcVec64=7, /* 64-bit SIMD */
sewardj3616a2e2012-05-27 16:18:13 +0000121 HRcVec128=8 /* 128-bit SIMD */
sewardjb3d4ce72004-07-02 07:09:23 +0000122 }
sewardjc97096c2004-06-30 09:28:04 +0000123 HRegClass;
124
sewardj35421a32004-07-05 13:12:34 +0000125extern void ppHRegClass ( HRegClass );
sewardjaf5a5222004-07-01 23:14:42 +0000126
sewardjc97096c2004-06-30 09:28:04 +0000127
128/* Print an HReg in a generic (non-target-specific) way. */
sewardj35421a32004-07-05 13:12:34 +0000129extern void ppHReg ( HReg );
sewardjc97096c2004-06-30 09:28:04 +0000130
sewardja5b50222015-03-26 07:18:32 +0000131/* Construct. The goal here is that compiler can fold this down to a
132 constant in the case where the four arguments are constants, which
133 is often the case. */
134static inline HReg mkHReg ( Bool virtual, HRegClass rc, UInt enc, UInt ix )
135{
136 vassert(ix <= 0xFFFFF);
137 vassert(enc <= 0x7F);
138 vassert(((UInt)rc) <= 0xF);
139 vassert(((UInt)virtual) <= 1);
140 if (virtual) vassert(enc == 0);
florian79efdc62013-02-11 00:47:35 +0000141 HReg r;
sewardja5b50222015-03-26 07:18:32 +0000142 r.u32 = ((((UInt)virtual) & 1) << 31) |
143 ((((UInt)rc) & 0xF) << 27) |
144 ((((UInt)enc) & 0x7F) << 20) |
145 ((((UInt)ix) & 0xFFFFF) << 0);
florian79efdc62013-02-11 00:47:35 +0000146 return r;
sewardj666fbac2004-10-14 10:42:15 +0000147}
sewardjc97096c2004-06-30 09:28:04 +0000148
sewardja5b50222015-03-26 07:18:32 +0000149static inline HRegClass hregClass ( HReg r )
150{
151 HRegClass rc = (HRegClass)((r.u32 >> 27) & 0xF);
sewardj3616a2e2012-05-27 16:18:13 +0000152 vassert(rc >= HRcInt32 && rc <= HRcVec128);
sewardja5b50222015-03-26 07:18:32 +0000153 return rc;
sewardj1f40a0a2004-07-21 12:28:07 +0000154}
155
sewardja5b50222015-03-26 07:18:32 +0000156static inline UInt hregIndex ( HReg r )
157{
158 return r.u32 & 0xFFFFF;
sewardj1f40a0a2004-07-21 12:28:07 +0000159}
160
sewardja5b50222015-03-26 07:18:32 +0000161static inline UInt hregEncoding ( HReg r )
162{
163 return (r.u32 >> 20) & 0x7F;
164}
165
166static inline Bool hregIsVirtual ( HReg r )
167{
168 return toBool((r.u32 >> 31) & 1);
sewardj1f40a0a2004-07-21 12:28:07 +0000169}
170
florian79efdc62013-02-11 00:47:35 +0000171static inline Bool sameHReg ( HReg r1, HReg r2 )
172{
sewardja5b50222015-03-26 07:18:32 +0000173 return toBool(r1.u32 == r2.u32);
florian79efdc62013-02-11 00:47:35 +0000174}
sewardj1f40a0a2004-07-21 12:28:07 +0000175
sewardja5b50222015-03-26 07:18:32 +0000176static const HReg INVALID_HREG = { .u32 = 0xFFFFFFFF };
sewardjc97096c2004-06-30 09:28:04 +0000177
florian79efdc62013-02-11 00:47:35 +0000178static inline Bool hregIsInvalid ( HReg r )
179{
180 return sameHReg(r, INVALID_HREG);
181}
sewardj8bc26ee2004-07-01 18:30:32 +0000182
sewardja5b50222015-03-26 07:18:32 +0000183
184/*---------------------------------------------------------*/
185/*--- Real register Universes. ---*/
186/*---------------------------------------------------------*/
187
188/* A "Real Register Universe" is a read-only structure that contains
189 all information about real registers on a given host. It serves
190 several purposes:
191
192 * defines the mapping from real register indices to the registers
193 themselves
194
195 * defines the size of the initial section of that mapping that is
196 available to the register allocator for use, so that the register
197 allocator can treat the registers under its control as a zero
198 based, contiguous array. This is important for its efficiency.
199
200 * gives meaning to RRegSets, which otherwise would merely be a
201 bunch of bits.
202
203 This is a big structure, but it's readonly, and we expect to
204 allocate only one instance for each run of Valgrind. It is sized
205 so as to be able to deal with up to 64 real registers. AFAICS none
206 of the back ends actually mention more than 64, despite the fact
207 that many of the host architectures have more than 64 registers
208 when all classes are taken into consideration.
209*/
210
211#define N_RREGUNIVERSE_REGS 64
212
213typedef
214 struct {
215 /* Total number of registers in this universe .. */
216 UInt size;
217 /* .. of which the first |allocable| are available to regalloc. */
218 UInt allocable;
219 /* The registers themselves. All must be real registers, and
220 all must have their index number (.s.ix) equal to the array
221 index here, since this is the only place where we map index
222 numbers to actual registers. */
223 HReg regs[N_RREGUNIVERSE_REGS];
224 }
225 RRegUniverse;
226
227/* Nominally initialise (zero out) an RRegUniverse. */
228void RRegUniverse__init ( /*OUT*/RRegUniverse* );
229
230/* Check an RRegUniverse is valid, and assert if not.*/
231void RRegUniverse__check_is_sane ( const RRegUniverse* );
232
233/* Print an RRegUniverse, for debugging. */
234void RRegUniverse__show ( const RRegUniverse* );
235
236
237/*---------------------------------------------------------*/
238/*--- Real register sets. ---*/
239/*---------------------------------------------------------*/
240
241/* Represents sets of real registers. |bitset| is interpreted in the
242 context of |univ|. That is, each bit index |i| in |bitset|
243 corresponds to the register |univ->regs[i]|. This relies
244 entirely on the fact that N_RREGUNIVERSE_REGS <= 64. */
245typedef
246 struct {
247 ULong bitset;
248 RRegUniverse* univ;
249 }
250 RRegSet;
251
252
sewardj8bc26ee2004-07-01 18:30:32 +0000253/*---------------------------------------------------------*/
254/*--- Recording register usage (for reg-alloc) ---*/
255/*---------------------------------------------------------*/
256
257typedef
258 enum { HRmRead, HRmWrite, HRmModify }
259 HRegMode;
260
261
sewardja5b50222015-03-26 07:18:32 +0000262/* This isn't entirely general, and is specialised towards being fast,
263 for the reg-alloc. It represents real registers using a bitmask
264 and can also represent up to four virtual registers, in an
265 unordered array. This is based on the observation that no
266 instruction that we generate can mention more than four registers
267 at once.
sewardj8bc26ee2004-07-01 18:30:32 +0000268*/
sewardja5b50222015-03-26 07:18:32 +0000269#define N_HREGUSAGE_VREGS 5
sewardj8bc26ee2004-07-01 18:30:32 +0000270
271typedef
272 struct {
sewardja5b50222015-03-26 07:18:32 +0000273 /* The real registers. The associated universe is not stored
274 here -- callers will have to pass it around separately, as
275 needed. */
276 ULong rRead; /* real regs that are read */
277 ULong rWritten; /* real regs that are written */
278 /* The virtual registers. */
279 HReg vRegs[N_HREGUSAGE_VREGS];
280 HRegMode vMode[N_HREGUSAGE_VREGS];
281 UInt n_vRegs;
sewardj8bc26ee2004-07-01 18:30:32 +0000282 }
283 HRegUsage;
284
sewardja5b50222015-03-26 07:18:32 +0000285extern void ppHRegUsage ( const RRegUniverse*, HRegUsage* );
sewardj8bc26ee2004-07-01 18:30:32 +0000286
sewardja5b50222015-03-26 07:18:32 +0000287static inline void initHRegUsage ( HRegUsage* tab )
288{
289 tab->rRead = 0;
290 tab->rWritten = 0;
291 tab->n_vRegs = 0;
sewardj666fbac2004-10-14 10:42:15 +0000292}
sewardj8bc26ee2004-07-01 18:30:32 +0000293
294/* Add a register to a usage table. Combine incoming read uses with
295 existing write uses into a modify use, and vice versa. Do not
296 create duplicate entries -- each reg should only be mentioned once.
297*/
sewardj53f85a92004-07-02 13:45:17 +0000298extern void addHRegUse ( HRegUsage*, HRegMode, HReg );
sewardj8bc26ee2004-07-01 18:30:32 +0000299
sewardja5b50222015-03-26 07:18:32 +0000300extern Bool HRegUsage__contains ( const HRegUsage*, HReg );
sewardj8bc26ee2004-07-01 18:30:32 +0000301
302
303/*---------------------------------------------------------*/
304/*--- Indicating register remappings (for reg-alloc) ---*/
305/*---------------------------------------------------------*/
306
sewardj0ec33252004-07-03 13:30:00 +0000307/* Note that such maps can only map virtual regs to real regs.
308 addToHRegRenap will barf if given a pair not of that form. As a
309 result, no valid HRegRemap will bind a real reg to anything, and so
310 if lookupHRegMap is given a real reg, it returns it unchanged.
311 This is precisely the behaviour that the register allocator needs
312 to impose its decisions on the instructions it processes. */
313
sewardjcdc376d2012-04-23 11:21:12 +0000314#define N_HREG_REMAP 6
sewardj8bc26ee2004-07-01 18:30:32 +0000315
316typedef
317 struct {
318 HReg orig [N_HREG_REMAP];
319 HReg replacement[N_HREG_REMAP];
320 Int n_used;
321 }
322 HRegRemap;
323
sewardj35421a32004-07-05 13:12:34 +0000324extern void ppHRegRemap ( HRegRemap* );
sewardj8bc26ee2004-07-01 18:30:32 +0000325extern void addToHRegRemap ( HRegRemap*, HReg, HReg );
326extern HReg lookupHRegRemap ( HRegRemap*, HReg );
327
sewardja5b50222015-03-26 07:18:32 +0000328static inline void initHRegRemap ( HRegRemap* map )
329{
330 map->n_used = 0;
331}
332
sewardjc97096c2004-06-30 09:28:04 +0000333
sewardjaf5a5222004-07-01 23:14:42 +0000334/*---------------------------------------------------------*/
335/*--- Abstract instructions ---*/
336/*---------------------------------------------------------*/
337
338/* A type is needed to refer to pointers to instructions of any
339 target. Defining it like this means that HInstr* can stand in for
340 X86Instr*, ArmInstr*, etc. */
341
342typedef void HInstr;
343
344
sewardj194d54a2004-07-03 19:08:18 +0000345/* An expandable array of HInstr*'s. Handy for insn selection and
346 register allocation. n_vregs indicates the number of virtual
347 registers mentioned in the code, something that reg-alloc needs to
348 know. These are required to be numbered 0 .. n_vregs-1.
349*/
sewardj2cd80dc2004-07-02 15:20:40 +0000350typedef
351 struct {
352 HInstr** arr;
353 Int arr_size;
354 Int arr_used;
sewardj194d54a2004-07-03 19:08:18 +0000355 Int n_vregs;
sewardj2cd80dc2004-07-02 15:20:40 +0000356 }
357 HInstrArray;
358
359extern HInstrArray* newHInstrArray ( void );
sewardja5b50222015-03-26 07:18:32 +0000360
361/* Never call this directly. It's the slow and incomplete path for
362 addHInstr. */
363__attribute__((noinline))
364extern void addHInstr_SLOW ( HInstrArray*, HInstr* );
365
366static inline void addHInstr ( HInstrArray* ha, HInstr* instr )
367{
368 if (LIKELY(ha->arr_used < ha->arr_size)) {
369 ha->arr[ha->arr_used] = instr;
370 ha->arr_used++;
371 } else {
372 addHInstr_SLOW(ha, instr);
373 }
374}
sewardj2cd80dc2004-07-02 15:20:40 +0000375
sewardjaf5a5222004-07-01 23:14:42 +0000376
sewardj2cd80dc2004-07-02 15:20:40 +0000377/*---------------------------------------------------------*/
sewardjcfe046e2013-01-17 14:23:53 +0000378/*--- C-Call return-location descriptions ---*/
379/*---------------------------------------------------------*/
380
381/* This is common to all back ends. It describes where the return
382 value from a C call is located. This is important in the case that
383 the call is conditional, since the return locations will need to be
384 set to 0x555..555 in the case that the call does not happen. */
385
386typedef
387 enum {
sewardj74142b82013-08-08 10:28:59 +0000388 RLPri_INVALID, /* INVALID */
389 RLPri_None, /* no return value (a.k.a C "void") */
390 RLPri_Int, /* in the primary int return reg */
391 RLPri_2Int, /* in both primary and secondary int ret regs */
392 RLPri_V128SpRel, /* 128-bit value, on the stack */
393 RLPri_V256SpRel /* 256-bit value, on the stack */
394 }
395 RetLocPrimary;
396
397typedef
398 struct {
399 /* Primary description */
400 RetLocPrimary pri;
401 /* For .pri == RLPri_V128SpRel or RLPri_V256SpRel only, gives
402 the offset of the lowest addressed byte of the value,
403 relative to the stack pointer. For all other .how values,
404 has no meaning and should be zero. */
405 Int spOff;
sewardjcfe046e2013-01-17 14:23:53 +0000406 }
407 RetLoc;
408
409extern void ppRetLoc ( RetLoc rloc );
410
sewardj74142b82013-08-08 10:28:59 +0000411static inline RetLoc mk_RetLoc_simple ( RetLocPrimary pri ) {
412 vassert(pri >= RLPri_INVALID && pri <= RLPri_2Int);
413 return (RetLoc){pri, 0};
414}
415
416static inline RetLoc mk_RetLoc_spRel ( RetLocPrimary pri, Int off ) {
417 vassert(pri >= RLPri_V128SpRel && pri <= RLPri_V256SpRel);
418 return (RetLoc){pri, off};
419}
420
421static inline Bool is_sane_RetLoc ( RetLoc rloc ) {
422 switch (rloc.pri) {
423 case RLPri_None: case RLPri_Int: case RLPri_2Int:
424 return rloc.spOff == 0;
425 case RLPri_V128SpRel: case RLPri_V256SpRel:
426 return True;
427 default:
428 return False;
429 }
430}
431
432static inline RetLoc mk_RetLoc_INVALID ( void ) {
433 return (RetLoc){RLPri_INVALID, 0};
434}
435
436static inline Bool is_RetLoc_INVALID ( RetLoc rl ) {
437 return rl.pri == RLPri_INVALID && rl.spOff == 0;
438}
439
sewardjcfe046e2013-01-17 14:23:53 +0000440
441/*---------------------------------------------------------*/
sewardj2cd80dc2004-07-02 15:20:40 +0000442/*--- Reg alloc: TODO: move somewhere else ---*/
443/*---------------------------------------------------------*/
444
445extern
446HInstrArray* doRegisterAllocation (
447
448 /* Incoming virtual-registerised code. */
449 HInstrArray* instrs_in,
sewardj2cd80dc2004-07-02 15:20:40 +0000450
sewardja5b50222015-03-26 07:18:32 +0000451 /* The real-register universe to use. This contains facts about
452 real registers, one of which is the set of registers available
453 for allocation. */
454 const RRegUniverse* univ,
sewardj2cd80dc2004-07-02 15:20:40 +0000455
456 /* Return True iff the given insn is a reg-reg move, in which
457 case also return the src and dst regs. */
floriand8c64e02014-10-08 08:54:44 +0000458 Bool (*isMove) (const HInstr*, HReg*, HReg*),
sewardj2cd80dc2004-07-02 15:20:40 +0000459
460 /* Get info about register usage in this insn. */
floriand8c64e02014-10-08 08:54:44 +0000461 void (*getRegUsage) (HRegUsage*, const HInstr*, Bool),
sewardj2cd80dc2004-07-02 15:20:40 +0000462
463 /* Apply a reg-reg mapping to an insn. */
cerion92b64362005-12-13 12:02:26 +0000464 void (*mapRegs) (HRegRemap*, HInstr*, Bool),
sewardj2cd80dc2004-07-02 15:20:40 +0000465
sewardj6c299f32009-12-31 18:00:12 +0000466 /* Return insn(s) to spill/restore a real reg to a spill slot
sewardjfb7373a2007-08-25 21:29:03 +0000467 offset. And optionally a function to do direct reloads. */
sewardj6c299f32009-12-31 18:00:12 +0000468 void (*genSpill) ( HInstr**, HInstr**, HReg, Int, Bool ),
469 void (*genReload) ( HInstr**, HInstr**, HReg, Int, Bool ),
sewardjfb7373a2007-08-25 21:29:03 +0000470 HInstr* (*directReload) ( HInstr*, HReg, Short ),
sewardj81ec4182004-10-25 23:15:52 +0000471 Int guest_sizeB,
sewardj2b515872004-07-05 20:50:45 +0000472
473 /* For debug printing only. */
floriand8c64e02014-10-08 08:54:44 +0000474 void (*ppInstr) ( const HInstr*, Bool ),
cerion92b64362005-12-13 12:02:26 +0000475 void (*ppReg) ( HReg ),
476
477 /* 32/64bit mode */
478 Bool mode64
sewardj2cd80dc2004-07-02 15:20:40 +0000479);
480
481
sewardjcef7d3e2009-07-02 12:21:59 +0000482#endif /* ndef __VEX_HOST_GENERIC_REGS_H */
sewardj2cd80dc2004-07-02 15:20:40 +0000483
sewardj8bc26ee2004-07-01 18:30:32 +0000484/*---------------------------------------------------------------*/
sewardjcef7d3e2009-07-02 12:21:59 +0000485/*--- host_generic_regs.h ---*/
sewardj8bc26ee2004-07-01 18:30:32 +0000486/*---------------------------------------------------------------*/