Index: src/ia32/macro-assembler-ia32.cc |
=================================================================== |
--- src/ia32/macro-assembler-ia32.cc (revision 5357) |
+++ src/ia32/macro-assembler-ia32.cc (working copy) |
@@ -377,6 +377,17 @@ |
} |
+void MacroAssembler::AbortIfNotString(Register object) { |
+ test(object, Immediate(kSmiTagMask)); |
+ Assert(not_equal, "Operand is not a string"); |
+ push(object); |
+ mov(object, FieldOperand(object, HeapObject::kMapOffset)); |
+ CmpInstanceType(object, FIRST_NONSTRING_TYPE); |
+ pop(object); |
+ Assert(below, "Operand is not a string"); |
+} |
+ |
+ |
void MacroAssembler::AbortIfSmi(Register object) { |
test(object, Immediate(kSmiTagMask)); |
Assert(not_equal, "Operand is a smi"); |
@@ -1040,6 +1051,25 @@ |
} |
+void MacroAssembler::IndexFromHash(Register hash, Register index) { |
+ // The assert checks that the constants for the maximum number of digits |
+ // for an array index cached in the hash field and the number of bits |
+ // reserved for it does not conflict. |
+ ASSERT(TenToThe(String::kMaxCachedArrayIndexLength) < |
+ (1 << String::kArrayIndexValueBits)); |
+ // We want the smi-tagged index in key. kArrayIndexValueMask has zeros in |
+ // the low kHashShift bits. |
+ and_(hash, String::kArrayIndexValueMask); |
+ STATIC_ASSERT(String::kHashShift >= kSmiTagSize && kSmiTag == 0); |
+ if (String::kHashShift > kSmiTagSize) { |
+ shr(hash, String::kHashShift - kSmiTagSize); |
+ } |
+ if (!index.is(hash)) { |
+ mov(index, hash); |
+ } |
+} |
+ |
+ |
void MacroAssembler::CallRuntime(Runtime::FunctionId id, int num_arguments) { |
CallRuntime(Runtime::FunctionForId(id), num_arguments); |
} |