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

Unified Diff: src/ia32/codegen-ia32.cc

Issue 660184: Implemented one-char cache lookup in generated code. (Closed)
Patch Set: Created 10 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: src/ia32/codegen-ia32.cc
diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc
index 42ab6a88df6914938abd820805cc5a7e446da570..b3c418f251a2f6bd0eae5f174fe39c21b77e60c2 100644
--- a/src/ia32/codegen-ia32.cc
+++ b/src/ia32/codegen-ia32.cc
@@ -5597,6 +5597,53 @@ void CodeGenerator::GenerateFastCharCodeAt(ZoneList<Expression*>* args) {
}
+void CodeGenerator::GenerateCharFromCode(ZoneList<Expression*>* args) {
+ Comment(masm_, "[ GenerateCharFromCode");
+ ASSERT(args->length() == 1);
+
+ Load(args->at(0));
+ frame_->Dup();
Mads Ager (chromium) 2010/02/26 17:59:06 Do you need the Dup here? You never modify code a
Vitaly Repeshko 2010/02/26 20:14:48 Well, I tried this approach and couldn't make it w
+ Result code = frame_->Pop();
+ code.ToRegister();
+ ASSERT(code.is_valid());
+
+ Result temp = allocator()->Allocate();
+ ASSERT(temp.is_valid());
+
+ JumpTarget slow_case;
+ JumpTarget exit;
+
+ // Fast case of Heap::LookupSingleCharacterStringFromCode.
+ ASSERT(kSmiTag == 0);
+ ASSERT(kSmiShiftSize == 0);
+ ASSERT(IsPowerOf2(String::kMaxAsciiCharCode + 1));
+ __ test(code.reg(),
+ Immediate(kSmiTagMask |
+ ((~String::kMaxAsciiCharCode) << kSmiTagSize)));
+ slow_case.Branch(not_zero, not_taken);
+
+ __ Set(temp.reg(), Immediate(Factory::single_character_string_cache()));
Mads Ager (chromium) 2010/02/26 17:59:06 Adding a comment here stating that code contains a
Vitaly Repeshko 2010/02/26 20:14:48 Done.
+ ASSERT(kSmiTag == 0);
+ ASSERT(kSmiTagSize == 1);
+ ASSERT(kSmiShiftSize == 0);
+ __ mov(temp.reg(), Operand(temp.reg(),
Mads Ager (chromium) 2010/02/26 17:59:06 Use FieldOperand and drop the "- kHeapObjectTag" o
Vitaly Repeshko 2010/02/26 20:14:48 Done.
+ code.reg(), times_half_pointer_size,
+ FixedArray::kHeaderSize - kHeapObjectTag));
+ __ cmp(temp.reg(), Factory::undefined_value());
+ slow_case.Branch(equal, not_taken);
+ code.Unuse();
+
+ frame_->SetElementAt(0, &temp);
+ exit.Jump();
+
+ slow_case.Bind();
+ Result result = frame_->CallRuntime(Runtime::kCharFromCode, 1);
+ frame_->Push(&result);
+
+ exit.Bind();
+}
+
+
void CodeGenerator::GenerateIsArray(ZoneList<Expression*>* args) {
ASSERT(args->length() == 1);
Load(args->at(0));

Powered by Google App Engine
This is Rietveld 408576698