Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: src/mips64/assembler-mips64.h

Issue 1365073002: Revert of Remove register index/code indirection (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/mips/macro-assembler-mips.cc ('k') | src/mips64/assembler-mips64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 29 matching lines...) Expand all
40 40
41 #include <set> 41 #include <set>
42 42
43 #include "src/assembler.h" 43 #include "src/assembler.h"
44 #include "src/compiler.h" 44 #include "src/compiler.h"
45 #include "src/mips64/constants-mips64.h" 45 #include "src/mips64/constants-mips64.h"
46 46
47 namespace v8 { 47 namespace v8 {
48 namespace internal { 48 namespace internal {
49 49
50 // clang-format off
51 #define GENERAL_REGISTERS(V) \
52 V(zero_reg) V(at) V(v0) V(v1) V(a0) V(a1) V(a2) V(a3) \
53 V(a4) V(a5) V(a6) V(a7) V(t0) V(t1) V(t2) V(t3) \
54 V(s0) V(s1) V(s2) V(s3) V(s4) V(s5) V(s6) V(s7) V(t8) V(t9) \
55 V(k0) V(k1) V(gp) V(sp) V(fp) V(ra)
56
57 #define ALLOCATABLE_GENERAL_REGISTERS(V) \
58 V(v0) V(v1) V(a0) V(a1) V(a2) V(a3) \
59 V(a4) V(a5) V(a6) V(a7) V(t0) V(t1) V(t2) V(s7)
60
61 #define DOUBLE_REGISTERS(V) \
62 V(f0) V(f1) V(f2) V(f3) V(f4) V(f5) V(f6) V(f7) \
63 V(f8) V(f9) V(f10) V(f11) V(f12) V(f13) V(f14) V(f15) \
64 V(f16) V(f17) V(f18) V(f19) V(f20) V(f21) V(f22) V(f23) \
65 V(f24) V(f25) V(f26) V(f27) V(f28) V(f29) V(f30) V(f31)
66
67 #define ALLOCATABLE_DOUBLE_REGISTERS(V) \
68 V(f0) V(f2) V(f4) V(f6) V(f8) V(f10) V(f12) V(f14) \
69 V(f16) V(f18) V(f20) V(f22) V(f24) V(f26)
70 // clang-format on
71
72 // CPU Registers. 50 // CPU Registers.
73 // 51 //
74 // 1) We would prefer to use an enum, but enum values are assignment- 52 // 1) We would prefer to use an enum, but enum values are assignment-
75 // compatible with int, which has caused code-generation bugs. 53 // compatible with int, which has caused code-generation bugs.
76 // 54 //
77 // 2) We would prefer to use a class instead of a struct but we don't like 55 // 2) We would prefer to use a class instead of a struct but we don't like
78 // the register initialization to depend on the particular initialization 56 // the register initialization to depend on the particular initialization
79 // order (which appears to be different on OS X, Linux, and Windows for the 57 // order (which appears to be different on OS X, Linux, and Windows for the
80 // installed versions of C++ we tried). Using a struct permits C-style 58 // installed versions of C++ we tried). Using a struct permits C-style
81 // "initialization". Also, the Register objects cannot be const as this 59 // "initialization". Also, the Register objects cannot be const as this
82 // forces initialization stubs in MSVC, making us dependent on initialization 60 // forces initialization stubs in MSVC, making us dependent on initialization
83 // order. 61 // order.
84 // 62 //
85 // 3) By not using an enum, we are possibly preventing the compiler from 63 // 3) By not using an enum, we are possibly preventing the compiler from
86 // doing certain constant folds, which may significantly reduce the 64 // doing certain constant folds, which may significantly reduce the
87 // code generated for some assembly instructions (because they boil down 65 // code generated for some assembly instructions (because they boil down
88 // to a few constants). If this is a problem, we could change the code 66 // to a few constants). If this is a problem, we could change the code
89 // such that we use an enum in optimized mode, and the struct in debug 67 // such that we use an enum in optimized mode, and the struct in debug
90 // mode. This way we get the compile-time error checking in debug mode 68 // mode. This way we get the compile-time error checking in debug mode
91 // and best performance in optimized code. 69 // and best performance in optimized code.
92 70
93 71
94 // ----------------------------------------------------------------------------- 72 // -----------------------------------------------------------------------------
95 // Implementation of Register and FPURegister. 73 // Implementation of Register and FPURegister.
96 74
75 // Core register.
97 struct Register { 76 struct Register {
77 static const int kNumRegisters = v8::internal::kNumRegisters;
78 static const int kMaxNumAllocatableRegisters = 14; // v0 through t2 and cp.
79 static const int kSizeInBytes = 8;
98 static const int kCpRegister = 23; // cp (s7) is the 23rd register. 80 static const int kCpRegister = 23; // cp (s7) is the 23rd register.
99 81
100 enum Code { 82 inline static int NumAllocatableRegisters();
101 #define REGISTER_CODE(R) kCode_##R,
102 GENERAL_REGISTERS(REGISTER_CODE)
103 #undef REGISTER_CODE
104 kAfterLast,
105 kCode_no_reg = -1
106 };
107 83
108 static const int kNumRegisters = Code::kAfterLast; 84 static int ToAllocationIndex(Register reg) {
85 DCHECK((reg.code() - 2) < (kMaxNumAllocatableRegisters - 1) ||
86 reg.is(from_code(kCpRegister)));
87 return reg.is(from_code(kCpRegister)) ?
88 kMaxNumAllocatableRegisters - 1 : // Return last index for 'cp'.
89 reg.code() - 2; // zero_reg and 'at' are skipped.
90 }
91
92 static Register FromAllocationIndex(int index) {
93 DCHECK(index >= 0 && index < kMaxNumAllocatableRegisters);
94 return index == kMaxNumAllocatableRegisters - 1 ?
95 from_code(kCpRegister) : // Last index is always the 'cp' register.
96 from_code(index + 2); // zero_reg and 'at' are skipped.
97 }
98
99 static const char* AllocationIndexToString(int index) {
100 DCHECK(index >= 0 && index < kMaxNumAllocatableRegisters);
101 const char* const names[] = {
102 "v0",
103 "v1",
104 "a0",
105 "a1",
106 "a2",
107 "a3",
108 "a4",
109 "a5",
110 "a6",
111 "a7",
112 "t0",
113 "t1",
114 "t2",
115 "s7",
116 };
117 return names[index];
118 }
109 119
110 static Register from_code(int code) { 120 static Register from_code(int code) {
111 DCHECK(code >= 0);
112 DCHECK(code < kNumRegisters);
113 Register r = { code }; 121 Register r = { code };
114 return r; 122 return r;
115 } 123 }
116 124
117 const char* ToString(); 125 bool is_valid() const { return 0 <= code_ && code_ < kNumRegisters; }
118 bool IsAllocatable() const; 126 bool is(Register reg) const { return code_ == reg.code_; }
119 bool is_valid() const { return 0 <= reg_code && reg_code < kNumRegisters; }
120 bool is(Register reg) const { return reg_code == reg.reg_code; }
121 int code() const { 127 int code() const {
122 DCHECK(is_valid()); 128 DCHECK(is_valid());
123 return reg_code; 129 return code_;
124 } 130 }
125 int bit() const { 131 int bit() const {
126 DCHECK(is_valid()); 132 DCHECK(is_valid());
127 return 1 << reg_code; 133 return 1 << code_;
128 } 134 }
129 135
130 // Unfortunately we can't make this private in a struct. 136 // Unfortunately we can't make this private in a struct.
131 int reg_code; 137 int code_;
132 }; 138 };
133 139
134 // s7: context register 140 #define REGISTER(N, C) \
135 // s3: lithium scratch 141 const int kRegister_ ## N ## _Code = C; \
136 // s4: lithium scratch2 142 const Register N = { C }
137 #define DECLARE_REGISTER(R) const Register R = {Register::kCode_##R}; 143
138 GENERAL_REGISTERS(DECLARE_REGISTER) 144 REGISTER(no_reg, -1);
139 #undef DECLARE_REGISTER 145 // Always zero.
140 const Register no_reg = {Register::kCode_no_reg}; 146 REGISTER(zero_reg, 0);
147 // at: Reserved for synthetic instructions.
148 REGISTER(at, 1);
149 // v0, v1: Used when returning multiple values from subroutines.
150 REGISTER(v0, 2);
151 REGISTER(v1, 3);
152 // a0 - a4: Used to pass non-FP parameters.
153 REGISTER(a0, 4);
154 REGISTER(a1, 5);
155 REGISTER(a2, 6);
156 REGISTER(a3, 7);
157 // a4 - a7 t0 - t3: Can be used without reservation, act as temporary registers
158 // and are allowed to be destroyed by subroutines.
159 REGISTER(a4, 8);
160 REGISTER(a5, 9);
161 REGISTER(a6, 10);
162 REGISTER(a7, 11);
163 REGISTER(t0, 12);
164 REGISTER(t1, 13);
165 REGISTER(t2, 14);
166 REGISTER(t3, 15);
167 // s0 - s7: Subroutine register variables. Subroutines that write to these
168 // registers must restore their values before exiting so that the caller can
169 // expect the values to be preserved.
170 REGISTER(s0, 16);
171 REGISTER(s1, 17);
172 REGISTER(s2, 18);
173 REGISTER(s3, 19);
174 REGISTER(s4, 20);
175 REGISTER(s5, 21);
176 REGISTER(s6, 22);
177 REGISTER(s7, 23);
178 REGISTER(t8, 24);
179 REGISTER(t9, 25);
180 // k0, k1: Reserved for system calls and interrupt handlers.
181 REGISTER(k0, 26);
182 REGISTER(k1, 27);
183 // gp: Reserved.
184 REGISTER(gp, 28);
185 // sp: Stack pointer.
186 REGISTER(sp, 29);
187 // fp: Frame pointer.
188 REGISTER(fp, 30);
189 // ra: Return address pointer.
190 REGISTER(ra, 31);
191
192 #undef REGISTER
141 193
142 194
143 int ToNumber(Register reg); 195 int ToNumber(Register reg);
144 196
145 Register ToRegister(int num); 197 Register ToRegister(int num);
146 198
147 // Coprocessor register. 199 // Coprocessor register.
148 struct DoubleRegister { 200 struct FPURegister {
149 enum Code { 201 static const int kMaxNumRegisters = v8::internal::kNumFPURegisters;
150 #define REGISTER_CODE(R) kCode_##R,
151 DOUBLE_REGISTERS(REGISTER_CODE)
152 #undef REGISTER_CODE
153 kAfterLast,
154 kCode_no_reg = -1
155 };
156
157 static const int kMaxNumRegisters = Code::kAfterLast;
158
159 inline static int NumRegisters();
160 202
161 // TODO(plind): Warning, inconsistent numbering here. kNumFPURegisters refers 203 // TODO(plind): Warning, inconsistent numbering here. kNumFPURegisters refers
162 // to number of 32-bit FPU regs, but kNumAllocatableRegisters refers to 204 // to number of 32-bit FPU regs, but kNumAllocatableRegisters refers to
163 // number of Double regs (64-bit regs, or FPU-reg-pairs). 205 // number of Double regs (64-bit regs, or FPU-reg-pairs).
164 206
165 const char* ToString(); 207 // A few double registers are reserved: one as a scratch register and one to
166 bool IsAllocatable() const; 208 // hold 0.0.
167 bool is_valid() const { return 0 <= reg_code && reg_code < kMaxNumRegisters; } 209 // f28: 0.0
168 bool is(DoubleRegister reg) const { return reg_code == reg.reg_code; } 210 // f30: scratch register.
169 DoubleRegister low() const { 211 static const int kNumReservedRegisters = 2;
212 static const int kMaxNumAllocatableRegisters = kMaxNumRegisters / 2 -
213 kNumReservedRegisters;
214
215 inline static int NumRegisters();
216 inline static int NumAllocatableRegisters();
217
218 // TODO(turbofan): Proper support for float32.
219 inline static int NumAllocatableAliasedRegisters();
220
221 inline static int ToAllocationIndex(FPURegister reg);
222 static const char* AllocationIndexToString(int index);
223
224 static FPURegister FromAllocationIndex(int index) {
225 DCHECK(index >= 0 && index < kMaxNumAllocatableRegisters);
226 return from_code(index * 2);
227 }
228
229 static FPURegister from_code(int code) {
230 FPURegister r = { code };
231 return r;
232 }
233
234 bool is_valid() const { return 0 <= code_ && code_ < kMaxNumRegisters ; }
235 bool is(FPURegister creg) const { return code_ == creg.code_; }
236 FPURegister low() const {
170 // TODO(plind): Create DCHECK for FR=0 mode. This usage suspect for FR=1. 237 // TODO(plind): Create DCHECK for FR=0 mode. This usage suspect for FR=1.
171 // Find low reg of a Double-reg pair, which is the reg itself. 238 // Find low reg of a Double-reg pair, which is the reg itself.
172 DCHECK(reg_code % 2 == 0); // Specified Double reg must be even. 239 DCHECK(code_ % 2 == 0); // Specified Double reg must be even.
173 DoubleRegister reg; 240 FPURegister reg;
174 reg.reg_code = reg_code; 241 reg.code_ = code_;
175 DCHECK(reg.is_valid()); 242 DCHECK(reg.is_valid());
176 return reg; 243 return reg;
177 } 244 }
178 DoubleRegister high() const { 245 FPURegister high() const {
179 // TODO(plind): Create DCHECK for FR=0 mode. This usage illegal in FR=1. 246 // TODO(plind): Create DCHECK for FR=0 mode. This usage illegal in FR=1.
180 // Find high reg of a Doubel-reg pair, which is reg + 1. 247 // Find high reg of a Doubel-reg pair, which is reg + 1.
181 DCHECK(reg_code % 2 == 0); // Specified Double reg must be even. 248 DCHECK(code_ % 2 == 0); // Specified Double reg must be even.
182 DoubleRegister reg; 249 FPURegister reg;
183 reg.reg_code = reg_code + 1; 250 reg.code_ = code_ + 1;
184 DCHECK(reg.is_valid()); 251 DCHECK(reg.is_valid());
185 return reg; 252 return reg;
186 } 253 }
187 254
188 int code() const { 255 int code() const {
189 DCHECK(is_valid()); 256 DCHECK(is_valid());
190 return reg_code; 257 return code_;
191 } 258 }
192 int bit() const { 259 int bit() const {
193 DCHECK(is_valid()); 260 DCHECK(is_valid());
194 return 1 << reg_code; 261 return 1 << code_;
195 }
196
197 static DoubleRegister from_code(int code) {
198 DoubleRegister r = {code};
199 return r;
200 } 262 }
201 void setcode(int f) { 263 void setcode(int f) {
202 reg_code = f; 264 code_ = f;
203 DCHECK(is_valid()); 265 DCHECK(is_valid());
204 } 266 }
205 // Unfortunately we can't make this private in a struct. 267 // Unfortunately we can't make this private in a struct.
206 int reg_code; 268 int code_;
207 }; 269 };
208 270
209 // A few double registers are reserved: one as a scratch register and one to
210 // hold 0.0.
211 // f28: 0.0
212 // f30: scratch register.
213
214 // V8 now supports the O32 ABI, and the FPU Registers are organized as 32 271 // V8 now supports the O32 ABI, and the FPU Registers are organized as 32
215 // 32-bit registers, f0 through f31. When used as 'double' they are used 272 // 32-bit registers, f0 through f31. When used as 'double' they are used
216 // in pairs, starting with the even numbered register. So a double operation 273 // in pairs, starting with the even numbered register. So a double operation
217 // on f0 really uses f0 and f1. 274 // on f0 really uses f0 and f1.
218 // (Modern mips hardware also supports 32 64-bit registers, via setting 275 // (Modern mips hardware also supports 32 64-bit registers, via setting
219 // (privileged) Status Register FR bit to 1. This is used by the N32 ABI, 276 // (privileged) Status Register FR bit to 1. This is used by the N32 ABI,
220 // but it is not in common use. Someday we will want to support this in v8.) 277 // but it is not in common use. Someday we will want to support this in v8.)
221 278
222 // For O32 ABI, Floats and Doubles refer to same set of 32 32-bit registers. 279 // For O32 ABI, Floats and Doubles refer to same set of 32 32-bit registers.
223 typedef DoubleRegister FPURegister; 280 typedef FPURegister DoubleRegister;
224 typedef DoubleRegister FloatRegister; 281 typedef FPURegister FloatRegister;
225 282
226 const DoubleRegister no_freg = {-1}; 283 const FPURegister no_freg = { -1 };
227 284
228 const DoubleRegister f0 = {0}; // Return value in hard float mode. 285 const FPURegister f0 = { 0 }; // Return value in hard float mode.
229 const DoubleRegister f1 = {1}; 286 const FPURegister f1 = { 1 };
230 const DoubleRegister f2 = {2}; 287 const FPURegister f2 = { 2 };
231 const DoubleRegister f3 = {3}; 288 const FPURegister f3 = { 3 };
232 const DoubleRegister f4 = {4}; 289 const FPURegister f4 = { 4 };
233 const DoubleRegister f5 = {5}; 290 const FPURegister f5 = { 5 };
234 const DoubleRegister f6 = {6}; 291 const FPURegister f6 = { 6 };
235 const DoubleRegister f7 = {7}; 292 const FPURegister f7 = { 7 };
236 const DoubleRegister f8 = {8}; 293 const FPURegister f8 = { 8 };
237 const DoubleRegister f9 = {9}; 294 const FPURegister f9 = { 9 };
238 const DoubleRegister f10 = {10}; 295 const FPURegister f10 = { 10 };
239 const DoubleRegister f11 = {11}; 296 const FPURegister f11 = { 11 };
240 const DoubleRegister f12 = {12}; // Arg 0 in hard float mode. 297 const FPURegister f12 = { 12 }; // Arg 0 in hard float mode.
241 const DoubleRegister f13 = {13}; 298 const FPURegister f13 = { 13 };
242 const DoubleRegister f14 = {14}; // Arg 1 in hard float mode. 299 const FPURegister f14 = { 14 }; // Arg 1 in hard float mode.
243 const DoubleRegister f15 = {15}; 300 const FPURegister f15 = { 15 };
244 const DoubleRegister f16 = {16}; 301 const FPURegister f16 = { 16 };
245 const DoubleRegister f17 = {17}; 302 const FPURegister f17 = { 17 };
246 const DoubleRegister f18 = {18}; 303 const FPURegister f18 = { 18 };
247 const DoubleRegister f19 = {19}; 304 const FPURegister f19 = { 19 };
248 const DoubleRegister f20 = {20}; 305 const FPURegister f20 = { 20 };
249 const DoubleRegister f21 = {21}; 306 const FPURegister f21 = { 21 };
250 const DoubleRegister f22 = {22}; 307 const FPURegister f22 = { 22 };
251 const DoubleRegister f23 = {23}; 308 const FPURegister f23 = { 23 };
252 const DoubleRegister f24 = {24}; 309 const FPURegister f24 = { 24 };
253 const DoubleRegister f25 = {25}; 310 const FPURegister f25 = { 25 };
254 const DoubleRegister f26 = {26}; 311 const FPURegister f26 = { 26 };
255 const DoubleRegister f27 = {27}; 312 const FPURegister f27 = { 27 };
256 const DoubleRegister f28 = {28}; 313 const FPURegister f28 = { 28 };
257 const DoubleRegister f29 = {29}; 314 const FPURegister f29 = { 29 };
258 const DoubleRegister f30 = {30}; 315 const FPURegister f30 = { 30 };
259 const DoubleRegister f31 = {31}; 316 const FPURegister f31 = { 31 };
260 317
261 // Register aliases. 318 // Register aliases.
262 // cp is assumed to be a callee saved register. 319 // cp is assumed to be a callee saved register.
263 // Defined using #define instead of "static const Register&" because Clang 320 // Defined using #define instead of "static const Register&" because Clang
264 // complains otherwise when a compilation unit that includes this header 321 // complains otherwise when a compilation unit that includes this header
265 // doesn't use the variables. 322 // doesn't use the variables.
266 #define kRootRegister s6 323 #define kRootRegister s6
267 #define cp s7 324 #define cp s7
268 #define kLithiumScratchReg s3 325 #define kLithiumScratchReg s3
269 #define kLithiumScratchReg2 s4 326 #define kLithiumScratchReg2 s4
270 #define kLithiumScratchDouble f30 327 #define kLithiumScratchDouble f30
271 #define kDoubleRegZero f28 328 #define kDoubleRegZero f28
272 // Used on mips64r6 for compare operations. 329 // Used on mips64r6 for compare operations.
273 // We use the last non-callee saved odd register for N64 ABI 330 // We use the last non-callee saved odd register for N64 ABI
274 #define kDoubleCompareReg f23 331 #define kDoubleCompareReg f23
275 332
276 // FPU (coprocessor 1) control registers. 333 // FPU (coprocessor 1) control registers.
277 // Currently only FCSR (#31) is implemented. 334 // Currently only FCSR (#31) is implemented.
278 struct FPUControlRegister { 335 struct FPUControlRegister {
279 bool is_valid() const { return reg_code == kFCSRRegister; } 336 bool is_valid() const { return code_ == kFCSRRegister; }
280 bool is(FPUControlRegister creg) const { return reg_code == creg.reg_code; } 337 bool is(FPUControlRegister creg) const { return code_ == creg.code_; }
281 int code() const { 338 int code() const {
282 DCHECK(is_valid()); 339 DCHECK(is_valid());
283 return reg_code; 340 return code_;
284 } 341 }
285 int bit() const { 342 int bit() const {
286 DCHECK(is_valid()); 343 DCHECK(is_valid());
287 return 1 << reg_code; 344 return 1 << code_;
288 } 345 }
289 void setcode(int f) { 346 void setcode(int f) {
290 reg_code = f; 347 code_ = f;
291 DCHECK(is_valid()); 348 DCHECK(is_valid());
292 } 349 }
293 // Unfortunately we can't make this private in a struct. 350 // Unfortunately we can't make this private in a struct.
294 int reg_code; 351 int code_;
295 }; 352 };
296 353
297 const FPUControlRegister no_fpucreg = { kInvalidFPUControlRegister }; 354 const FPUControlRegister no_fpucreg = { kInvalidFPUControlRegister };
298 const FPUControlRegister FCSR = { kFCSRRegister }; 355 const FPUControlRegister FCSR = { kFCSRRegister };
299 356
300 357
301 // ----------------------------------------------------------------------------- 358 // -----------------------------------------------------------------------------
302 // Machine instruction Operands. 359 // Machine instruction Operands.
303 const int kSmiShift = kSmiTagSize + kSmiShiftSize; 360 const int kSmiShift = kSmiTagSize + kSmiShiftSize;
304 const uint64_t kSmiShiftMask = (1UL << kSmiShift) - 1; 361 const uint64_t kSmiShiftMask = (1UL << kSmiShift) - 1;
(...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after
1436 class EnsureSpace BASE_EMBEDDED { 1493 class EnsureSpace BASE_EMBEDDED {
1437 public: 1494 public:
1438 explicit EnsureSpace(Assembler* assembler) { 1495 explicit EnsureSpace(Assembler* assembler) {
1439 assembler->CheckBuffer(); 1496 assembler->CheckBuffer();
1440 } 1497 }
1441 }; 1498 };
1442 1499
1443 } } // namespace v8::internal 1500 } } // namespace v8::internal
1444 1501
1445 #endif // V8_ARM_ASSEMBLER_MIPS_H_ 1502 #endif // V8_ARM_ASSEMBLER_MIPS_H_
OLDNEW
« no previous file with comments | « src/mips/macro-assembler-mips.cc ('k') | src/mips64/assembler-mips64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698