089acff6fe
+ switch from using system sqlite to the bundled one because they have many modifications that are needed + add a new mirror for the distfile because the google one is utterly slow
100 lines
4.4 KiB
Plaintext
100 lines
4.4 KiB
Plaintext
$OpenBSD: patch-v8_src_x64_code-stubs-x64_cc,v 1.2 2011/04/29 13:18:02 robert Exp $
|
|
--- v8/src/x64/code-stubs-x64.cc.orig Tue Apr 26 10:22:52 2011
|
|
+++ v8/src/x64/code-stubs-x64.cc Thu Apr 28 11:17:49 2011
|
|
@@ -2280,11 +2280,14 @@ void ArgumentsAccessStub::GenerateReadElement(MacroAss
|
|
Label slow;
|
|
__ JumpIfNotSmi(rdx, &slow);
|
|
|
|
- // Check if the calling frame is an arguments adaptor frame.
|
|
+ // Check if the calling frame is an arguments adaptor frame. We look at the
|
|
+ // context offset, and if the frame is not a regular one, then we find a
|
|
+ // Smi instead of the context. We can't use SmiCompare here, because that
|
|
+ // only works for comparing two smis.
|
|
Label adaptor;
|
|
__ movq(rbx, Operand(rbp, StandardFrameConstants::kCallerFPOffset));
|
|
- __ SmiCompare(Operand(rbx, StandardFrameConstants::kContextOffset),
|
|
- Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
|
|
+ __ Cmp(Operand(rbx, StandardFrameConstants::kContextOffset),
|
|
+ Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
|
|
__ j(equal, &adaptor);
|
|
|
|
// Check index against formal parameters count limit passed in
|
|
@@ -2339,8 +2342,8 @@ void ArgumentsAccessStub::GenerateNewObject(MacroAssem
|
|
// Check if the calling frame is an arguments adaptor frame.
|
|
Label adaptor_frame, try_allocate, runtime;
|
|
__ movq(rdx, Operand(rbp, StandardFrameConstants::kCallerFPOffset));
|
|
- __ SmiCompare(Operand(rdx, StandardFrameConstants::kContextOffset),
|
|
- Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
|
|
+ __ Cmp(Operand(rdx, StandardFrameConstants::kContextOffset),
|
|
+ Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
|
|
__ j(equal, &adaptor_frame);
|
|
|
|
// Get the length from the frame.
|
|
@@ -4118,8 +4121,8 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
|
// Look at the length of the result of adding the two strings.
|
|
STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue / 2);
|
|
__ SmiAdd(rbx, rbx, rcx);
|
|
- // Use the runtime system when adding two one character strings, as it
|
|
- // contains optimizations for this specific case using the symbol table.
|
|
+ // Use the symbol table when adding two one character strings, as it
|
|
+ // helps later optimizations to return a symbol here.
|
|
__ SmiCompare(rbx, Smi::FromInt(2));
|
|
__ j(not_equal, &longer_than_two);
|
|
|
|
@@ -4471,15 +4474,14 @@ void StringHelper::GenerateTwoCharacterSymbolTableProb
|
|
FieldOperand(symbol_table, SymbolTable::kCapacityOffset));
|
|
__ decl(mask);
|
|
|
|
- Register undefined = scratch4;
|
|
- __ LoadRoot(undefined, Heap::kUndefinedValueRootIndex);
|
|
+ Register map = scratch4;
|
|
|
|
// Registers
|
|
// chars: two character string, char 1 in byte 0 and char 2 in byte 1.
|
|
// hash: hash of two character string (32-bit int)
|
|
// symbol_table: symbol table
|
|
// mask: capacity mask (32-bit int)
|
|
- // undefined: undefined value
|
|
+ // map: -
|
|
// scratch: -
|
|
|
|
// Perform a number of probes in the symbol table.
|
|
@@ -4494,7 +4496,7 @@ void StringHelper::GenerateTwoCharacterSymbolTableProb
|
|
}
|
|
__ andl(scratch, mask);
|
|
|
|
- // Load the entry from the symble table.
|
|
+ // Load the entry from the symbol table.
|
|
Register candidate = scratch; // Scratch register contains candidate.
|
|
STATIC_ASSERT(SymbolTable::kEntrySize == 1);
|
|
__ movq(candidate,
|
|
@@ -4504,9 +4506,17 @@ void StringHelper::GenerateTwoCharacterSymbolTableProb
|
|
SymbolTable::kElementsStartOffset));
|
|
|
|
// If entry is undefined no string with this hash can be found.
|
|
- __ cmpq(candidate, undefined);
|
|
+ NearLabel is_string;
|
|
+ __ CmpObjectType(candidate, ODDBALL_TYPE, map);
|
|
+ __ j(not_equal, &is_string);
|
|
+
|
|
+ __ CompareRoot(candidate, Heap::kUndefinedValueRootIndex);
|
|
__ j(equal, not_found);
|
|
+ // Must be null (deleted entry).
|
|
+ __ jmp(&next_probe[i]);
|
|
|
|
+ __ bind(&is_string);
|
|
+
|
|
// If length is not 2 the string is not a candidate.
|
|
__ SmiCompare(FieldOperand(candidate, String::kLengthOffset),
|
|
Smi::FromInt(2));
|
|
@@ -4517,8 +4527,7 @@ void StringHelper::GenerateTwoCharacterSymbolTableProb
|
|
Register temp = kScratchRegister;
|
|
|
|
// Check that the candidate is a non-external ascii string.
|
|
- __ movq(temp, FieldOperand(candidate, HeapObject::kMapOffset));
|
|
- __ movzxbl(temp, FieldOperand(temp, Map::kInstanceTypeOffset));
|
|
+ __ movzxbl(temp, FieldOperand(map, Map::kInstanceTypeOffset));
|
|
__ JumpIfInstanceTypeIsNotSequentialAscii(
|
|
temp, temp, &next_probe[i]);
|
|
|