OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 void FastCodeGenerator::VisitExpressionStatement(ExpressionStatement* stmt) { | 107 void FastCodeGenerator::VisitExpressionStatement(ExpressionStatement* stmt) { |
108 Comment cmnt(masm_, "[ ExpressionStatement"); | 108 Comment cmnt(masm_, "[ ExpressionStatement"); |
109 SetStatementPosition(stmt); | 109 SetStatementPosition(stmt); |
110 Visit(stmt->expression()); | 110 Visit(stmt->expression()); |
111 } | 111 } |
112 | 112 |
113 | 113 |
114 void FastCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { | 114 void FastCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { |
115 Comment cmnt(masm_, "[ ReturnStatement"); | 115 Comment cmnt(masm_, "[ ReturnStatement"); |
116 SetStatementPosition(stmt); | 116 SetStatementPosition(stmt); |
117 Visit(stmt->expression()); | 117 Expression* expr = stmt->expression(); |
118 __ pop(r0); | 118 Visit(expr); |
| 119 |
| 120 // Complete the statement based on the location of the subexpression. |
| 121 Location source = expr->location(); |
| 122 ASSERT(!source.is_nowhere()); |
| 123 if (source.is_temporary()) { |
| 124 __ pop(r0); |
| 125 } else { |
| 126 ASSERT(source.is_constant()); |
| 127 ASSERT(expr->AsLiteral() != NULL); |
| 128 __ mov(r0, Operand(expr->AsLiteral()->handle())); |
| 129 } |
119 __ RecordJSReturn(); | 130 __ RecordJSReturn(); |
120 __ mov(sp, fp); | 131 __ mov(sp, fp); |
121 __ ldm(ia_w, sp, fp.bit() | lr.bit()); | 132 __ ldm(ia_w, sp, fp.bit() | lr.bit()); |
122 int num_parameters = function_->scope()->num_parameters(); | 133 int num_parameters = function_->scope()->num_parameters(); |
123 __ add(sp, sp, Operand((num_parameters + 1) * kPointerSize)); | 134 __ add(sp, sp, Operand((num_parameters + 1) * kPointerSize)); |
124 __ Jump(lr); | 135 __ Jump(lr); |
125 } | 136 } |
126 | 137 |
127 | 138 |
128 void FastCodeGenerator::VisitVariableProxy(VariableProxy* expr) { | 139 void FastCodeGenerator::VisitVariableProxy(VariableProxy* expr) { |
129 Comment cmnt(masm_, "[ VariableProxy"); | 140 Comment cmnt(masm_, "[ VariableProxy"); |
130 Expression* rewrite = expr->var()->rewrite(); | 141 Expression* rewrite = expr->var()->rewrite(); |
131 ASSERT(rewrite != NULL); | 142 ASSERT(rewrite != NULL); |
132 | 143 |
133 Slot* slot = rewrite->AsSlot(); | 144 Slot* slot = rewrite->AsSlot(); |
134 ASSERT(slot != NULL); | 145 ASSERT(slot != NULL); |
135 { Comment cmnt(masm_, "[ Slot"); | 146 { Comment cmnt(masm_, "[ Slot"); |
136 if (expr->location().is_temporary()) { | 147 if (expr->location().is_temporary()) { |
137 __ ldr(ip, MemOperand(fp, SlotOffset(slot))); | 148 __ ldr(ip, MemOperand(fp, SlotOffset(slot))); |
138 __ push(ip); | 149 __ push(ip); |
139 } else { | 150 } else { |
140 ASSERT(expr->location().is_nowhere()); | 151 ASSERT(expr->location().is_nowhere()); |
141 } | 152 } |
142 } | 153 } |
143 } | 154 } |
144 | 155 |
145 | 156 |
146 void FastCodeGenerator::VisitLiteral(Literal* expr) { | |
147 Comment cmnt(masm_, "[ Literal"); | |
148 if (expr->location().is_temporary()) { | |
149 __ mov(ip, Operand(expr->handle())); | |
150 __ push(ip); | |
151 } else { | |
152 ASSERT(expr->location().is_nowhere()); | |
153 } | |
154 } | |
155 | |
156 | |
157 void FastCodeGenerator::VisitAssignment(Assignment* expr) { | 157 void FastCodeGenerator::VisitAssignment(Assignment* expr) { |
158 Comment cmnt(masm_, "[ Assignment"); | 158 Comment cmnt(masm_, "[ Assignment"); |
159 ASSERT(expr->op() == Token::ASSIGN || expr->op() == Token::INIT_VAR); | 159 ASSERT(expr->op() == Token::ASSIGN || expr->op() == Token::INIT_VAR); |
| 160 Expression* rhs = expr->value(); |
| 161 Visit(rhs); |
160 | 162 |
161 Visit(expr->value()); | 163 // Left-hand side is always a (parameter or local) slot. |
162 | |
163 Variable* var = expr->target()->AsVariableProxy()->AsVariable(); | 164 Variable* var = expr->target()->AsVariableProxy()->AsVariable(); |
164 ASSERT(var != NULL && var->slot() != NULL); | 165 ASSERT(var != NULL && var->slot() != NULL); |
165 | 166 |
166 if (expr->location().is_temporary()) { | 167 // Complete the assignment based on the location of the right-hand-side |
167 __ ldr(ip, MemOperand(sp)); | 168 // value and the desired location of the assignment value. |
| 169 Location destination = expr->location(); |
| 170 Location source = rhs->location(); |
| 171 ASSERT(!destination.is_constant()); |
| 172 ASSERT(!source.is_nowhere()); |
| 173 |
| 174 if (source.is_temporary()) { |
| 175 if (destination.is_temporary()) { |
| 176 // Case 'temp1 <- (var = temp0)'. Preserve right-hand-side temporary |
| 177 // on the stack. |
| 178 __ ldr(ip, MemOperand(sp)); |
| 179 } else { |
| 180 ASSERT(destination.is_nowhere()); |
| 181 // Case 'var = temp'. Discard right-hand-side temporary. |
| 182 __ pop(ip); |
| 183 } |
| 184 __ str(ip, MemOperand(fp, SlotOffset(var->slot()))); |
168 } else { | 185 } else { |
169 ASSERT(expr->location().is_nowhere()); | 186 ASSERT(source.is_constant()); |
170 __ pop(ip); | 187 ASSERT(rhs->AsLiteral() != NULL); |
| 188 // Two cases: 'temp <- (var = constant)', or 'var = constant' with a |
| 189 // discarded result. Always perform the assignment. |
| 190 __ mov(ip, Operand(rhs->AsLiteral()->handle())); |
| 191 __ str(ip, MemOperand(fp, SlotOffset(var->slot()))); |
| 192 if (destination.is_temporary()) { |
| 193 // Case 'temp <- (var = constant)'. Save result. |
| 194 __ push(ip); |
| 195 } |
171 } | 196 } |
172 __ str(ip, MemOperand(fp, SlotOffset(var->slot()))); | |
173 } | 197 } |
174 | 198 |
175 | 199 |
176 } } // namespace v8::internal | 200 } } // namespace v8::internal |
OLD | NEW |