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

Side by Side Diff: src/compiler/representation-change.h

Issue 425003004: Implement representation selection as part of SimplifiedLowering. Representation selection also req… (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Added better tests for Load/Store of fields and elements, with both tagged and untagged bases. Created 6 years, 4 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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_COMPILER_REPRESENTATION_CHANGE_H_ 5 #ifndef V8_COMPILER_REPRESENTATION_CHANGE_H_
6 #define V8_COMPILER_REPRESENTATION_CHANGE_H_ 6 #define V8_COMPILER_REPRESENTATION_CHANGE_H_
7 7
8 #include "src/compiler/js-graph.h" 8 #include "src/compiler/js-graph.h"
9 #include "src/compiler/machine-operator.h" 9 #include "src/compiler/machine-operator.h"
10 #include "src/compiler/node-properties-inl.h" 10 #include "src/compiler/node-properties-inl.h"
(...skipping 18 matching lines...) Expand all
29 // Types. 29 // Types.
30 tBool = 1 << 5, 30 tBool = 1 << 5,
31 tInt32 = 1 << 6, 31 tInt32 = 1 << 6,
32 tUint32 = 1 << 7, 32 tUint32 = 1 << 7,
33 tInt64 = 1 << 8, 33 tInt64 = 1 << 8,
34 tUint64 = 1 << 9, 34 tUint64 = 1 << 9,
35 tNumber = 1 << 10, 35 tNumber = 1 << 10,
36 tAny = 1 << 11 36 tAny = 1 << 11
37 }; 37 };
38 38
39 #define REP_TYPE_STRLEN 24
40
39 typedef uint16_t RepTypeUnion; 41 typedef uint16_t RepTypeUnion;
40 42
43
44 inline void RenderRepTypeUnion(char* buf, RepTypeUnion info) {
45 snprintf(buf, REP_TYPE_STRLEN, "{%s%s%s%s%s %s%s%s%s%s%s%s}",
46 (info & rBit) ? "k" : " ", (info & rWord32) ? "w" : " ",
47 (info & rWord64) ? "q" : " ", (info & rFloat64) ? "f" : " ",
48 (info & rTagged) ? "t" : " ", (info & tBool) ? "Z" : " ",
49 (info & tInt32) ? "I" : " ", (info & tUint32) ? "U" : " ",
50 (info & tInt64) ? "L" : " ", (info & tUint64) ? "J" : " ",
51 (info & tNumber) ? "N" : " ", (info & tAny) ? "*" : " ");
52 }
53
54
41 const RepTypeUnion rMask = rBit | rWord32 | rWord64 | rFloat64 | rTagged; 55 const RepTypeUnion rMask = rBit | rWord32 | rWord64 | rFloat64 | rTagged;
42 const RepTypeUnion tMask = 56 const RepTypeUnion tMask =
43 tBool | tInt32 | tUint32 | tInt64 | tUint64 | tNumber | tAny; 57 tBool | tInt32 | tUint32 | tInt64 | tUint64 | tNumber | tAny;
44 const RepType rPtr = kPointerSize == 4 ? rWord32 : rWord64; 58 const RepType rPtr = kPointerSize == 4 ? rWord32 : rWord64;
45 59
46
47 // Contains logic related to changing the representation of values for constants 60 // Contains logic related to changing the representation of values for constants
48 // and other nodes, as well as lowering Simplified->Machine operators. 61 // and other nodes, as well as lowering Simplified->Machine operators.
49 // Eagerly folds any representation changes for constants. 62 // Eagerly folds any representation changes for constants.
50 class RepresentationChanger { 63 class RepresentationChanger {
51 public: 64 public:
52 RepresentationChanger(JSGraph* jsgraph, SimplifiedOperatorBuilder* simplified, 65 RepresentationChanger(JSGraph* jsgraph, SimplifiedOperatorBuilder* simplified,
53 MachineOperatorBuilder* machine, Isolate* isolate) 66 MachineOperatorBuilder* machine, Isolate* isolate)
54 : jsgraph_(jsgraph), 67 : jsgraph_(jsgraph),
55 simplified_(simplified), 68 simplified_(simplified),
56 machine_(machine), 69 machine_(machine),
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 RepType rElement = TypeForMachineRepresentation(access.representation); 350 RepType rElement = TypeForMachineRepresentation(access.representation);
338 return static_cast<RepType>(tElement | rElement); 351 return static_cast<RepType>(tElement | rElement);
339 } 352 }
340 353
341 RepType TypeForElement(const ElementAccess& access) { 354 RepType TypeForElement(const ElementAccess& access) {
342 RepType tElement = static_cast<RepType>(0); // TODO(titzer) 355 RepType tElement = static_cast<RepType>(0); // TODO(titzer)
343 RepType rElement = TypeForMachineRepresentation(access.representation); 356 RepType rElement = TypeForMachineRepresentation(access.representation);
344 return static_cast<RepType>(tElement | rElement); 357 return static_cast<RepType>(tElement | rElement);
345 } 358 }
346 359
347 RepType TypeForBasePointer(Node* node) { 360 RepType TypeForBasePointer(const FieldAccess& access) {
348 Type* upper = NodeProperties::GetBounds(node).upper; 361 if (access.tag() != 0) return static_cast<RepType>(tAny | rTagged);
349 if (upper->Is(Type::UntaggedPtr())) return rPtr; 362 return kPointerSize == 8 ? rWord64 : rWord32;
350 return static_cast<RepType>(tAny | rTagged); 363 }
364
365 RepType TypeForBasePointer(const ElementAccess& access) {
366 if (access.tag() != 0) return static_cast<RepType>(tAny | rTagged);
367 return kPointerSize == 8 ? rWord64 : rWord32;
351 } 368 }
352 369
353 private: 370 private:
354 JSGraph* jsgraph_; 371 JSGraph* jsgraph_;
355 SimplifiedOperatorBuilder* simplified_; 372 SimplifiedOperatorBuilder* simplified_;
356 MachineOperatorBuilder* machine_; 373 MachineOperatorBuilder* machine_;
357 Isolate* isolate_; 374 Isolate* isolate_;
358 375
359 friend class RepresentationChangerTester; // accesses the below fields. 376 friend class RepresentationChangerTester; // accesses the below fields.
360 377
361 bool testing_type_errors_; // If {true}, don't abort on a type error. 378 bool testing_type_errors_; // If {true}, don't abort on a type error.
362 bool type_error_; // Set when a type error is detected. 379 bool type_error_; // Set when a type error is detected.
363 380
364 Node* TypeError(Node* node, RepTypeUnion output_type, RepTypeUnion use) { 381 Node* TypeError(Node* node, RepTypeUnion output_type, RepTypeUnion use) {
365 type_error_ = true; 382 type_error_ = true;
366 if (!testing_type_errors_) { 383 if (!testing_type_errors_) {
367 UNREACHABLE(); // TODO(titzer): report nicer type error 384 char buf1[REP_TYPE_STRLEN];
385 char buf2[REP_TYPE_STRLEN];
386 RenderRepTypeUnion(buf1, output_type);
387 RenderRepTypeUnion(buf2, use);
388 V8_Fatal(__FILE__, __LINE__,
389 "RepresentationChangerError: node #%d:%s of rep"
390 "%s cannot be changed to rep%s",
391 node->id(), node->op()->mnemonic(), buf1, buf2);
368 } 392 }
369 return node; 393 return node;
370 } 394 }
371 395
372 JSGraph* jsgraph() { return jsgraph_; } 396 JSGraph* jsgraph() { return jsgraph_; }
373 Isolate* isolate() { return isolate_; } 397 Isolate* isolate() { return isolate_; }
374 SimplifiedOperatorBuilder* simplified() { return simplified_; } 398 SimplifiedOperatorBuilder* simplified() { return simplified_; }
375 MachineOperatorBuilder* machine() { return machine_; } 399 MachineOperatorBuilder* machine() { return machine_; }
376 }; 400 };
377 } 401 }
378 } 402 }
379 } // namespace v8::internal::compiler 403 } // namespace v8::internal::compiler
380 404
381 #endif // V8_COMPILER_REPRESENTATION_CHANGE_H_ 405 #endif // V8_COMPILER_REPRESENTATION_CHANGE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698