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

Side by Side Diff: src/arm/codegen-arm.cc

Issue 1645001: Native construction of RegExp result objects, with in-object index and input. (Closed)
Patch Set: Created 10 years, 8 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
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 4003 matching lines...) Expand 10 before | Expand all | Expand 10 after
4014 Load(args->at(0)); 4014 Load(args->at(0));
4015 Load(args->at(1)); 4015 Load(args->at(1));
4016 Load(args->at(2)); 4016 Load(args->at(2));
4017 Load(args->at(3)); 4017 Load(args->at(3));
4018 4018
4019 frame_->CallRuntime(Runtime::kRegExpExec, 4); 4019 frame_->CallRuntime(Runtime::kRegExpExec, 4);
4020 frame_->EmitPush(r0); 4020 frame_->EmitPush(r0);
4021 } 4021 }
4022 4022
4023 4023
4024 void CodeGenerator::GenerateRegExpConstructResult(ZoneList<Expression*>* args) {
4025 // No stub. This code only occurs a few times in regexp.js.
4026 const int kMaxInlineLength = 100;
4027 ASSERT_EQ(3, args->length());
4028 Load(args->at(0)); // Size of array, smi.
4029 Load(args->at(1)); // "index" property value.
4030 Load(args->at(2)); // "input" property value.
4031 {
4032 VirtualFrame::SpilledScope spilled_scope(frame_);
4033 Label slowcase;
4034 Label done;
4035 __ ldr(r1, MemOperand(sp, kPointerSize * 2));
4036 STATIC_ASSERT(kSmiTag == 0);
4037 STATIC_ASSERT(kSmiTagSize == 1);
4038 __ tst(r1, Operand(0x01));
Søren Thygesen Gjesse 2010/04/13 07:22:29 kHeapObjectTag?
Lasse Reichstein 2010/04/13 09:50:56 That, or kSmiTagMask. Fixed.
4039 __ b(ne, &slowcase);
4040 __ cmp(r1, Operand(Smi::FromInt(kMaxInlineLength)));
4041 __ b(hi, &slowcase);
4042 // Smi-tagging is equivalent to multiplying by 2.
4043 // Allocate RegExpResult followed by FixedArray with size in ebx.
4044 // JSArray: [Map][empty properties][Elements][Length-smi][index][input]
4045 // Elements: [Map][Length][..elements..]
4046 // Size of JSArray with two in-object properties and the header of a
4047 // FixedArray.
4048 int objects_size =
4049 (JSArray::kRegExpResultSize + FixedArray::kHeaderSize) / kPointerSize;
Søren Thygesen Gjesse 2010/04/13 07:22:29 JSArray::kRegExpResultSize -> JSRegExpResult::kSiz
Lasse Reichstein 2010/04/13 09:50:56 Done.
4050 __ mov(r5, Operand(r1, LSR, kSmiTagSize + kSmiShiftSize));
4051 __ add(r2, r5, Operand(objects_size));
4052 __ AllocateInNewSpace(r2, // In: Size, in words.
4053 r0, // Out: Start of allocation (tagged).
4054 r3, // Scratch register.
4055 r4, // Scratch register.
4056 &slowcase,
4057 TAG_OBJECT);
4058 // r0: Start of allocated area, object-tagged.
4059 // r1: Number of elements in array, as smi.
4060 // r5: Number of elements, untagged.
4061
4062 // Set JSArray map to global.regexp_result_map().
4063 // Set empty properties FixedArray.
4064 // Set elements to point to FixedArray allocated right after the JSArray.
4065 // Interleave operations for better latency.
4066 __ ldr(r2, ContextOperand(cp, Context::GLOBAL_INDEX));
4067 __ add(r3, r0, Operand(JSArray::kRegExpResultSize));
4068 __ mov(r4, Operand(Factory::empty_fixed_array()));
4069 __ ldr(r2, FieldMemOperand(r2, GlobalObject::kGlobalContextOffset));
4070 __ str(r3, FieldMemOperand(r0, JSObject::kElementsOffset));
4071 __ ldr(r2, ContextOperand(r2, Context::REGEXP_RESULT_MAP_INDEX));
4072 __ str(r4, FieldMemOperand(r0, JSObject::kPropertiesOffset));
4073 __ str(r2, FieldMemOperand(r0, HeapObject::kMapOffset));
4074
4075 // Set input, index and length fields from arguments.
4076 __ ldm(ia_w, sp, static_cast<RegList>(r2.bit() | r4.bit()));
4077 __ str(r1, FieldMemOperand(r0, JSArray::kLengthOffset));
4078 __ add(sp, sp, Operand(kPointerSize));
4079 __ str(r4, FieldMemOperand(r0, JSArray::kSize));
Søren Thygesen Gjesse 2010/04/13 07:22:29 Please add constants JSRegExpResult::kIndexOffset
Lasse Reichstein 2010/04/13 09:50:56 Done.
4080 __ str(r2, FieldMemOperand(r0, JSArray::kSize + kPointerSize));
4081
4082 // Fill out the elements FixedArray.
4083 // r0: JSArray, tagged.
4084 // r3: FixedArray, tagged.
4085 // r1: Number of elements in array, as smi.
Søren Thygesen Gjesse 2010/04/13 07:22:29 r1 -> r5 but untagged.
Lasse Reichstein 2010/04/13 09:50:56 Whoops, code and comments out of sync. Well spotte
4086
4087 // Set map.
4088 __ mov(r2, Operand(Factory::fixed_array_map()));
4089 __ str(r2, FieldMemOperand(r3, HeapObject::kMapOffset));
4090 // Untag r1 and set FixedArray length.
Søren Thygesen Gjesse 2010/04/13 07:22:29 Remove "Untag r1 and ".
Lasse Reichstein 2010/04/13 09:50:56 Done.
4091 __ str(r5, FieldMemOperand(r3, FixedArray::kLengthOffset));
4092 // Fill contents of fixed-array with the-hole.
4093 __ mov(r2, Operand(Factory::the_hole_value()));
4094 __ add(r3, r3, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
4095 // Fill fixed array elements with hole.
4096 // r0: JSArray, tagged.
4097 // r1: Number of elements to fill.
4098 // r3: Start of elements in FixedArray.
4099 // r2: the hole.
Søren Thygesen Gjesse 2010/04/13 07:22:29 Add r5 to this comment.
Lasse Reichstein 2010/04/13 09:50:56 Fixed, r1->r5.
4100 Label loop;
4101 __ tst(r5, Operand(r5));
4102 __ bind(&loop);
4103 __ b(le, &done); // Jump if r1 is negative or zero.
4104 __ sub(r5, r5, Operand(1), SetCC);
4105 __ str(r2, MemOperand(r3, r5, LSL, kPointerSizeLog2));
4106 __ jmp(&loop);
4107
4108 __ bind(&slowcase);
4109 __ CallRuntime(Runtime::kRegExpConstructResult, 3);
4110
4111 __ bind(&done);
4112 }
4113 frame_->Forget(3);
4114 frame_->EmitPush(r0);
4115 }
4116
4117
4024 void CodeGenerator::GenerateNumberToString(ZoneList<Expression*>* args) { 4118 void CodeGenerator::GenerateNumberToString(ZoneList<Expression*>* args) {
4025 ASSERT_EQ(args->length(), 1); 4119 ASSERT_EQ(args->length(), 1);
4026 4120
4027 // Load the argument on the stack and jump to the runtime. 4121 // Load the argument on the stack and jump to the runtime.
4028 Load(args->at(0)); 4122 Load(args->at(0));
4029 4123
4030 NumberToStringStub stub; 4124 NumberToStringStub stub;
4031 frame_->CallStub(&stub, 1); 4125 frame_->CallStub(&stub, 1);
4032 frame_->EmitPush(r0); 4126 frame_->EmitPush(r0);
4033 } 4127 }
(...skipping 4361 matching lines...) Expand 10 before | Expand all | Expand 10 after
8395 8489
8396 // Just jump to runtime to add the two strings. 8490 // Just jump to runtime to add the two strings.
8397 __ bind(&string_add_runtime); 8491 __ bind(&string_add_runtime);
8398 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); 8492 __ TailCallRuntime(Runtime::kStringAdd, 2, 1);
8399 } 8493 }
8400 8494
8401 8495
8402 #undef __ 8496 #undef __
8403 8497
8404 } } // namespace v8::internal 8498 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm/codegen-arm.h ('k') | src/bootstrapper.cc » ('j') | src/bootstrapper.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698