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

Side by Side Diff: runtime/vm/locations.h

Issue 12871015: SIMD plumbing (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix FPU register move instruction on x64 Created 7 years, 9 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_LOCATIONS_H_ 5 #ifndef VM_LOCATIONS_H_
6 #define VM_LOCATIONS_H_ 6 #define VM_LOCATIONS_H_
7 7
8 #include "vm/allocation.h" 8 #include "vm/allocation.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/bitfield.h" 10 #include "vm/bitfield.h"
11 11
12 namespace dart { 12 namespace dart {
13 13
14 class BufferFormatter; 14 class BufferFormatter;
15 class Value; 15 class Value;
16 16
17 // Location objects are used to connect register allocator and code generator. 17 // Location objects are used to connect register allocator and code generator.
18 // Instruction templates used by code generator have a corresponding 18 // Instruction templates used by code generator have a corresponding
19 // LocationSummary object which specifies expected location for every input 19 // LocationSummary object which specifies expected location for every input
20 // and output. 20 // and output.
21 // Each location is encoded as a single word: for non-constant locations 21 // Each location is encoded as a single word: for non-constant locations
22 // low 3 bits denote location kind, rest is kind specific location payload 22 // low 3 bits denote location kind, rest is kind specific location payload
23 // e.g. for REGISTER kind payload is register code (value of the Register 23 // e.g. for REGISTER kind payload is register code (value of the Register
24 // enumeration), constant locations contain a tagged (low 2 bits are set to 01) 24 // enumeration), constant locations contain a tagged (low 2 bits are set to 01)
25 // Object handle 25 // Object handle
26 class Location : public ValueObject { 26 class Location : public ValueObject {
27 private: 27 private:
28 enum { 28 enum {
29 // Number of bits required to encode Kind value. 29 // Number of bits required to encode Kind value.
30 kBitsForKind = 3, 30 kBitsForKind = 4,
31 kBitsForPayload = kWordSize * kBitsPerByte - kBitsForKind, 31 kBitsForPayload = kWordSize * kBitsPerByte - kBitsForKind,
32 }; 32 };
33 33
34 static const uword kInvalidLocation = 0; 34 static const uword kInvalidLocation = 0;
35 static const uword kConstantMask = 0x3; 35 static const uword kConstantMask = 0x3;
36 36
37 static const intptr_t kMachineRegisterMask = 0x6; 37 static const intptr_t kMachineRegisterMask = 0x6;
38 static const intptr_t kMachineRegister = 0x6; 38 static const intptr_t kMachineRegister = 0x6;
39 39
40 public: 40 public:
(...skipping 10 matching lines...) Expand all
51 // Unallocated location represents a location that is not fixed and can be 51 // Unallocated location represents a location that is not fixed and can be
52 // allocated by a register allocator. Each unallocated location has 52 // allocated by a register allocator. Each unallocated location has
53 // a policy that specifies what kind of location is suitable. Payload 53 // a policy that specifies what kind of location is suitable. Payload
54 // contains register allocation policy. 54 // contains register allocation policy.
55 kUnallocated = 2, 55 kUnallocated = 2,
56 56
57 // Spill slot allocated by the register allocator. Payload contains 57 // Spill slot allocated by the register allocator. Payload contains
58 // a spill index. 58 // a spill index.
59 kStackSlot = 3, 59 kStackSlot = 3,
60 kDoubleStackSlot = 4, 60 kDoubleStackSlot = 4,
61 kFloat32x4StackSlot = 8,
62 kUint32x4StackSlot = 9,
Vyacheslav Egorov (Google) 2013/03/17 18:17:10 It can't be 9 (see the comment above enum Kind).
Cutch 2013/03/17 21:52:37 Done.
61 63
62 // Register location represents a fixed register. Payload contains 64 // Register location represents a fixed register. Payload contains
63 // register code. 65 // register code.
64 kRegister = 6, 66 kRegister = 6,
65 67
66 // FpuRegister location represents a fixed fpu register. Payload contains 68 // FpuRegister location represents a fixed fpu register. Payload contains
67 // its code. 69 // its code.
68 kFpuRegister = 7, 70 kFpuRegister = 7,
69 }; 71 };
70 72
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 171
170 bool IsRegister() const { 172 bool IsRegister() const {
171 return kind() == kRegister; 173 return kind() == kRegister;
172 } 174 }
173 175
174 Register reg() const { 176 Register reg() const {
175 ASSERT(IsRegister()); 177 ASSERT(IsRegister());
176 return RegisterField::decode(payload()); 178 return RegisterField::decode(payload());
177 } 179 }
178 180
179 // FPU registers and double spill slots can contain either doubles 181 // FPU registers and double spill slots can contain either doubles,
180 // or 64-bit integers. 182 // 64-bit integers, Float32x4, or Uint32x4 values.
181 enum Representation { 183 enum Representation {
182 kDouble, 184 kDouble,
183 kMint 185 kMint,
186 kFloat32x4,
187 kUint32x4
184 }; 188 };
185 189
186 Representation representation() const { 190 Representation representation() const {
187 ASSERT(IsFpuRegister() || IsDoubleStackSlot()); 191 ASSERT(IsFpuRegister() ||IsDoubleStackSlot() || IsFloat32x4StackSlot() ||
192 IsUint32x4StackSlot());
188 return RepresentationField::decode(payload()); 193 return RepresentationField::decode(payload());
189 } 194 }
190 195
191 // FpuRegister locations. 196 // FpuRegister locations.
192 static Location FpuRegisterLocation(FpuRegister reg, Representation rep) { 197 static Location FpuRegisterLocation(FpuRegister reg, Representation rep) {
193 uword payload = 198 uword payload =
194 FpuRegisterField::encode(reg) | RepresentationField::encode(rep); 199 FpuRegisterField::encode(reg) | RepresentationField::encode(rep);
195 return Location(kFpuRegister, payload); 200 return Location(kFpuRegister, payload);
196 } 201 }
197 202
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 Location loc(kDoubleStackSlot, payload); 260 Location loc(kDoubleStackSlot, payload);
256 // Ensure that sign is preserved. 261 // Ensure that sign is preserved.
257 ASSERT(loc.stack_index() == stack_index); 262 ASSERT(loc.stack_index() == stack_index);
258 return loc; 263 return loc;
259 } 264 }
260 265
261 bool IsDoubleStackSlot() const { 266 bool IsDoubleStackSlot() const {
262 return kind() == kDoubleStackSlot; 267 return kind() == kDoubleStackSlot;
263 } 268 }
264 269
270 static Location Float32x4StackSlot(intptr_t stack_index, Representation rep) {
271 ASSERT((-kStackIndexBias <= stack_index) &&
272 (stack_index < kStackIndexBias));
273 uword payload =
274 IndexField::encode(static_cast<uword>(kStackIndexBias + stack_index))
Vyacheslav Egorov (Google) 2013/03/17 18:17:10 encoding of stack indexes repeats multiple times.
Cutch 2013/03/17 21:52:37 Done.
275 | RepresentationField::encode(rep);
276 Location loc(kFloat32x4StackSlot, payload);
277 // Ensure that sign is preserved.
278 ASSERT(loc.stack_index() == stack_index);
279 return loc;
280 }
281
282 bool IsFloat32x4StackSlot() const {
283 return kind() == kFloat32x4StackSlot;
284 }
285
286 static Location Uint32x4StackSlot(intptr_t stack_index, Representation rep) {
287 ASSERT((-kStackIndexBias <= stack_index) &&
288 (stack_index < kStackIndexBias));
289 uword payload =
290 IndexField::encode(static_cast<uword>(kStackIndexBias + stack_index))
291 | RepresentationField::encode(rep);
292 Location loc(kUint32x4StackSlot, payload);
293 // Ensure that sign is preserved.
294 ASSERT(loc.stack_index() == stack_index);
295 return loc;
296 }
297
298 bool IsUint32x4StackSlot() const {
299 return kind() == kUint32x4StackSlot;
300 }
301
265 302
266 intptr_t stack_index() const { 303 intptr_t stack_index() const {
267 ASSERT(IsStackSlot() || IsDoubleStackSlot()); 304 ASSERT(IsStackSlot() || IsDoubleStackSlot() || IsFloat32x4StackSlot() ||
305 IsUint32x4StackSlot());
268 // Decode stack index manually to preserve sign. 306 // Decode stack index manually to preserve sign.
269 return IndexField::decode(payload()) - kStackIndexBias; 307 return IndexField::decode(payload()) - kStackIndexBias;
270 } 308 }
271 309
272 // Return a memory operand for stack slot locations. 310 // Return a memory operand for stack slot locations.
273 Address ToStackSlotAddress() const; 311 Address ToStackSlotAddress() const;
274 312
275 // Constants. 313 // Constants.
276 static Location RegisterOrConstant(Value* value); 314 static Location RegisterOrConstant(Value* value);
277 static Location RegisterOrSmiConstant(Value* value); 315 static Location RegisterOrSmiConstant(Value* value);
(...skipping 27 matching lines...) Expand all
305 } 343 }
306 344
307 typedef BitField<Kind, 0, kBitsForKind> KindField; 345 typedef BitField<Kind, 0, kBitsForKind> KindField;
308 typedef BitField<uword, kBitsForKind, kBitsForPayload> PayloadField; 346 typedef BitField<uword, kBitsForKind, kBitsForPayload> PayloadField;
309 347
310 // Layout for kUnallocated locations payload. 348 // Layout for kUnallocated locations payload.
311 typedef BitField<Policy, 0, 3> PolicyField; 349 typedef BitField<Policy, 0, 3> PolicyField;
312 350
313 // Layout for register locations payload. The representation bit is only used 351 // Layout for register locations payload. The representation bit is only used
314 // for FpuRegister and unused for Register. 352 // for FpuRegister and unused for Register.
315 static const intptr_t kBitsForRepresentation = 1; 353 static const intptr_t kBitsForRepresentation = 2;
316 static const intptr_t kBitsForRegister = 354 static const intptr_t kBitsForRegister =
317 kBitsForPayload - kBitsForRepresentation; 355 kBitsForPayload - kBitsForRepresentation;
318 typedef BitField<Representation, 356 typedef BitField<Representation,
319 0, 357 0,
320 kBitsForRepresentation> RepresentationField; 358 kBitsForRepresentation> RepresentationField;
321 typedef BitField<Register, 359 typedef BitField<Register,
322 kBitsForRepresentation, 360 kBitsForRepresentation,
323 kBitsForRegister> RegisterField; 361 kBitsForRegister> RegisterField;
324 typedef BitField<FpuRegister, 362 typedef BitField<FpuRegister,
325 kBitsForRepresentation, 363 kBitsForRepresentation,
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 BitmapBuilder* stack_bitmap_; 526 BitmapBuilder* stack_bitmap_;
489 527
490 const ContainsCall contains_call_; 528 const ContainsCall contains_call_;
491 RegisterSet live_registers_; 529 RegisterSet live_registers_;
492 }; 530 };
493 531
494 532
495 } // namespace dart 533 } // namespace dart
496 534
497 #endif // VM_LOCATIONS_H_ 535 #endif // VM_LOCATIONS_H_
OLDNEW
« runtime/vm/isolate.h ('K') | « runtime/vm/isolate.cc ('k') | runtime/vm/locations.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698