OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 1844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1855 context()->Plug(x0); | 1855 context()->Plug(x0); |
1856 } | 1856 } |
1857 } | 1857 } |
1858 | 1858 |
1859 | 1859 |
1860 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 1860 void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
1861 DCHECK(expr->target()->IsValidReferenceExpression()); | 1861 DCHECK(expr->target()->IsValidReferenceExpression()); |
1862 | 1862 |
1863 Comment cmnt(masm_, "[ Assignment"); | 1863 Comment cmnt(masm_, "[ Assignment"); |
1864 | 1864 |
1865 // Left-hand side can only be a property, a global or a (parameter or local) | |
1866 // slot. | |
1867 enum LhsKind { | |
1868 VARIABLE, | |
1869 NAMED_PROPERTY, | |
1870 KEYED_PROPERTY, | |
1871 NAMED_SUPER_PROPERTY | |
1872 }; | |
1873 LhsKind assign_type = VARIABLE; | |
1874 Property* property = expr->target()->AsProperty(); | 1865 Property* property = expr->target()->AsProperty(); |
1875 if (property != NULL) { | 1866 LhsKind assign_type = GetAssignType(property); |
1876 assign_type = (property->key()->IsPropertyName()) | |
1877 ? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY | |
1878 : NAMED_PROPERTY) | |
1879 : KEYED_PROPERTY; | |
1880 } | |
1881 | 1867 |
1882 // Evaluate LHS expression. | 1868 // Evaluate LHS expression. |
1883 switch (assign_type) { | 1869 switch (assign_type) { |
1884 case VARIABLE: | 1870 case VARIABLE: |
1885 // Nothing to do here. | 1871 // Nothing to do here. |
1886 break; | 1872 break; |
1887 case NAMED_PROPERTY: | 1873 case NAMED_PROPERTY: |
1888 if (expr->is_compound()) { | 1874 if (expr->is_compound()) { |
1889 // We need the receiver both on the stack and in the register. | 1875 // We need the receiver both on the stack and in the register. |
1890 VisitForStackValue(property->obj()); | 1876 VisitForStackValue(property->obj()); |
1891 __ Peek(LoadDescriptor::ReceiverRegister(), 0); | 1877 __ Peek(LoadDescriptor::ReceiverRegister(), 0); |
1892 } else { | 1878 } else { |
1893 VisitForStackValue(property->obj()); | 1879 VisitForStackValue(property->obj()); |
1894 } | 1880 } |
1895 break; | 1881 break; |
1896 case NAMED_SUPER_PROPERTY: | 1882 case NAMED_SUPER_PROPERTY: |
1897 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 1883 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
1898 EmitLoadHomeObject(property->obj()->AsSuperReference()); | 1884 EmitLoadHomeObject(property->obj()->AsSuperReference()); |
1899 __ Push(result_register()); | 1885 __ Push(result_register()); |
1900 if (expr->is_compound()) { | 1886 if (expr->is_compound()) { |
1901 const Register scratch = x10; | 1887 const Register scratch = x10; |
1902 __ Peek(scratch, kPointerSize); | 1888 __ Peek(scratch, kPointerSize); |
1903 __ Push(scratch, result_register()); | 1889 __ Push(scratch, result_register()); |
1904 } | 1890 } |
1905 break; | 1891 break; |
| 1892 case KEYED_SUPER_PROPERTY: |
| 1893 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1894 EmitLoadHomeObject(property->obj()->AsSuperReference()); |
| 1895 __ Push(result_register()); |
| 1896 VisitForAccumulatorValue(property->key()); |
| 1897 __ Push(result_register()); |
| 1898 if (expr->is_compound()) { |
| 1899 const Register scratch1 = x10; |
| 1900 const Register scratch2 = x11; |
| 1901 __ Peek(scratch1, 2 * kPointerSize); |
| 1902 __ Peek(scratch2, kPointerSize); |
| 1903 __ Push(scratch1, scratch2, result_register()); |
| 1904 } |
| 1905 break; |
1906 case KEYED_PROPERTY: | 1906 case KEYED_PROPERTY: |
1907 if (expr->is_compound()) { | 1907 if (expr->is_compound()) { |
1908 VisitForStackValue(property->obj()); | 1908 VisitForStackValue(property->obj()); |
1909 VisitForStackValue(property->key()); | 1909 VisitForStackValue(property->key()); |
1910 __ Peek(LoadDescriptor::ReceiverRegister(), 1 * kPointerSize); | 1910 __ Peek(LoadDescriptor::ReceiverRegister(), 1 * kPointerSize); |
1911 __ Peek(LoadDescriptor::NameRegister(), 0); | 1911 __ Peek(LoadDescriptor::NameRegister(), 0); |
1912 } else { | 1912 } else { |
1913 VisitForStackValue(property->obj()); | 1913 VisitForStackValue(property->obj()); |
1914 VisitForStackValue(property->key()); | 1914 VisitForStackValue(property->key()); |
1915 } | 1915 } |
(...skipping 10 matching lines...) Expand all Loading... |
1926 PrepareForBailout(expr->target(), TOS_REG); | 1926 PrepareForBailout(expr->target(), TOS_REG); |
1927 break; | 1927 break; |
1928 case NAMED_PROPERTY: | 1928 case NAMED_PROPERTY: |
1929 EmitNamedPropertyLoad(property); | 1929 EmitNamedPropertyLoad(property); |
1930 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1930 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1931 break; | 1931 break; |
1932 case NAMED_SUPER_PROPERTY: | 1932 case NAMED_SUPER_PROPERTY: |
1933 EmitNamedSuperPropertyLoad(property); | 1933 EmitNamedSuperPropertyLoad(property); |
1934 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1934 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1935 break; | 1935 break; |
| 1936 case KEYED_SUPER_PROPERTY: |
| 1937 EmitKeyedSuperPropertyLoad(property); |
| 1938 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1939 break; |
1936 case KEYED_PROPERTY: | 1940 case KEYED_PROPERTY: |
1937 EmitKeyedPropertyLoad(property); | 1941 EmitKeyedPropertyLoad(property); |
1938 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1942 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1939 break; | 1943 break; |
1940 } | 1944 } |
1941 } | 1945 } |
1942 | 1946 |
1943 Token::Value op = expr->binary_op(); | 1947 Token::Value op = expr->binary_op(); |
1944 __ Push(x0); // Left operand goes on the stack. | 1948 __ Push(x0); // Left operand goes on the stack. |
1945 VisitForAccumulatorValue(expr->value()); | 1949 VisitForAccumulatorValue(expr->value()); |
(...skipping 30 matching lines...) Expand all Loading... |
1976 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 1980 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
1977 context()->Plug(x0); | 1981 context()->Plug(x0); |
1978 break; | 1982 break; |
1979 case NAMED_PROPERTY: | 1983 case NAMED_PROPERTY: |
1980 EmitNamedPropertyAssignment(expr); | 1984 EmitNamedPropertyAssignment(expr); |
1981 break; | 1985 break; |
1982 case NAMED_SUPER_PROPERTY: | 1986 case NAMED_SUPER_PROPERTY: |
1983 EmitNamedSuperPropertyStore(property); | 1987 EmitNamedSuperPropertyStore(property); |
1984 context()->Plug(x0); | 1988 context()->Plug(x0); |
1985 break; | 1989 break; |
| 1990 case KEYED_SUPER_PROPERTY: |
| 1991 EmitKeyedSuperPropertyStore(property); |
| 1992 context()->Plug(x0); |
| 1993 break; |
1986 case KEYED_PROPERTY: | 1994 case KEYED_PROPERTY: |
1987 EmitKeyedPropertyAssignment(expr); | 1995 EmitKeyedPropertyAssignment(expr); |
1988 break; | 1996 break; |
1989 } | 1997 } |
1990 } | 1998 } |
1991 | 1999 |
1992 | 2000 |
1993 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { | 2001 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { |
1994 SetSourcePosition(prop->position()); | 2002 SetSourcePosition(prop->position()); |
1995 Literal* key = prop->key()->AsLiteral(); | 2003 Literal* key = prop->key()->AsLiteral(); |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2307 | 2315 |
2308 | 2316 |
2309 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 2317 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { |
2310 // Assignment to named property of super. | 2318 // Assignment to named property of super. |
2311 // x0 : value | 2319 // x0 : value |
2312 // stack : receiver ('this'), home_object | 2320 // stack : receiver ('this'), home_object |
2313 DCHECK(prop != NULL); | 2321 DCHECK(prop != NULL); |
2314 Literal* key = prop->key()->AsLiteral(); | 2322 Literal* key = prop->key()->AsLiteral(); |
2315 DCHECK(key != NULL); | 2323 DCHECK(key != NULL); |
2316 | 2324 |
| 2325 __ Push(key->value()); |
2317 __ Push(x0); | 2326 __ Push(x0); |
2318 __ Push(key->value()); | |
2319 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict | 2327 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict |
2320 : Runtime::kStoreToSuper_Sloppy), | 2328 : Runtime::kStoreToSuper_Sloppy), |
2321 4); | 2329 4); |
2322 } | 2330 } |
2323 | 2331 |
2324 | 2332 |
| 2333 void FullCodeGenerator::EmitKeyedSuperPropertyStore(Property* prop) { |
| 2334 // Assignment to named property of super. |
| 2335 // x0 : value |
| 2336 // stack : receiver ('this'), home_object, key |
| 2337 DCHECK(prop != NULL); |
| 2338 |
| 2339 __ Push(x0); |
| 2340 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreKeyedToSuper_Strict |
| 2341 : Runtime::kStoreKeyedToSuper_Sloppy), |
| 2342 4); |
| 2343 } |
| 2344 |
| 2345 |
2325 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2346 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
2326 ASM_LOCATION("FullCodeGenerator::EmitKeyedPropertyAssignment"); | 2347 ASM_LOCATION("FullCodeGenerator::EmitKeyedPropertyAssignment"); |
2327 // Assignment to a property, using a keyed store IC. | 2348 // Assignment to a property, using a keyed store IC. |
2328 | 2349 |
2329 // Record source code position before IC call. | 2350 // Record source code position before IC call. |
2330 SetSourcePosition(expr->position()); | 2351 SetSourcePosition(expr->position()); |
2331 // TODO(all): Could we pass this in registers rather than on the stack? | 2352 // TODO(all): Could we pass this in registers rather than on the stack? |
2332 __ Pop(StoreDescriptor::NameRegister(), StoreDescriptor::ReceiverRegister()); | 2353 __ Pop(StoreDescriptor::NameRegister(), StoreDescriptor::ReceiverRegister()); |
2333 DCHECK(StoreDescriptor::ValueRegister().is(x0)); | 2354 DCHECK(StoreDescriptor::ValueRegister().is(x0)); |
2334 | 2355 |
(...skipping 1753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4088 } | 4109 } |
4089 } | 4110 } |
4090 | 4111 |
4091 | 4112 |
4092 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { | 4113 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
4093 DCHECK(expr->expression()->IsValidReferenceExpression()); | 4114 DCHECK(expr->expression()->IsValidReferenceExpression()); |
4094 | 4115 |
4095 Comment cmnt(masm_, "[ CountOperation"); | 4116 Comment cmnt(masm_, "[ CountOperation"); |
4096 SetSourcePosition(expr->position()); | 4117 SetSourcePosition(expr->position()); |
4097 | 4118 |
4098 // Expression can only be a property, a global or a (parameter or local) | |
4099 // slot. | |
4100 enum LhsKind { | |
4101 VARIABLE, | |
4102 NAMED_PROPERTY, | |
4103 KEYED_PROPERTY, | |
4104 NAMED_SUPER_PROPERTY | |
4105 }; | |
4106 LhsKind assign_type = VARIABLE; | |
4107 Property* prop = expr->expression()->AsProperty(); | 4119 Property* prop = expr->expression()->AsProperty(); |
4108 // In case of a property we use the uninitialized expression context | 4120 LhsKind assign_type = GetAssignType(prop); |
4109 // of the key to detect a named property. | |
4110 if (prop != NULL) { | |
4111 assign_type = | |
4112 (prop->key()->IsPropertyName()) | |
4113 ? (prop->IsSuperAccess() ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) | |
4114 : KEYED_PROPERTY; | |
4115 } | |
4116 | 4121 |
4117 // Evaluate expression and get value. | 4122 // Evaluate expression and get value. |
4118 if (assign_type == VARIABLE) { | 4123 if (assign_type == VARIABLE) { |
4119 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 4124 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); |
4120 AccumulatorValueContext context(this); | 4125 AccumulatorValueContext context(this); |
4121 EmitVariableLoad(expr->expression()->AsVariableProxy()); | 4126 EmitVariableLoad(expr->expression()->AsVariableProxy()); |
4122 } else { | 4127 } else { |
4123 // Reserve space for result of postfix operation. | 4128 // Reserve space for result of postfix operation. |
4124 if (expr->is_postfix() && !context()->IsEffect()) { | 4129 if (expr->is_postfix() && !context()->IsEffect()) { |
4125 __ Push(xzr); | 4130 __ Push(xzr); |
4126 } | 4131 } |
4127 if (assign_type == NAMED_PROPERTY) { | 4132 switch (assign_type) { |
4128 // Put the object both on the stack and in the register. | 4133 case NAMED_PROPERTY: { |
4129 VisitForStackValue(prop->obj()); | 4134 // Put the object both on the stack and in the register. |
4130 __ Peek(LoadDescriptor::ReceiverRegister(), 0); | 4135 VisitForStackValue(prop->obj()); |
4131 EmitNamedPropertyLoad(prop); | 4136 __ Peek(LoadDescriptor::ReceiverRegister(), 0); |
4132 } else if (assign_type == NAMED_SUPER_PROPERTY) { | 4137 EmitNamedPropertyLoad(prop); |
4133 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); | 4138 break; |
4134 EmitLoadHomeObject(prop->obj()->AsSuperReference()); | 4139 } |
4135 __ Push(result_register()); | 4140 |
4136 const Register scratch = x10; | 4141 case NAMED_SUPER_PROPERTY: { |
4137 __ Peek(scratch, kPointerSize); | 4142 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
4138 __ Push(scratch, result_register()); | 4143 EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
4139 EmitNamedSuperPropertyLoad(prop); | 4144 __ Push(result_register()); |
4140 } else { | 4145 const Register scratch = x10; |
4141 // KEYED_PROPERTY | 4146 __ Peek(scratch, kPointerSize); |
4142 VisitForStackValue(prop->obj()); | 4147 __ Push(scratch, result_register()); |
4143 VisitForStackValue(prop->key()); | 4148 EmitNamedSuperPropertyLoad(prop); |
4144 __ Peek(LoadDescriptor::ReceiverRegister(), 1 * kPointerSize); | 4149 break; |
4145 __ Peek(LoadDescriptor::NameRegister(), 0); | 4150 } |
4146 EmitKeyedPropertyLoad(prop); | 4151 |
| 4152 case KEYED_SUPER_PROPERTY: { |
| 4153 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); |
| 4154 EmitLoadHomeObject(prop->obj()->AsSuperReference()); |
| 4155 __ Push(result_register()); |
| 4156 VisitForAccumulatorValue(prop->key()); |
| 4157 __ Push(result_register()); |
| 4158 const Register scratch1 = x10; |
| 4159 const Register scratch2 = x11; |
| 4160 __ Peek(scratch1, 2 * kPointerSize); |
| 4161 __ Peek(scratch2, kPointerSize); |
| 4162 __ Push(scratch1, scratch2, result_register()); |
| 4163 EmitKeyedSuperPropertyLoad(prop); |
| 4164 break; |
| 4165 } |
| 4166 |
| 4167 case KEYED_PROPERTY: { |
| 4168 VisitForStackValue(prop->obj()); |
| 4169 VisitForStackValue(prop->key()); |
| 4170 __ Peek(LoadDescriptor::ReceiverRegister(), 1 * kPointerSize); |
| 4171 __ Peek(LoadDescriptor::NameRegister(), 0); |
| 4172 EmitKeyedPropertyLoad(prop); |
| 4173 break; |
| 4174 } |
| 4175 |
| 4176 case VARIABLE: |
| 4177 UNREACHABLE(); |
4147 } | 4178 } |
4148 } | 4179 } |
4149 | 4180 |
4150 // We need a second deoptimization point after loading the value | 4181 // We need a second deoptimization point after loading the value |
4151 // in case evaluating the property load my have a side effect. | 4182 // in case evaluating the property load my have a side effect. |
4152 if (assign_type == VARIABLE) { | 4183 if (assign_type == VARIABLE) { |
4153 PrepareForBailout(expr->expression(), TOS_REG); | 4184 PrepareForBailout(expr->expression(), TOS_REG); |
4154 } else { | 4185 } else { |
4155 PrepareForBailoutForId(prop->LoadId(), TOS_REG); | 4186 PrepareForBailoutForId(prop->LoadId(), TOS_REG); |
4156 } | 4187 } |
(...skipping 19 matching lines...) Expand all Loading... |
4176 break; | 4207 break; |
4177 case NAMED_PROPERTY: | 4208 case NAMED_PROPERTY: |
4178 __ Poke(x0, kPointerSize); | 4209 __ Poke(x0, kPointerSize); |
4179 break; | 4210 break; |
4180 case NAMED_SUPER_PROPERTY: | 4211 case NAMED_SUPER_PROPERTY: |
4181 __ Poke(x0, kPointerSize * 2); | 4212 __ Poke(x0, kPointerSize * 2); |
4182 break; | 4213 break; |
4183 case KEYED_PROPERTY: | 4214 case KEYED_PROPERTY: |
4184 __ Poke(x0, kPointerSize * 2); | 4215 __ Poke(x0, kPointerSize * 2); |
4185 break; | 4216 break; |
| 4217 case KEYED_SUPER_PROPERTY: |
| 4218 __ Poke(x0, kPointerSize * 3); |
| 4219 break; |
4186 } | 4220 } |
4187 } | 4221 } |
4188 } | 4222 } |
4189 | 4223 |
4190 __ Adds(x0, x0, Smi::FromInt(count_value)); | 4224 __ Adds(x0, x0, Smi::FromInt(count_value)); |
4191 __ B(vc, &done); | 4225 __ B(vc, &done); |
4192 // Call stub. Undo operation first. | 4226 // Call stub. Undo operation first. |
4193 __ Sub(x0, x0, Smi::FromInt(count_value)); | 4227 __ Sub(x0, x0, Smi::FromInt(count_value)); |
4194 __ B(&stub_call); | 4228 __ B(&stub_call); |
4195 __ Bind(&slow); | 4229 __ Bind(&slow); |
(...skipping 13 matching lines...) Expand all Loading... |
4209 break; | 4243 break; |
4210 case NAMED_PROPERTY: | 4244 case NAMED_PROPERTY: |
4211 __ Poke(x0, kXRegSize); | 4245 __ Poke(x0, kXRegSize); |
4212 break; | 4246 break; |
4213 case NAMED_SUPER_PROPERTY: | 4247 case NAMED_SUPER_PROPERTY: |
4214 __ Poke(x0, 2 * kXRegSize); | 4248 __ Poke(x0, 2 * kXRegSize); |
4215 break; | 4249 break; |
4216 case KEYED_PROPERTY: | 4250 case KEYED_PROPERTY: |
4217 __ Poke(x0, 2 * kXRegSize); | 4251 __ Poke(x0, 2 * kXRegSize); |
4218 break; | 4252 break; |
| 4253 case KEYED_SUPER_PROPERTY: |
| 4254 __ Poke(x0, 3 * kXRegSize); |
| 4255 break; |
4219 } | 4256 } |
4220 } | 4257 } |
4221 } | 4258 } |
4222 | 4259 |
4223 __ Bind(&stub_call); | 4260 __ Bind(&stub_call); |
4224 __ Mov(x1, x0); | 4261 __ Mov(x1, x0); |
4225 __ Mov(x0, Smi::FromInt(count_value)); | 4262 __ Mov(x0, Smi::FromInt(count_value)); |
4226 | 4263 |
4227 // Record position before stub call. | 4264 // Record position before stub call. |
4228 SetSourcePosition(expr->position()); | 4265 SetSourcePosition(expr->position()); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4277 EmitNamedSuperPropertyStore(prop); | 4314 EmitNamedSuperPropertyStore(prop); |
4278 if (expr->is_postfix()) { | 4315 if (expr->is_postfix()) { |
4279 if (!context()->IsEffect()) { | 4316 if (!context()->IsEffect()) { |
4280 context()->PlugTOS(); | 4317 context()->PlugTOS(); |
4281 } | 4318 } |
4282 } else { | 4319 } else { |
4283 context()->Plug(x0); | 4320 context()->Plug(x0); |
4284 } | 4321 } |
4285 break; | 4322 break; |
4286 } | 4323 } |
| 4324 case KEYED_SUPER_PROPERTY: { |
| 4325 EmitKeyedSuperPropertyStore(prop); |
| 4326 if (expr->is_postfix()) { |
| 4327 if (!context()->IsEffect()) { |
| 4328 context()->PlugTOS(); |
| 4329 } |
| 4330 } else { |
| 4331 context()->Plug(x0); |
| 4332 } |
| 4333 break; |
| 4334 } |
4287 case KEYED_PROPERTY: { | 4335 case KEYED_PROPERTY: { |
4288 __ Pop(StoreDescriptor::NameRegister()); | 4336 __ Pop(StoreDescriptor::NameRegister()); |
4289 __ Pop(StoreDescriptor::ReceiverRegister()); | 4337 __ Pop(StoreDescriptor::ReceiverRegister()); |
4290 Handle<Code> ic = | 4338 Handle<Code> ic = |
4291 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 4339 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); |
4292 CallIC(ic, expr->CountStoreFeedbackId()); | 4340 CallIC(ic, expr->CountStoreFeedbackId()); |
4293 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4341 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
4294 if (expr->is_postfix()) { | 4342 if (expr->is_postfix()) { |
4295 if (!context()->IsEffect()) { | 4343 if (!context()->IsEffect()) { |
4296 context()->PlugTOS(); | 4344 context()->PlugTOS(); |
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5127 return previous_; | 5175 return previous_; |
5128 } | 5176 } |
5129 | 5177 |
5130 | 5178 |
5131 #undef __ | 5179 #undef __ |
5132 | 5180 |
5133 | 5181 |
5134 } } // namespace v8::internal | 5182 } } // namespace v8::internal |
5135 | 5183 |
5136 #endif // V8_TARGET_ARCH_ARM64 | 5184 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |