Reviewers: Jakob,
Description:
Introduce Unsigned32 and RegExp types
Also, renamed Integer31 back to Smi, and Integer32 to Signed32.
[email protected]
BUG=
Please review this at https://codereview.chromium.org/17589013/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/hydrogen.cc
M src/ic.cc
M src/types.h
M src/types.cc
M test/cctest/test-types.cc
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index
8d3a0ac813a90a6014ac6185473406c2ca5e8927..5874b09876c390058209f2c1e5c9dff10ca14ccd
100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -5015,7 +5015,7 @@ void
HOptimizedGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) {
HControlInstruction* compare;
if (stmt->switch_type() == SwitchStatement::SMI_SWITCH) {
- if (!clause->compare_type()->Is(Type::Integer31())) {
+ if (!clause->compare_type()->Is(Type::Smi())) {
AddSoftDeoptimize();
}
@@ -9457,8 +9457,8 @@ HInstruction*
HOptimizedGraphBuilder::BuildBinaryOperation(
break;
case Token::BIT_OR: {
HValue* operand, *shift_amount;
- if (left_type->Is(Type::Integer32()) &&
- right_type->Is(Type::Integer32()) &&
+ if (left_type->Is(Type::Signed32()) &&
+ right_type->Is(Type::Signed32()) &&
MatchRotateRight(left, right, &operand, &shift_amount)) {
instr = new(zone()) HRor(context, operand, shift_amount);
} else {
@@ -9658,7 +9658,7 @@ Representation
HOptimizedGraphBuilder::ToRepresentation(TypeInfo info) {
Representation HOptimizedGraphBuilder::ToRepresentation(Handle<Type> type)
{
if (type->Is(Type::None())) return Representation::None();
- if (type->Is(Type::Integer32())) return Representation::Integer32();
+ if (type->Is(Type::Signed32())) return Representation::Integer32();
if (type->Is(Type::Number())) return Representation::Double();
return Representation::Tagged();
}
@@ -9883,8 +9883,8 @@ void
HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) {
} else {
// TODO(verwaest): Remove once ToRepresentation properly returns Smi
when
// the IC measures Smi.
- if (left_type->Is(Type::Integer31())) left_rep =
Representation::Smi();
- if (right_type->Is(Type::Integer31())) right_rep =
Representation::Smi();
+ if (left_type->Is(Type::Smi())) left_rep = Representation::Smi();
+ if (right_type->Is(Type::Smi())) right_rep = Representation::Smi();
HCompareIDAndBranch* result =
new(zone()) HCompareIDAndBranch(left, right, op);
result->set_observed_input_representation(left_rep, right_rep);
Index: src/ic.cc
diff --git a/src/ic.cc b/src/ic.cc
index
6abd52f2a16446967a00a182990dadba0f5cb283..39955610b510eb15ac0a33a0bf64c316690ebec4
100644
--- a/src/ic.cc
+++ b/src/ic.cc
@@ -2437,7 +2437,7 @@ Handle<Type> UnaryOpIC::TypeInfoToType(TypeInfo
type_info, Isolate* isolate) {
case UNINITIALIZED:
return handle(Type::None(), isolate);
case SMI:
- return handle(Type::Integer31(), isolate);
+ return handle(Type::Smi(), isolate);
case NUMBER:
return handle(Type::Number(), isolate);
case GENERIC:
@@ -2524,9 +2524,9 @@ Handle<Type>
BinaryOpIC::TypeInfoToType(BinaryOpIC::TypeInfo binary_type,
case UNINITIALIZED:
return handle(Type::None(), isolate);
case SMI:
- return handle(Type::Integer31(), isolate);
+ return handle(Type::Smi(), isolate);
case INT32:
- return handle(Type::Integer32(), isolate);
+ return handle(Type::Signed32(), isolate);
case NUMBER:
return handle(Type::Number(), isolate);
case ODDBALL:
@@ -2845,7 +2845,7 @@ Handle<Type> CompareIC::StateToType(
case CompareIC::UNINITIALIZED:
return handle(Type::None(), isolate);
case CompareIC::SMI:
- return handle(Type::Integer31(), isolate);
+ return handle(Type::Smi(), isolate);
case CompareIC::NUMBER:
return handle(Type::Number(), isolate);
case CompareIC::STRING:
Index: src/types.cc
diff --git a/src/types.cc b/src/types.cc
index
03e12c44c04ba7ed5e8beae8b56b6622346e49cf..b8febc2a149ad4e7e488a8cfc4e6a59f6c896da6
100644
--- a/src/types.cc
+++ b/src/types.cc
@@ -125,7 +125,7 @@ int Type::LubBitset() {
map = *this->as_class();
} else {
Handle<v8::internal::Object> value = this->as_constant();
- if (value->IsSmi()) return kInteger31;
+ if (value->IsSmi()) return kSmi;
map = HeapObject::cast(*value)->map();
if (map->instance_type() == ODDBALL_TYPE) {
if (value->IsUndefined()) return kUndefined;
@@ -175,14 +175,17 @@ int Type::LubBitset() {
case JS_ARRAY_BUFFER_TYPE:
case JS_TYPED_ARRAY_TYPE:
case JS_DATA_VIEW_TYPE:
+ case JS_SET_TYPE:
+ case JS_MAP_TYPE:
case JS_WEAK_MAP_TYPE:
- case JS_REGEXP_TYPE:
if (map->is_undetectable()) return kUndetectable;
return kOtherObject;
case JS_ARRAY_TYPE:
return kArray;
case JS_FUNCTION_TYPE:
return kFunction;
+ case JS_REGEXP_TYPE:
+ return kRegExp;
case JS_PROXY_TYPE:
case JS_FUNCTION_PROXY_TYPE:
return kProxy;
Index: src/types.h
diff --git a/src/types.h b/src/types.h
index
acd199d9c45062ab3d24c79f269fcfbef6141a4a..a164980caf812658507f130dfe7c1c0f8192b0ba
100644
--- a/src/types.h
+++ b/src/types.h
@@ -48,8 +48,8 @@ namespace internal {
// T <= Any
//
// Oddball = Boolean \/ Null \/ Undefined
-// Number = Integer32 \/ Double
-// Integer31 < Integer32
+// Number = Signed32 \/ Unsigned32 \/ Double
+// Smi < Signed32
// Name = String \/ Symbol
// UniqueName = InternalizedString \/ Symbol
// InternalizedString < String
@@ -60,6 +60,7 @@ namespace internal {
// Receiver = Object \/ Proxy
// Array < Object
// Function < Object
+// RegExp < Object
//
// Class(map) < T iff instance_type(map) < T
// Constant(x) < T iff instance_type(map(x)) < T
@@ -104,9 +105,11 @@ class Type : public Object {
static Type* Undefined() { return from_bitset(kUndefined); }
static Type* Number() { return from_bitset(kNumber); }
- static Type* Integer31() { return from_bitset(kInteger31); }
- static Type* Integer32() { return from_bitset(kInteger32); }
+ static Type* Smi() { return from_bitset(kSmi); }
+ static Type* Signed32() { return from_bitset(kSigned32); }
+ static Type* Unsigned32() { return from_bitset(kUnsigned32); }
static Type* Double() { return from_bitset(kDouble); }
+ static Type* NumberOrString() { return from_bitset(kNumberOrString); }
static Type* Name() { return from_bitset(kName); }
static Type* UniqueName() { return from_bitset(kUniqueName); }
@@ -119,6 +122,7 @@ class Type : public Object {
static Type* Undetectable() { return from_bitset(kUndetectable); }
static Type* Array() { return from_bitset(kArray); }
static Type* Function() { return from_bitset(kFunction); }
+ static Type* RegExp() { return from_bitset(kRegExp); }
static Type* Proxy() { return from_bitset(kProxy); }
static Type* Class(Handle<Map> map) { return from_handle(map); }
@@ -188,25 +192,28 @@ class Type : public Object {
kNull = 1 << 0,
kUndefined = 1 << 1,
kBoolean = 1 << 2,
- kInteger31 = 1 << 3,
- kOtherInteger = 1 << 4,
- kDouble = 1 << 5,
- kSymbol = 1 << 6,
- kInternalizedString = 1 << 7,
- kOtherString = 1 << 8,
- kUndetectable = 1 << 9,
- kArray = 1 << 10,
- kFunction = 1 << 11,
- kOtherObject = 1 << 12,
- kProxy = 1 << 13,
+ kSmi = 1 << 3,
+ kOtherSigned32 = 1 << 4,
+ kUnsigned32 = 1 << 5,
+ kDouble = 1 << 6,
+ kSymbol = 1 << 7,
+ kInternalizedString = 1 << 8,
+ kOtherString = 1 << 9,
+ kUndetectable = 1 << 10,
+ kArray = 1 << 11,
+ kFunction = 1 << 12,
+ kRegExp = 1 << 13,
+ kOtherObject = 1 << 14,
+ kProxy = 1 << 15,
kOddball = kBoolean | kNull | kUndefined,
- kInteger32 = kInteger31 | kOtherInteger,
- kNumber = kInteger32 | kDouble,
+ kSigned32 = kSmi | kOtherSigned32,
+ kNumber = kSigned32 | kUnsigned32 | kDouble,
kString = kInternalizedString | kOtherString,
kUniqueName = kSymbol | kInternalizedString,
kName = kSymbol | kString,
- kObject = kUndetectable | kArray | kFunction | kOtherObject,
+ kNumberOrString = kNumber | kString,
+ kObject = kUndetectable | kArray | kFunction | kRegExp | kOtherObject,
kReceiver = kObject | kProxy,
kAllocated = kDouble | kName | kReceiver,
kAny = kOddball | kNumber | kAllocated,
Index: test/cctest/test-types.cc
diff --git a/test/cctest/test-types.cc b/test/cctest/test-types.cc
index
24e83eb0ee8e108e1f662a5738308230410ef491..78abeba0ab450a9763e64467b67f4d2742873e1a
100644
--- a/test/cctest/test-types.cc
+++ b/test/cctest/test-types.cc
@@ -107,8 +107,8 @@ class HandlifiedTypes {
Null(Type::Null(), isolate),
Undefined(Type::Undefined(), isolate),
Number(Type::Number(), isolate),
- Integer31(Type::Integer31(), isolate),
- Integer32(Type::Integer32(), isolate),
+ Integer31(Type::Smi(), isolate),
+ Integer32(Type::Signed32(), isolate),
Double(Type::Double(), isolate),
Name(Type::Name(), isolate),
UniqueName(Type::UniqueName(), isolate),
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.