| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1028 | 1028 |
| 1029 __ cmp(r1, r0); | 1029 __ cmp(r1, r0); |
| 1030 __ b(ne, &next_test); | 1030 __ b(ne, &next_test); |
| 1031 __ Drop(1); // Switch value is no longer needed. | 1031 __ Drop(1); // Switch value is no longer needed. |
| 1032 __ b(clause->body_target()); | 1032 __ b(clause->body_target()); |
| 1033 __ bind(&slow_case); | 1033 __ bind(&slow_case); |
| 1034 } | 1034 } |
| 1035 | 1035 |
| 1036 // Record position before stub call for type feedback. | 1036 // Record position before stub call for type feedback. |
| 1037 SetSourcePosition(clause->position()); | 1037 SetSourcePosition(clause->position()); |
| 1038 Handle<Code> ic = CompareIC::GetUninitialized(Token::EQ_STRICT); | 1038 Handle<Code> ic = CompareIC::GetUninitialized(isolate(), Token::EQ_STRICT); |
| 1039 CallIC(ic, RelocInfo::CODE_TARGET, clause->CompareId()); | 1039 CallIC(ic, RelocInfo::CODE_TARGET, clause->CompareId()); |
| 1040 patch_site.EmitPatchInfo(); | 1040 patch_site.EmitPatchInfo(); |
| 1041 | 1041 |
| 1042 __ cmp(r0, Operand::Zero()); | 1042 __ cmp(r0, Operand::Zero()); |
| 1043 __ b(ne, &next_test); | 1043 __ b(ne, &next_test); |
| 1044 __ Drop(1); // Switch value is no longer needed. | 1044 __ Drop(1); // Switch value is no longer needed. |
| 1045 __ b(clause->body_target()); | 1045 __ b(clause->body_target()); |
| 1046 } | 1046 } |
| 1047 | 1047 |
| 1048 // Discard the test value and jump to the default if present, otherwise to | 1048 // Discard the test value and jump to the default if present, otherwise to |
| (...skipping 894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1943 __ pop(left); | 1943 __ pop(left); |
| 1944 | 1944 |
| 1945 // Perform combined smi check on both operands. | 1945 // Perform combined smi check on both operands. |
| 1946 __ orr(scratch1, left, Operand(right)); | 1946 __ orr(scratch1, left, Operand(right)); |
| 1947 STATIC_ASSERT(kSmiTag == 0); | 1947 STATIC_ASSERT(kSmiTag == 0); |
| 1948 JumpPatchSite patch_site(masm_); | 1948 JumpPatchSite patch_site(masm_); |
| 1949 patch_site.EmitJumpIfSmi(scratch1, &smi_case); | 1949 patch_site.EmitJumpIfSmi(scratch1, &smi_case); |
| 1950 | 1950 |
| 1951 __ bind(&stub_call); | 1951 __ bind(&stub_call); |
| 1952 BinaryOpStub stub(op, mode); | 1952 BinaryOpStub stub(op, mode); |
| 1953 CallIC(stub.GetCode(), RelocInfo::CODE_TARGET, | 1953 CallIC(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, |
| 1954 expr->BinaryOperationFeedbackId()); | 1954 expr->BinaryOperationFeedbackId()); |
| 1955 patch_site.EmitPatchInfo(); | 1955 patch_site.EmitPatchInfo(); |
| 1956 __ jmp(&done); | 1956 __ jmp(&done); |
| 1957 | 1957 |
| 1958 __ bind(&smi_case); | 1958 __ bind(&smi_case); |
| 1959 // Smi case. This code works the same way as the smi-smi case in the type | 1959 // Smi case. This code works the same way as the smi-smi case in the type |
| 1960 // recording binary operation stub, see | 1960 // recording binary operation stub, see |
| 1961 // BinaryOpStub::GenerateSmiSmiOperation for comments. | 1961 // BinaryOpStub::GenerateSmiSmiOperation for comments. |
| 1962 switch (op) { | 1962 switch (op) { |
| 1963 case Token::SAR: | 1963 case Token::SAR: |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2027 context()->Plug(r0); | 2027 context()->Plug(r0); |
| 2028 } | 2028 } |
| 2029 | 2029 |
| 2030 | 2030 |
| 2031 void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr, | 2031 void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr, |
| 2032 Token::Value op, | 2032 Token::Value op, |
| 2033 OverwriteMode mode) { | 2033 OverwriteMode mode) { |
| 2034 __ pop(r1); | 2034 __ pop(r1); |
| 2035 BinaryOpStub stub(op, mode); | 2035 BinaryOpStub stub(op, mode); |
| 2036 JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code. | 2036 JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code. |
| 2037 CallIC(stub.GetCode(), RelocInfo::CODE_TARGET, | 2037 CallIC(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, |
| 2038 expr->BinaryOperationFeedbackId()); | 2038 expr->BinaryOperationFeedbackId()); |
| 2039 patch_site.EmitPatchInfo(); | 2039 patch_site.EmitPatchInfo(); |
| 2040 context()->Plug(r0); | 2040 context()->Plug(r0); |
| 2041 } | 2041 } |
| 2042 | 2042 |
| 2043 | 2043 |
| 2044 void FullCodeGenerator::EmitAssignment(Expression* expr) { | 2044 void FullCodeGenerator::EmitAssignment(Expression* expr) { |
| 2045 // Invalid left-hand sides are rewritten by the parser to have a 'throw | 2045 // Invalid left-hand sides are rewritten by the parser to have a 'throw |
| 2046 // ReferenceError' on the left-hand side. | 2046 // ReferenceError' on the left-hand side. |
| 2047 if (!expr->IsValidLeftHandSide()) { | 2047 if (!expr->IsValidLeftHandSide()) { |
| (...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2529 | 2529 |
| 2530 // Record call targets in unoptimized code. | 2530 // Record call targets in unoptimized code. |
| 2531 Handle<Object> uninitialized = | 2531 Handle<Object> uninitialized = |
| 2532 TypeFeedbackCells::UninitializedSentinel(isolate()); | 2532 TypeFeedbackCells::UninitializedSentinel(isolate()); |
| 2533 Handle<JSGlobalPropertyCell> cell = | 2533 Handle<JSGlobalPropertyCell> cell = |
| 2534 isolate()->factory()->NewJSGlobalPropertyCell(uninitialized); | 2534 isolate()->factory()->NewJSGlobalPropertyCell(uninitialized); |
| 2535 RecordTypeFeedbackCell(expr->CallNewFeedbackId(), cell); | 2535 RecordTypeFeedbackCell(expr->CallNewFeedbackId(), cell); |
| 2536 __ mov(r2, Operand(cell)); | 2536 __ mov(r2, Operand(cell)); |
| 2537 | 2537 |
| 2538 CallConstructStub stub(RECORD_CALL_TARGET); | 2538 CallConstructStub stub(RECORD_CALL_TARGET); |
| 2539 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); | 2539 __ Call(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL); |
| 2540 PrepareForBailoutForId(expr->ReturnId(), TOS_REG); | 2540 PrepareForBailoutForId(expr->ReturnId(), TOS_REG); |
| 2541 context()->Plug(r0); | 2541 context()->Plug(r0); |
| 2542 } | 2542 } |
| 2543 | 2543 |
| 2544 | 2544 |
| 2545 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) { | 2545 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) { |
| 2546 ZoneList<Expression*>* args = expr->arguments(); | 2546 ZoneList<Expression*>* args = expr->arguments(); |
| 2547 ASSERT(args->length() == 1); | 2547 ASSERT(args->length() == 1); |
| 2548 | 2548 |
| 2549 VisitForAccumulatorValue(args->at(0)); | 2549 VisitForAccumulatorValue(args->at(0)); |
| (...skipping 1459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4009 // TODO(svenpanne): Allowing format strings in Comment would be nice here... | 4009 // TODO(svenpanne): Allowing format strings in Comment would be nice here... |
| 4010 Comment cmt(masm_, comment); | 4010 Comment cmt(masm_, comment); |
| 4011 bool can_overwrite = expr->expression()->ResultOverwriteAllowed(); | 4011 bool can_overwrite = expr->expression()->ResultOverwriteAllowed(); |
| 4012 UnaryOverwriteMode overwrite = | 4012 UnaryOverwriteMode overwrite = |
| 4013 can_overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE; | 4013 can_overwrite ? UNARY_OVERWRITE : UNARY_NO_OVERWRITE; |
| 4014 UnaryOpStub stub(expr->op(), overwrite); | 4014 UnaryOpStub stub(expr->op(), overwrite); |
| 4015 // UnaryOpStub expects the argument to be in the | 4015 // UnaryOpStub expects the argument to be in the |
| 4016 // accumulator register r0. | 4016 // accumulator register r0. |
| 4017 VisitForAccumulatorValue(expr->expression()); | 4017 VisitForAccumulatorValue(expr->expression()); |
| 4018 SetSourcePosition(expr->position()); | 4018 SetSourcePosition(expr->position()); |
| 4019 CallIC(stub.GetCode(), RelocInfo::CODE_TARGET, | 4019 CallIC(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, |
| 4020 expr->UnaryOperationFeedbackId()); | 4020 expr->UnaryOperationFeedbackId()); |
| 4021 context()->Plug(r0); | 4021 context()->Plug(r0); |
| 4022 } | 4022 } |
| 4023 | 4023 |
| 4024 | 4024 |
| 4025 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { | 4025 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
| 4026 Comment cmnt(masm_, "[ CountOperation"); | 4026 Comment cmnt(masm_, "[ CountOperation"); |
| 4027 SetSourcePosition(expr->position()); | 4027 SetSourcePosition(expr->position()); |
| 4028 | 4028 |
| 4029 // Invalid left-hand sides are rewritten to have a 'throw ReferenceError' | 4029 // Invalid left-hand sides are rewritten to have a 'throw ReferenceError' |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4122 // Call stub. Undo operation first. | 4122 // Call stub. Undo operation first. |
| 4123 __ sub(r0, r0, Operand(Smi::FromInt(count_value))); | 4123 __ sub(r0, r0, Operand(Smi::FromInt(count_value))); |
| 4124 } | 4124 } |
| 4125 __ mov(r1, r0); | 4125 __ mov(r1, r0); |
| 4126 __ mov(r0, Operand(Smi::FromInt(count_value))); | 4126 __ mov(r0, Operand(Smi::FromInt(count_value))); |
| 4127 | 4127 |
| 4128 // Record position before stub call. | 4128 // Record position before stub call. |
| 4129 SetSourcePosition(expr->position()); | 4129 SetSourcePosition(expr->position()); |
| 4130 | 4130 |
| 4131 BinaryOpStub stub(Token::ADD, NO_OVERWRITE); | 4131 BinaryOpStub stub(Token::ADD, NO_OVERWRITE); |
| 4132 CallIC(stub.GetCode(), RelocInfo::CODE_TARGET, expr->CountBinOpFeedbackId()); | 4132 CallIC(stub.GetCode(isolate()), |
| 4133 RelocInfo::CODE_TARGET, |
| 4134 expr->CountBinOpFeedbackId()); |
| 4133 patch_site.EmitPatchInfo(); | 4135 patch_site.EmitPatchInfo(); |
| 4134 __ bind(&done); | 4136 __ bind(&done); |
| 4135 | 4137 |
| 4136 // Store the value returned in r0. | 4138 // Store the value returned in r0. |
| 4137 switch (assign_type) { | 4139 switch (assign_type) { |
| 4138 case VARIABLE: | 4140 case VARIABLE: |
| 4139 if (expr->is_postfix()) { | 4141 if (expr->is_postfix()) { |
| 4140 { EffectContext context(this); | 4142 { EffectContext context(this); |
| 4141 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 4143 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), |
| 4142 Token::ASSIGN); | 4144 Token::ASSIGN); |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4357 Label slow_case; | 4359 Label slow_case; |
| 4358 __ orr(r2, r0, Operand(r1)); | 4360 __ orr(r2, r0, Operand(r1)); |
| 4359 patch_site.EmitJumpIfNotSmi(r2, &slow_case); | 4361 patch_site.EmitJumpIfNotSmi(r2, &slow_case); |
| 4360 __ cmp(r1, r0); | 4362 __ cmp(r1, r0); |
| 4361 Split(cond, if_true, if_false, NULL); | 4363 Split(cond, if_true, if_false, NULL); |
| 4362 __ bind(&slow_case); | 4364 __ bind(&slow_case); |
| 4363 } | 4365 } |
| 4364 | 4366 |
| 4365 // Record position and call the compare IC. | 4367 // Record position and call the compare IC. |
| 4366 SetSourcePosition(expr->position()); | 4368 SetSourcePosition(expr->position()); |
| 4367 Handle<Code> ic = CompareIC::GetUninitialized(op); | 4369 Handle<Code> ic = CompareIC::GetUninitialized(isolate(), op); |
| 4368 CallIC(ic, RelocInfo::CODE_TARGET, expr->CompareOperationFeedbackId()); | 4370 CallIC(ic, RelocInfo::CODE_TARGET, expr->CompareOperationFeedbackId()); |
| 4369 patch_site.EmitPatchInfo(); | 4371 patch_site.EmitPatchInfo(); |
| 4370 PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); | 4372 PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); |
| 4371 __ cmp(r0, Operand::Zero()); | 4373 __ cmp(r0, Operand::Zero()); |
| 4372 Split(cond, if_true, if_false, fall_through); | 4374 Split(cond, if_true, if_false, fall_through); |
| 4373 } | 4375 } |
| 4374 } | 4376 } |
| 4375 | 4377 |
| 4376 // Convert the result of the comparison into one expected for this | 4378 // Convert the result of the comparison into one expected for this |
| 4377 // expression's context. | 4379 // expression's context. |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4564 *context_length = 0; | 4566 *context_length = 0; |
| 4565 return previous_; | 4567 return previous_; |
| 4566 } | 4568 } |
| 4567 | 4569 |
| 4568 | 4570 |
| 4569 #undef __ | 4571 #undef __ |
| 4570 | 4572 |
| 4571 } } // namespace v8::internal | 4573 } } // namespace v8::internal |
| 4572 | 4574 |
| 4573 #endif // V8_TARGET_ARCH_ARM | 4575 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |