| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 2743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2754 Label next, fall_through, default_case; | 2754 Label next, fall_through, default_case; |
| 2755 ZoneList<CaseClause*>* cases = node->cases(); | 2755 ZoneList<CaseClause*>* cases = node->cases(); |
| 2756 int length = cases->length(); | 2756 int length = cases->length(); |
| 2757 | 2757 |
| 2758 for (int i = 0; i < length; i++) { | 2758 for (int i = 0; i < length; i++) { |
| 2759 CaseClause* clause = cases->at(i); | 2759 CaseClause* clause = cases->at(i); |
| 2760 | 2760 |
| 2761 Comment cmnt(masm_, "[ case clause"); | 2761 Comment cmnt(masm_, "[ case clause"); |
| 2762 | 2762 |
| 2763 if (clause->is_default()) { | 2763 if (clause->is_default()) { |
| 2764 // Continue matching cases. The program will execute the default case's |
| 2765 // statements if it does not match any of the cases. |
| 2766 __ b(&next); |
| 2767 |
| 2764 // Bind the default case label, so we can branch to it when we | 2768 // Bind the default case label, so we can branch to it when we |
| 2765 // have compared against all other cases. | 2769 // have compared against all other cases. |
| 2766 ASSERT(default_case.is_unused()); // at most one default clause | 2770 ASSERT(default_case.is_unused()); // at most one default clause |
| 2767 | 2771 __ bind(&default_case); |
| 2768 // If the default case is the first (but not only) case, we have | |
| 2769 // to jump past it for now. Once we're done with the remaining | |
| 2770 // clauses, we'll branch back here. If it isn't the first case, | |
| 2771 // we jump past it by avoiding to chain it into the next chain. | |
| 2772 if (length > 1) { | |
| 2773 if (i == 0) __ b(&next); | |
| 2774 __ bind(&default_case); | |
| 2775 } | |
| 2776 | |
| 2777 } else { | 2772 } else { |
| 2778 __ bind(&next); | 2773 __ bind(&next); |
| 2779 next.Unuse(); | 2774 next.Unuse(); |
| 2780 __ ldr(r0, MemOperand(sp, 0)); | 2775 __ ldr(r0, MemOperand(sp, 0)); |
| 2781 __ push(r0); // duplicate TOS | 2776 __ push(r0); // duplicate TOS |
| 2782 Load(clause->label()); | 2777 Load(clause->label()); |
| 2783 Comparison(eq, true); | 2778 Comparison(eq, true); |
| 2784 Branch(false, &next); | 2779 Branch(false, &next); |
| 2785 // Entering the case statement -> remove the switch value from the stack | |
| 2786 __ pop(r0); | |
| 2787 } | 2780 } |
| 2788 | 2781 |
| 2782 // Entering the case statement for the first time. Remove the switch value |
| 2783 // from the stack. |
| 2784 __ pop(r0); |
| 2785 |
| 2789 // Generate code for the body. | 2786 // Generate code for the body. |
| 2787 // This is also the target for the fall through from the previous case's |
| 2788 // statements which has to skip over the matching code and the popping of |
| 2789 // the switch value. |
| 2790 __ bind(&fall_through); | 2790 __ bind(&fall_through); |
| 2791 fall_through.Unuse(); | 2791 fall_through.Unuse(); |
| 2792 VisitStatements(clause->statements()); | 2792 VisitStatements(clause->statements()); |
| 2793 __ b(&fall_through); | 2793 __ b(&fall_through); |
| 2794 } | 2794 } |
| 2795 | 2795 |
| 2796 __ bind(&next); | 2796 __ bind(&next); |
| 2797 // Reached the end of the case statements -> remove the switch value | 2797 // Reached the end of the case statements without matching any of the cases. |
| 2798 // from the stack. | 2798 if (default_case.is_bound()) { |
| 2799 __ pop(r0); // __ Pop(no_reg) | 2799 // A default case exists -> execute its statements. |
| 2800 if (default_case.is_bound()) __ b(&default_case); | 2800 __ b(&default_case); |
| 2801 | 2801 } else { |
| 2802 // Remove the switch value from the stack. |
| 2803 __ pop(r0); |
| 2804 } |
| 2805 |
| 2802 __ bind(&fall_through); | 2806 __ bind(&fall_through); |
| 2803 __ bind(node->break_target()); | 2807 __ bind(node->break_target()); |
| 2804 } | 2808 } |
| 2805 | 2809 |
| 2806 | 2810 |
| 2807 void ArmCodeGenerator::VisitLoopStatement(LoopStatement* node) { | 2811 void ArmCodeGenerator::VisitLoopStatement(LoopStatement* node) { |
| 2808 Comment cmnt(masm_, "[ LoopStatement"); | 2812 Comment cmnt(masm_, "[ LoopStatement"); |
| 2809 if (FLAG_debug_info) RecordStatementPosition(node); | 2813 if (FLAG_debug_info) RecordStatementPosition(node); |
| 2810 node->set_break_stack_height(break_stack_height_); | 2814 node->set_break_stack_height(break_stack_height_); |
| 2811 | 2815 |
| (...skipping 1766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4578 bool is_eval) { | 4582 bool is_eval) { |
| 4579 Handle<Code> code = ArmCodeGenerator::MakeCode(fun, script, is_eval); | 4583 Handle<Code> code = ArmCodeGenerator::MakeCode(fun, script, is_eval); |
| 4580 if (!code.is_null()) { | 4584 if (!code.is_null()) { |
| 4581 Counters::total_compiled_code_size.Increment(code->instruction_size()); | 4585 Counters::total_compiled_code_size.Increment(code->instruction_size()); |
| 4582 } | 4586 } |
| 4583 return code; | 4587 return code; |
| 4584 } | 4588 } |
| 4585 | 4589 |
| 4586 | 4590 |
| 4587 } } // namespace v8::internal | 4591 } } // namespace v8::internal |
| OLD | NEW |