1 : // Copyright 2012 Google Inc. All Rights Reserved.
2 : //
3 : // Licensed under the Apache License, Version 2.0 (the "License");
4 : // you may not use this file except in compliance with the License.
5 : // You may obtain a copy of the License at
6 : //
7 : // http://www.apache.org/licenses/LICENSE-2.0
8 : //
9 : // Unless required by applicable law or agreed to in writing, software
10 : // distributed under the License is distributed on an "AS IS" BASIS,
11 : // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : // See the License for the specific language governing permissions and
13 : // limitations under the License.
14 : //
15 : // This file declares utility constants for dealing with registers. Clients of
16 : // assembler and BB assembler shouldn't need to look beyond here. If you are
17 : // implementing a transform or analysis that cares about the details of
18 : // registers then you can find more details in register_internal.h.
19 :
20 : #ifndef SYZYGY_ASSM_REGISTER_H_
21 : #define SYZYGY_ASSM_REGISTER_H_
22 :
23 : #include "syzygy/assm/register_internal.h"
24 :
25 m : namespace assm {
26 :
27 : // Some utility constants.
28 m : static const size_t kRegister8Count = kRegister8Max - kRegister8Min;
29 m : static const size_t kRegister16Count = kRegister16Max - kRegister16Min;
30 m : static const size_t kRegister32Count = kRegister32Max - kRegister32Min;
31 m : static const size_t kRegisterCount = kRegisterMax - kRegisterMin;
32 :
33 : // An array of all registers, sorted by their RegisterId.
34 m : extern const Register kRegisters[kRegisterCount];
35 :
36 : // Slices of kRegisters, by register size. These actually refer to the same
37 : // underlying data.
38 m : extern const Register8 (&kRegisters8)[kRegister8Count];
39 m : extern const Register16 (&kRegisters16)[kRegister16Count];
40 m : extern const Register32 (&kRegisters32)[kRegister32Count];
41 :
42 : // Convenience constants for the 8-bit x86 registers.
43 m : extern const Register8& al;
44 m : extern const Register8& cl;
45 m : extern const Register8& dl;
46 m : extern const Register8& bl;
47 m : extern const Register8& ah;
48 m : extern const Register8& ch;
49 m : extern const Register8& dh;
50 m : extern const Register8& bh;
51 :
52 : // Convenience constants for the 16-bit x86 registers.
53 m : extern const Register16& ax;
54 m : extern const Register16& cx;
55 m : extern const Register16& dx;
56 m : extern const Register16& bx;
57 m : extern const Register16& sp;
58 m : extern const Register16& bp;
59 m : extern const Register16& si;
60 m : extern const Register16& di;
61 :
62 : // Convenience constants for the 32-bit x86 registers.
63 m : extern const Register32& eax;
64 m : extern const Register32& ecx;
65 m : extern const Register32& edx;
66 m : extern const Register32& ebx;
67 m : extern const Register32& esp;
68 m : extern const Register32& ebp;
69 m : extern const Register32& esi;
70 m : extern const Register32& edi;
71 :
72 : // Utility functions for casting between registers at differing precisions. This
73 : // is only safe to call if the object is of the requested derived type.
74 : // @returns true if the conversion is possible, false otherwise.
75 m : const Register8& CastAsRegister8(const Register& reg);
76 m : const Register16& CastAsRegister16(const Register& reg);
77 m : const Register32& CastAsRegister32(const Register& reg);
78 :
79 m : } // namespace assm
80 :
81 : #endif // SYZYGY_ASSM_REGISTER_H_
|