From eff42215f08259d9f1329818604866d5467522f7 Mon Sep 17 00:00:00 2001 From: ulan Date: Mon, 22 Dec 2014 05:38:05 -0800 Subject: [PATCH] Use weak cell in monomorphic KeyedStore IC. BUG=v8:3629 LOG=N Review URL: https://codereview.chromium.org/817873003 Cr-Commit-Position: refs/heads/master@{#25923} --- src/arm/macro-assembler-arm.cc | 14 ++++++-------- src/arm/macro-assembler-arm.h | 14 ++++++-------- src/arm64/macro-assembler-arm64.cc | 13 ++++++------- src/arm64/macro-assembler-arm64.h | 14 ++++++-------- src/ia32/macro-assembler-ia32.cc | 12 ++++++------ src/ia32/macro-assembler-ia32.h | 14 ++++++-------- src/ic/ic-compiler.cc | 5 ++++- src/mips/macro-assembler-mips.cc | 14 +++++++------- src/mips/macro-assembler-mips.h | 14 ++++++-------- src/mips64/macro-assembler-mips64.cc | 14 +++++++------- src/mips64/macro-assembler-mips64.h | 14 ++++++-------- src/x64/macro-assembler-x64.cc | 13 ++++++------- src/x64/macro-assembler-x64.h | 14 ++++++-------- src/x87/macro-assembler-x87.cc | 12 ++++++------ src/x87/macro-assembler-x87.h | 14 ++++++-------- 15 files changed, 90 insertions(+), 105 deletions(-) diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc index 2c798c1..0aa886b 100644 --- a/src/arm/macro-assembler-arm.cc +++ b/src/arm/macro-assembler-arm.cc @@ -2252,18 +2252,16 @@ void MacroAssembler::CheckMap(Register obj, } -void MacroAssembler::DispatchMap(Register obj, - Register scratch, - Handle map, - Handle success, - SmiCheckType smi_check_type) { +void MacroAssembler::DispatchWeakMap(Register obj, Register scratch1, + Register scratch2, Handle cell, + Handle success, + SmiCheckType smi_check_type) { Label fail; if (smi_check_type == DO_SMI_CHECK) { JumpIfSmi(obj, &fail); } - ldr(scratch, FieldMemOperand(obj, HeapObject::kMapOffset)); - mov(ip, Operand(map)); - cmp(scratch, ip); + ldr(scratch1, FieldMemOperand(obj, HeapObject::kMapOffset)); + CmpWeakValue(scratch1, cell, scratch2); Jump(success, RelocInfo::CODE_TARGET, eq); bind(&fail); } diff --git a/src/arm/macro-assembler-arm.h b/src/arm/macro-assembler-arm.h index 65f77fb..d83b64b 100644 --- a/src/arm/macro-assembler-arm.h +++ b/src/arm/macro-assembler-arm.h @@ -914,14 +914,12 @@ class MacroAssembler: public Assembler { SmiCheckType smi_check_type); - // Check if the map of an object is equal to a specified map and branch to a - // specified target if equal. Skip the smi check if not required (object is - // known to be a heap object) - void DispatchMap(Register obj, - Register scratch, - Handle map, - Handle success, - SmiCheckType smi_check_type); + // Check if the map of an object is equal to a specified weak map and branch + // to a specified target if equal. Skip the smi check if not required + // (object is known to be a heap object) + void DispatchWeakMap(Register obj, Register scratch1, Register scratch2, + Handle cell, Handle success, + SmiCheckType smi_check_type); // Compare the given value and the value of weak cell. void CmpWeakValue(Register value, Handle cell, Register scratch); diff --git a/src/arm64/macro-assembler-arm64.cc b/src/arm64/macro-assembler-arm64.cc index d359528..0253e7c 100644 --- a/src/arm64/macro-assembler-arm64.cc +++ b/src/arm64/macro-assembler-arm64.cc @@ -3788,17 +3788,16 @@ void MacroAssembler::CheckMap(Register obj_map, } -void MacroAssembler::DispatchMap(Register obj, - Register scratch, - Handle map, - Handle success, - SmiCheckType smi_check_type) { +void MacroAssembler::DispatchWeakMap(Register obj, Register scratch1, + Register scratch2, Handle cell, + Handle success, + SmiCheckType smi_check_type) { Label fail; if (smi_check_type == DO_SMI_CHECK) { JumpIfSmi(obj, &fail); } - Ldr(scratch, FieldMemOperand(obj, HeapObject::kMapOffset)); - Cmp(scratch, Operand(map)); + Ldr(scratch1, FieldMemOperand(obj, HeapObject::kMapOffset)); + CmpWeakValue(scratch1, cell, scratch2); B(ne, &fail); Jump(success, RelocInfo::CODE_TARGET); Bind(&fail); diff --git a/src/arm64/macro-assembler-arm64.h b/src/arm64/macro-assembler-arm64.h index 905d449..ee43589 100644 --- a/src/arm64/macro-assembler-arm64.h +++ b/src/arm64/macro-assembler-arm64.h @@ -1478,14 +1478,12 @@ class MacroAssembler : public Assembler { Label* fail, SmiCheckType smi_check_type); - // Check if the map of an object is equal to a specified map and branch to a - // specified target if equal. Skip the smi check if not required (object is - // known to be a heap object) - void DispatchMap(Register obj, - Register scratch, - Handle map, - Handle success, - SmiCheckType smi_check_type); + // Check if the map of an object is equal to a specified weak map and branch + // to a specified target if equal. Skip the smi check if not required + // (object is known to be a heap object) + void DispatchWeakMap(Register obj, Register scratch1, Register scratch2, + Handle cell, Handle success, + SmiCheckType smi_check_type); // Compare the given value and the value of weak cell. void CmpWeakValue(Register value, Handle cell, Register scratch); diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc index 41ac213..38259d7 100644 --- a/src/ia32/macro-assembler-ia32.cc +++ b/src/ia32/macro-assembler-ia32.cc @@ -740,16 +740,16 @@ void MacroAssembler::CheckMap(Register obj, } -void MacroAssembler::DispatchMap(Register obj, - Register unused, - Handle map, - Handle success, - SmiCheckType smi_check_type) { +void MacroAssembler::DispatchWeakMap(Register obj, Register scratch1, + Register scratch2, Handle cell, + Handle success, + SmiCheckType smi_check_type) { Label fail; if (smi_check_type == DO_SMI_CHECK) { JumpIfSmi(obj, &fail); } - cmp(FieldOperand(obj, HeapObject::kMapOffset), Immediate(map)); + mov(scratch1, FieldOperand(obj, HeapObject::kMapOffset)); + CmpWeakValue(scratch1, cell, scratch2); j(equal, success); bind(&fail); diff --git a/src/ia32/macro-assembler-ia32.h b/src/ia32/macro-assembler-ia32.h index d4f8f7b..83f6216 100644 --- a/src/ia32/macro-assembler-ia32.h +++ b/src/ia32/macro-assembler-ia32.h @@ -411,14 +411,12 @@ class MacroAssembler: public Assembler { Label* fail, SmiCheckType smi_check_type); - // Check if the map of an object is equal to a specified map and branch to a - // specified target if equal. Skip the smi check if not required (object is - // known to be a heap object) - void DispatchMap(Register obj, - Register unused, - Handle map, - Handle success, - SmiCheckType smi_check_type); + // Check if the map of an object is equal to a specified weak map and branch + // to a specified target if equal. Skip the smi check if not required + // (object is known to be a heap object) + void DispatchWeakMap(Register obj, Register scratch1, Register scratch2, + Handle cell, Handle success, + SmiCheckType smi_check_type); // Check if the object in register heap_object is a string. Afterwards the // register map contains the object map and the register instance_type diff --git a/src/ic/ic-compiler.cc b/src/ic/ic-compiler.cc index 3a17312..cdb7ea5 100644 --- a/src/ic/ic-compiler.cc +++ b/src/ic/ic-compiler.cc @@ -451,7 +451,10 @@ Handle PropertyICCompiler::CompileKeyedStoreMonomorphic( stub = StoreElementStub(isolate(), elements_kind).GetCode(); } - __ DispatchMap(receiver(), scratch1(), receiver_map, stub, DO_SMI_CHECK); + Handle cell = Map::WeakCellForMap(receiver_map); + + __ DispatchWeakMap(receiver(), scratch1(), scratch2(), cell, stub, + DO_SMI_CHECK); TailCallBuiltin(masm(), Builtins::kKeyedStoreIC_Miss); diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc index 78a583f..90c3499 100644 --- a/src/mips/macro-assembler-mips.cc +++ b/src/mips/macro-assembler-mips.cc @@ -3998,17 +3998,17 @@ void MacroAssembler::CheckMap(Register obj, } -void MacroAssembler::DispatchMap(Register obj, - Register scratch, - Handle map, - Handle success, - SmiCheckType smi_check_type) { +void MacroAssembler::DispatchWeakMap(Register obj, Register scratch1, + Register scratch2, Handle cell, + Handle success, + SmiCheckType smi_check_type) { Label fail; if (smi_check_type == DO_SMI_CHECK) { JumpIfSmi(obj, &fail); } - lw(scratch, FieldMemOperand(obj, HeapObject::kMapOffset)); - Jump(success, RelocInfo::CODE_TARGET, eq, scratch, Operand(map)); + lw(scratch1, FieldMemOperand(obj, HeapObject::kMapOffset)); + GetWeakValue(scratch2, cell); + Jump(success, RelocInfo::CODE_TARGET, eq, scratch1, Operand(scratch2)); bind(&fail); } diff --git a/src/mips/macro-assembler-mips.h b/src/mips/macro-assembler-mips.h index 7a2c209..0bc1e15 100644 --- a/src/mips/macro-assembler-mips.h +++ b/src/mips/macro-assembler-mips.h @@ -1080,14 +1080,12 @@ class MacroAssembler: public Assembler { Label* fail, SmiCheckType smi_check_type); - // Check if the map of an object is equal to a specified map and branch to a - // specified target if equal. Skip the smi check if not required (object is - // known to be a heap object) - void DispatchMap(Register obj, - Register scratch, - Handle map, - Handle success, - SmiCheckType smi_check_type); + // Check if the map of an object is equal to a specified weak map and branch + // to a specified target if equal. Skip the smi check if not required + // (object is known to be a heap object) + void DispatchWeakMap(Register obj, Register scratch1, Register scratch2, + Handle cell, Handle success, + SmiCheckType smi_check_type); // Get value of the weak cell. void GetWeakValue(Register value, Handle cell); diff --git a/src/mips64/macro-assembler-mips64.cc b/src/mips64/macro-assembler-mips64.cc index f04331d..2de1c2a 100644 --- a/src/mips64/macro-assembler-mips64.cc +++ b/src/mips64/macro-assembler-mips64.cc @@ -3965,17 +3965,17 @@ void MacroAssembler::CheckMap(Register obj, } -void MacroAssembler::DispatchMap(Register obj, - Register scratch, - Handle map, - Handle success, - SmiCheckType smi_check_type) { +void MacroAssembler::DispatchWeakMap(Register obj, Register scratch1, + Register scratch2, Handle cell, + Handle success, + SmiCheckType smi_check_type) { Label fail; if (smi_check_type == DO_SMI_CHECK) { JumpIfSmi(obj, &fail); } - ld(scratch, FieldMemOperand(obj, HeapObject::kMapOffset)); - Jump(success, RelocInfo::CODE_TARGET, eq, scratch, Operand(map)); + ld(scratch1, FieldMemOperand(obj, HeapObject::kMapOffset)); + GetWeakValue(scratch2, cell); + Jump(success, RelocInfo::CODE_TARGET, eq, scratch1, Operand(scratch2)); bind(&fail); } diff --git a/src/mips64/macro-assembler-mips64.h b/src/mips64/macro-assembler-mips64.h index 1cc3f95..a9e8772 100644 --- a/src/mips64/macro-assembler-mips64.h +++ b/src/mips64/macro-assembler-mips64.h @@ -1110,14 +1110,12 @@ class MacroAssembler: public Assembler { Label* fail, SmiCheckType smi_check_type); - // Check if the map of an object is equal to a specified map and branch to a - // specified target if equal. Skip the smi check if not required (object is - // known to be a heap object) - void DispatchMap(Register obj, - Register scratch, - Handle map, - Handle success, - SmiCheckType smi_check_type); + // Check if the map of an object is equal to a specified weak map and branch + // to a specified target if equal. Skip the smi check if not required + // (object is known to be a heap object) + void DispatchWeakMap(Register obj, Register scratch1, Register scratch2, + Handle cell, Handle success, + SmiCheckType smi_check_type); // Get value of the weak cell. void GetWeakValue(Register value, Handle cell); diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc index ba4e308..5b897de 100644 --- a/src/x64/macro-assembler-x64.cc +++ b/src/x64/macro-assembler-x64.cc @@ -3630,18 +3630,17 @@ void MacroAssembler::EnumLength(Register dst, Register map) { } -void MacroAssembler::DispatchMap(Register obj, - Register unused, - Handle map, - Handle success, - SmiCheckType smi_check_type) { +void MacroAssembler::DispatchWeakMap(Register obj, Register scratch1, + Register scratch2, Handle cell, + Handle success, + SmiCheckType smi_check_type) { Label fail; if (smi_check_type == DO_SMI_CHECK) { JumpIfSmi(obj, &fail); } - Cmp(FieldOperand(obj, HeapObject::kMapOffset), map); + movq(scratch1, FieldOperand(obj, HeapObject::kMapOffset)); + CmpWeakValue(scratch1, cell, scratch2); j(equal, success, RelocInfo::CODE_TARGET); - bind(&fail); } diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h index 82c047a..4656665 100644 --- a/src/x64/macro-assembler-x64.h +++ b/src/x64/macro-assembler-x64.h @@ -992,14 +992,12 @@ class MacroAssembler: public Assembler { Label* fail, SmiCheckType smi_check_type); - // Check if the map of an object is equal to a specified map and branch to a - // specified target if equal. Skip the smi check if not required (object is - // known to be a heap object) - void DispatchMap(Register obj, - Register unused, - Handle map, - Handle success, - SmiCheckType smi_check_type); + // Check if the map of an object is equal to a specified weak map and branch + // to a specified target if equal. Skip the smi check if not required + // (object is known to be a heap object) + void DispatchWeakMap(Register obj, Register scratch1, Register scratch2, + Handle cell, Handle success, + SmiCheckType smi_check_type); // Check if the object in register heap_object is a string. Afterwards the // register map contains the object map and the register instance_type diff --git a/src/x87/macro-assembler-x87.cc b/src/x87/macro-assembler-x87.cc index 9fa5c8e..008b2af 100644 --- a/src/x87/macro-assembler-x87.cc +++ b/src/x87/macro-assembler-x87.cc @@ -654,16 +654,16 @@ void MacroAssembler::CheckMap(Register obj, } -void MacroAssembler::DispatchMap(Register obj, - Register unused, - Handle map, - Handle success, - SmiCheckType smi_check_type) { +void MacroAssembler::DispatchWeakMap(Register obj, Register scratch1, + Register scratch2, Handle cell, + Handle success, + SmiCheckType smi_check_type) { Label fail; if (smi_check_type == DO_SMI_CHECK) { JumpIfSmi(obj, &fail); } - cmp(FieldOperand(obj, HeapObject::kMapOffset), Immediate(map)); + mov(scratch1, FieldOperand(obj, HeapObject::kMapOffset)); + CmpWeakValue(scratch1, cell, scratch2); j(equal, success); bind(&fail); diff --git a/src/x87/macro-assembler-x87.h b/src/x87/macro-assembler-x87.h index 16a323f..b797265 100644 --- a/src/x87/macro-assembler-x87.h +++ b/src/x87/macro-assembler-x87.h @@ -378,14 +378,12 @@ class MacroAssembler: public Assembler { Label* fail, SmiCheckType smi_check_type); - // Check if the map of an object is equal to a specified map and branch to a - // specified target if equal. Skip the smi check if not required (object is - // known to be a heap object) - void DispatchMap(Register obj, - Register unused, - Handle map, - Handle success, - SmiCheckType smi_check_type); + // Check if the map of an object is equal to a specified weak map and branch + // to a specified target if equal. Skip the smi check if not required + // (object is known to be a heap object) + void DispatchWeakMap(Register obj, Register scratch1, Register scratch2, + Handle cell, Handle success, + SmiCheckType smi_check_type); // Check if the object in register heap_object is a string. Afterwards the // register map contains the object map and the register instance_type -- 2.7.4