Index: src/ia32/codegen-ia32.cc |
diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc |
index 312d6e73575a2ebaaa59d24b843d501c6083bbd6..d563088cae5eb66d3edd3de4fd1ea67698d4ecfa 100644 |
--- a/src/ia32/codegen-ia32.cc |
+++ b/src/ia32/codegen-ia32.cc |
@@ -5844,6 +5844,65 @@ void CodeGenerator::GenerateMathCos(ZoneList<Expression*>* args) { |
} |
+void CodeGenerator::GenerateIsIdentical(ZoneList<Expression*>* args) { |
+ ASSERT_EQ(args->length(), 2); |
+ JumpTarget failure; |
+ JumpTarget done; |
+ |
+ Load(args->at(0)); |
+ Load(args->at(1)); |
+ |
+ Result arg2 = frame_->Pop(); |
+ Result arg1 = frame_->Pop(); |
+ arg2.ToRegister(); |
+ arg1.ToRegister(); |
+ __ cmp(arg1.reg(), Operand(arg2.reg())); |
+ arg1.Unuse(); |
+ arg2.Unuse(); |
+ failure.Branch(not_equal); |
+ |
+ frame_->Push(Factory::true_value()); |
+ done.Jump(); |
+ |
+ failure.Bind(); |
+ frame_->Push(Factory::false_value()); |
+ done.Bind(); |
+} |
+ |
+ |
+void CodeGenerator::GenerateRegExpId(ZoneList<Expression*>* args) { |
+ // If passed a JSRegExp, return a value that uniquely identifies |
+ // the regexp's behavior (i.e., two regexps returning the same value |
+ // will also behave the same). Otherwise, return some arbitrary value. |
+ ASSERT_EQ(args->length(), 1); |
+ Label done; |
+ Load(args->at(0)); |
+ Result arg = frame_->Pop(); |
+ arg.ToRegister(); |
+ frame_->Spill(arg.reg()); |
+ Result tmp = allocator()->Allocate(); |
+ ASSERT(tmp.is_valid()); |
+ |
+ ASSERT_EQ(0, kSmiTag); |
+ ASSERT_EQ(1, kSmiTagMask); |
+ __ test(arg.reg(), Immediate(kSmiTagMask)); |
+ __ j(zero, &done); |
+ __ mov(tmp.reg(), FieldOperand(arg.reg(), HeapObject::kMapOffset)); |
+ __ cmpb(FieldOperand(tmp.reg(), Map::kInstanceTypeOffset), |
+ static_cast<uint8_t>(JS_REGEXP_TYPE)); |
+ __ j(not_equal, &done); |
+ __ mov(arg.reg(), FieldOperand(arg.reg(), JSRegExp::kDataOffset)); |
+ ASSERT_EQ(3, kHeapObjectTagMask); |
+ ASSERT_EQ(1, kHeapObjectTag); |
+ // Convert FixedArray address to smi. |
+ __ sar(arg.reg(), 1); |
+ __ bind(&done); |
+ frame_->Push(arg.reg(), NumberInfo::kSmi); |
+ arg.Unuse(); |
+} |
+ |
+ |
+ |
void CodeGenerator::VisitCallRuntime(CallRuntime* node) { |
if (CheckForInlineRuntimeCall(node)) { |
return; |