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

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

Issue 1575035: Port direct call to native RegExp from JavaScript to ARM... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
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 | Annotate | Revision Log
« no previous file with comments | « src/ia32/codegen-ia32.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 7113 matching lines...) Expand 10 before | Expand all | Expand 10 after
7124 __ JumpIfSmi(rax, &runtime); 7124 __ JumpIfSmi(rax, &runtime);
7125 Condition is_string = masm->IsObjectStringType(rax, rbx, rbx); 7125 Condition is_string = masm->IsObjectStringType(rax, rbx, rbx);
7126 __ j(NegateCondition(is_string), &runtime); 7126 __ j(NegateCondition(is_string), &runtime);
7127 // Get the length of the string to rbx. 7127 // Get the length of the string to rbx.
7128 __ movl(rbx, FieldOperand(rax, String::kLengthOffset)); 7128 __ movl(rbx, FieldOperand(rax, String::kLengthOffset));
7129 7129
7130 // rbx: Length of subject string 7130 // rbx: Length of subject string
7131 // rcx: RegExp data (FixedArray) 7131 // rcx: RegExp data (FixedArray)
7132 // rdx: Number of capture registers 7132 // rdx: Number of capture registers
7133 // Check that the third argument is a positive smi less than the string 7133 // Check that the third argument is a positive smi less than the string
7134 // length. A negative value will be greater (usigned comparison). 7134 // length. A negative value will be greater (unsigned comparison).
7135 __ movq(rax, Operand(rsp, kPreviousIndexOffset)); 7135 __ movq(rax, Operand(rsp, kPreviousIndexOffset));
7136 __ SmiToInteger32(rax, rax); 7136 __ SmiToInteger32(rax, rax);
7137 __ cmpl(rax, rbx); 7137 __ cmpl(rax, rbx);
7138 __ j(above, &runtime); 7138 __ j(above, &runtime);
7139 7139
7140 // rcx: RegExp data (FixedArray) 7140 // rcx: RegExp data (FixedArray)
7141 // rdx: Number of capture registers 7141 // rdx: Number of capture registers
7142 // Check that the fourth object is a JSArray object. 7142 // Check that the fourth object is a JSArray object.
7143 __ movq(rax, Operand(rsp, kLastMatchInfoOffset)); 7143 __ movq(rax, Operand(rsp, kLastMatchInfoOffset));
7144 __ JumpIfSmi(rax, &runtime); 7144 __ JumpIfSmi(rax, &runtime);
(...skipping 25 matching lines...) Expand all
7170 ASSERT_EQ(0, kStringTag); 7170 ASSERT_EQ(0, kStringTag);
7171 ASSERT_EQ(0, kSeqStringTag); 7171 ASSERT_EQ(0, kSeqStringTag);
7172 __ testb(rbx, Immediate(kIsNotStringMask | kStringRepresentationMask)); 7172 __ testb(rbx, Immediate(kIsNotStringMask | kStringRepresentationMask));
7173 __ j(zero, &seq_string); 7173 __ j(zero, &seq_string);
7174 7174
7175 // Check for flat cons string. 7175 // Check for flat cons string.
7176 // A flat cons string is a cons string where the second part is the empty 7176 // A flat cons string is a cons string where the second part is the empty
7177 // string. In that case the subject string is just the first part of the cons 7177 // string. In that case the subject string is just the first part of the cons
7178 // string. Also in this case the first part of the cons string is known to be 7178 // string. Also in this case the first part of the cons string is known to be
7179 // a sequential string or an external string. 7179 // a sequential string or an external string.
7180 __ movl(rdx, rbx); 7180 __ andb(rbx, Immediate(kStringRepresentationMask));
7181 __ andb(rdx, Immediate(kStringRepresentationMask)); 7181 __ cmpb(rbx, Immediate(kConsStringTag));
7182 __ cmpb(rdx, Immediate(kConsStringTag));
7183 __ j(not_equal, &runtime); 7182 __ j(not_equal, &runtime);
7184 __ movq(rdx, FieldOperand(rax, ConsString::kSecondOffset)); 7183 __ movq(rdx, FieldOperand(rax, ConsString::kSecondOffset));
7185 __ Cmp(rdx, Factory::empty_string()); 7184 __ Cmp(rdx, Factory::empty_string());
7186 __ j(not_equal, &runtime); 7185 __ j(not_equal, &runtime);
7187 __ movq(rax, FieldOperand(rax, ConsString::kFirstOffset)); 7186 __ movq(rax, FieldOperand(rax, ConsString::kFirstOffset));
7188 __ movq(rbx, FieldOperand(rax, HeapObject::kMapOffset)); 7187 __ movq(rbx, FieldOperand(rax, HeapObject::kMapOffset));
7189 __ movzxbl(rbx, FieldOperand(rbx, Map::kInstanceTypeOffset)); 7188 __ movzxbl(rbx, FieldOperand(rbx, Map::kInstanceTypeOffset));
7190 ASSERT_EQ(0, kSeqStringTag); 7189 ASSERT_EQ(0, kSeqStringTag);
7191 __ testb(rbx, Immediate(kStringRepresentationMask)); 7190 __ testb(rbx, Immediate(kStringRepresentationMask));
7192 __ j(not_zero, &runtime); 7191 __ j(not_zero, &runtime);
7193 __ andb(rbx, Immediate(kStringRepresentationEncodingMask)); 7192 __ andb(rbx, Immediate(kStringRepresentationEncodingMask));
7194 7193
7195 __ bind(&seq_string); 7194 __ bind(&seq_string);
7196 // rax: subject string (sequential either ascii to two byte) 7195 // rax: subject string (sequential either ascii to two byte)
7197 // rbx: suject string type & kStringRepresentationEncodingMask 7196 // rbx: suject string type & kStringRepresentationEncodingMask
7198 // rcx: RegExp data (FixedArray) 7197 // rcx: RegExp data (FixedArray)
7199 // Check that the irregexp code has been generated for an ascii string. If 7198 // Check that the irregexp code has been generated for an ascii string. If
7200 // it has, the field contains a code object otherwise it contains the hole. 7199 // it has, the field contains a code object otherwise it contains the hole.
7201 __ cmpb(rbx, Immediate(kStringTag | kSeqStringTag | kTwoByteStringTag)); 7200 const int kSeqTwoByteString = kStringTag | kSeqStringTag | kTwoByteStringTag;
7201 __ cmpb(rbx, Immediate(kSeqTwoByteString));
7202 __ j(equal, &seq_two_byte_string); 7202 __ j(equal, &seq_two_byte_string);
7203 if (FLAG_debug_code) { 7203 if (FLAG_debug_code) {
7204 __ cmpb(rbx, Immediate(kStringTag | kSeqStringTag | kAsciiStringTag)); 7204 __ cmpb(rbx, Immediate(kStringTag | kSeqStringTag | kAsciiStringTag));
7205 __ Check(equal, "Expected sequential ascii string"); 7205 __ Check(equal, "Expected sequential ascii string");
7206 } 7206 }
7207 __ movq(r12, FieldOperand(rcx, JSRegExp::kDataAsciiCodeOffset)); 7207 __ movq(r12, FieldOperand(rcx, JSRegExp::kDataAsciiCodeOffset));
7208 __ Set(rdi, 1); // Type is ascii. 7208 __ Set(rdi, 1); // Type is ascii.
7209 __ jmp(&check_code); 7209 __ jmp(&check_code);
7210 7210
7211 __ bind(&seq_two_byte_string); 7211 __ bind(&seq_two_byte_string);
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
7317 __ j(equal, &success); 7317 __ j(equal, &success);
7318 Label failure; 7318 Label failure;
7319 __ cmpq(rax, Immediate(NativeRegExpMacroAssembler::FAILURE)); 7319 __ cmpq(rax, Immediate(NativeRegExpMacroAssembler::FAILURE));
7320 __ j(equal, &failure); 7320 __ j(equal, &failure);
7321 __ cmpq(rax, Immediate(NativeRegExpMacroAssembler::EXCEPTION)); 7321 __ cmpq(rax, Immediate(NativeRegExpMacroAssembler::EXCEPTION));
7322 // If not exception it can only be retry. Handle that in the runtime system. 7322 // If not exception it can only be retry. Handle that in the runtime system.
7323 __ j(not_equal, &runtime); 7323 __ j(not_equal, &runtime);
7324 // Result must now be exception. If there is no pending exception already a 7324 // Result must now be exception. If there is no pending exception already a
7325 // stack overflow (on the backtrack stack) was detected in RegExp code but 7325 // stack overflow (on the backtrack stack) was detected in RegExp code but
7326 // haven't created the exception yet. Handle that in the runtime system. 7326 // haven't created the exception yet. Handle that in the runtime system.
7327 // TODO(592) Rerunning the RegExp to get the stack overflow exception. 7327 // TODO(592): Rerunning the RegExp to get the stack overflow exception.
7328 ExternalReference pending_exception_address(Top::k_pending_exception_address); 7328 ExternalReference pending_exception_address(Top::k_pending_exception_address);
7329 __ movq(kScratchRegister, pending_exception_address); 7329 __ movq(kScratchRegister, pending_exception_address);
7330 __ Cmp(kScratchRegister, Factory::the_hole_value()); 7330 __ Cmp(kScratchRegister, Factory::the_hole_value());
7331 __ j(equal, &runtime); 7331 __ j(equal, &runtime);
7332 __ bind(&failure); 7332 __ bind(&failure);
7333 // For failure and exception return null. 7333 // For failure and exception return null.
7334 __ Move(rax, Factory::null_value()); 7334 __ Move(rax, Factory::null_value());
7335 __ ret(4 * kPointerSize); 7335 __ ret(4 * kPointerSize);
7336 7336
7337 // Load RegExp data. 7337 // Load RegExp data.
(...skipping 26 matching lines...) Expand all
7364 __ movq(rcx, rbx); 7364 __ movq(rcx, rbx);
7365 __ RecordWrite(rcx, RegExpImpl::kLastInputOffset, rax, rdi); 7365 __ RecordWrite(rcx, RegExpImpl::kLastInputOffset, rax, rdi);
7366 7366
7367 // Get the static offsets vector filled by the native regexp code. 7367 // Get the static offsets vector filled by the native regexp code.
7368 __ movq(rcx, ExternalReference::address_of_static_offsets_vector()); 7368 __ movq(rcx, ExternalReference::address_of_static_offsets_vector());
7369 7369
7370 // rbx: last_match_info backing store (FixedArray) 7370 // rbx: last_match_info backing store (FixedArray)
7371 // rcx: offsets vector 7371 // rcx: offsets vector
7372 // rdx: number of capture registers 7372 // rdx: number of capture registers
7373 Label next_capture, done; 7373 Label next_capture, done;
7374 __ movq(rax, Operand(rsp, kPreviousIndexOffset));
7375 // Capture register counter starts from number of capture registers and 7374 // Capture register counter starts from number of capture registers and
7376 // counts down until wraping after zero. 7375 // counts down until wraping after zero.
7377 __ bind(&next_capture); 7376 __ bind(&next_capture);
7378 __ subq(rdx, Immediate(1)); 7377 __ subq(rdx, Immediate(1));
7379 __ j(negative, &done); 7378 __ j(negative, &done);
7380 // Read the value from the static offsets vector buffer and make it a smi. 7379 // Read the value from the static offsets vector buffer and make it a smi.
7381 __ movl(rdi, Operand(rcx, rdx, times_int_size, 0)); 7380 __ movl(rdi, Operand(rcx, rdx, times_int_size, 0));
7382 __ Integer32ToSmi(rdi, rdi, &runtime); 7381 __ Integer32ToSmi(rdi, rdi, &runtime);
7383 // Store the smi value in the last match info. 7382 // Store the smi value in the last match info.
7384 __ movq(FieldOperand(rbx, 7383 __ movq(FieldOperand(rbx,
(...skipping 2781 matching lines...) Expand 10 before | Expand all | Expand 10 after
10166 // Call the function from C++. 10165 // Call the function from C++.
10167 return FUNCTION_CAST<ModuloFunction>(buffer); 10166 return FUNCTION_CAST<ModuloFunction>(buffer);
10168 } 10167 }
10169 10168
10170 #endif 10169 #endif
10171 10170
10172 10171
10173 #undef __ 10172 #undef __
10174 10173
10175 } } // namespace v8::internal 10174 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ia32/codegen-ia32.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698