From e7efc885d406094b0c5e81d1ca601fff9ed240d0 Mon Sep 17 00:00:00 2001 From: "balazs.kilvady" Date: Wed, 3 Dec 2014 09:37:01 -0800 Subject: [PATCH] MIPS: CheckPrototypes uses weak cells to embed maps. Port 062a032f50291ce181462226ff41b4ef9b11deba BUG=v8:3629 LOG=N Review URL: https://codereview.chromium.org/777673002 Cr-Commit-Position: refs/heads/master@{#25645} --- src/ic/mips/handler-compiler-mips.cc | 13 ++++++++----- src/ic/mips64/handler-compiler-mips64.cc | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/ic/mips/handler-compiler-mips.cc b/src/ic/mips/handler-compiler-mips.cc index 8a7b6aa..2a8d3b8 100644 --- a/src/ic/mips/handler-compiler-mips.cc +++ b/src/ic/mips/handler-compiler-mips.cc @@ -412,11 +412,11 @@ Register PropertyHandlerCompiler::CheckPrototypes( __ lw(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset)); } else { Register map_reg = scratch1; + __ lw(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset)); if (depth != 1 || check == CHECK_ALL_MAPS) { - // CheckMap implicitly loads the map of |reg| into |map_reg|. - __ CheckMap(reg, map_reg, current_map, miss, DONT_DO_SMI_CHECK); - } else { - __ lw(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset)); + Handle cell = Map::WeakCellForMap(current_map); + __ CmpWeakValue(scratch2, map_reg, cell); + __ Branch(miss, ne, scratch2, Operand(zero_reg)); } // Check access rights to the global object. This has to happen after @@ -447,7 +447,10 @@ Register PropertyHandlerCompiler::CheckPrototypes( if (depth != 0 || check == CHECK_ALL_MAPS) { // Check the holder map. - __ CheckMap(reg, scratch1, current_map, miss, DONT_DO_SMI_CHECK); + __ lw(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset)); + Handle cell = Map::WeakCellForMap(current_map); + __ CmpWeakValue(scratch2, scratch1, cell); + __ Branch(miss, ne, scratch2, Operand(zero_reg)); } // Perform security check for access to the global object. diff --git a/src/ic/mips64/handler-compiler-mips64.cc b/src/ic/mips64/handler-compiler-mips64.cc index d659db2..5e626c3 100644 --- a/src/ic/mips64/handler-compiler-mips64.cc +++ b/src/ic/mips64/handler-compiler-mips64.cc @@ -412,11 +412,11 @@ Register PropertyHandlerCompiler::CheckPrototypes( __ ld(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset)); } else { Register map_reg = scratch1; + __ ld(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset)); if (depth != 1 || check == CHECK_ALL_MAPS) { - // CheckMap implicitly loads the map of |reg| into |map_reg|. - __ CheckMap(reg, map_reg, current_map, miss, DONT_DO_SMI_CHECK); - } else { - __ ld(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset)); + Handle cell = Map::WeakCellForMap(current_map); + __ CmpWeakValue(scratch2, map_reg, cell); + __ Branch(miss, ne, scratch2, Operand(zero_reg)); } // Check access rights to the global object. This has to happen after @@ -447,7 +447,10 @@ Register PropertyHandlerCompiler::CheckPrototypes( if (depth != 0 || check == CHECK_ALL_MAPS) { // Check the holder map. - __ CheckMap(reg, scratch1, current_map, miss, DONT_DO_SMI_CHECK); + __ ld(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset)); + Handle cell = Map::WeakCellForMap(current_map); + __ CmpWeakValue(scratch2, scratch1, cell); + __ Branch(miss, ne, scratch2, Operand(zero_reg)); } // Perform security check for access to the global object. -- 2.7.4