1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
| /*
| * Copyright (C) 2014 The Android Open Source Project
| *
| * Licensed under the Apache License, Version 2.0 (the "License");
| * you may not use this file except in compliance with the License.
| * You may obtain a copy of the License at
| *
| * http://www.apache.org/licenses/LICENSE-2.0
| *
| * Unless required by applicable law or agreed to in writing, software
| * distributed under the License is distributed on an "AS IS" BASIS,
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
| * See the License for the specific language governing permissions and
| * limitations under the License.
| */
|
| #ifndef ART_COMPILER_UTILS_MIPS64_CONSTANTS_MIPS64_H_
| #define ART_COMPILER_UTILS_MIPS64_CONSTANTS_MIPS64_H_
|
| #include <iosfwd>
|
| #include <android-base/logging.h>
|
| #include "arch/mips64/registers_mips64.h"
| #include "base/globals.h"
| #include "base/macros.h"
|
| namespace art {
| namespace mips64 {
|
| // Constants used for the decoding or encoding of the individual fields of instructions.
| enum InstructionFields {
| kOpcodeShift = 26,
| kOpcodeBits = 6,
| kRsShift = 21,
| kRsBits = 5,
| kRtShift = 16,
| kRtBits = 5,
| kRdShift = 11,
| kRdBits = 5,
| kShamtShift = 6,
| kShamtBits = 5,
| kFunctShift = 0,
| kFunctBits = 6,
|
| kFmtShift = 21,
| kFmtBits = 5,
| kFtShift = 16,
| kFtBits = 5,
| kFsShift = 11,
| kFsBits = 5,
| kFdShift = 6,
| kFdBits = 5,
|
| kMsaOperationShift = 23,
| kMsaELMOperationShift = 22,
| kMsa2ROperationShift = 18,
| kMsa2RFOperationShift = 17,
| kDfShift = 21,
| kDfMShift = 16,
| kDf2RShift = 16,
| kDfNShift = 16,
| kWtShift = 16,
| kWtBits = 5,
| kWsShift = 11,
| kWsBits = 5,
| kWdShift = 6,
| kWdBits = 5,
| kS10Shift = 16,
| kI10Shift = 11,
| kS10MinorShift = 2,
|
| kBranchOffsetMask = 0x0000ffff,
| kJumpOffsetMask = 0x03ffffff,
| kMsaMajorOpcode = 0x1e,
| kMsaDfMByteMask = 0x70,
| kMsaDfMHalfwordMask = 0x60,
| kMsaDfMWordMask = 0x40,
| kMsaDfMDoublewordMask = 0x00,
| kMsaDfNByteMask = 0x00,
| kMsaDfNHalfwordMask = 0x20,
| kMsaDfNWordMask = 0x30,
| kMsaDfNDoublewordMask = 0x38,
| kMsaS10Mask = 0x3ff,
| };
|
| enum ScaleFactor {
| TIMES_1 = 0,
| TIMES_2 = 1,
| TIMES_4 = 2,
| TIMES_8 = 3
| };
|
| class Instr {
| public:
| static const uint32_t kBreakPointInstruction = 0x0000000D;
|
| bool IsBreakPoint() {
| return ((*reinterpret_cast<const uint32_t*>(this)) & 0xFC00003F) == kBreakPointInstruction;
| }
|
| // Instructions are read out of a code stream. The only way to get a
| // reference to an instruction is to convert a pointer. There is no way
| // to allocate or create instances of class Instr.
| // Use the At(pc) function to create references to Instr.
| static Instr* At(uintptr_t pc) { return reinterpret_cast<Instr*>(pc); }
|
| private:
| DISALLOW_IMPLICIT_CONSTRUCTORS(Instr);
| };
|
| } // namespace mips64
| } // namespace art
|
| #endif // ART_COMPILER_UTILS_MIPS64_CONSTANTS_MIPS64_H_
|
|