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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 | 124 |
125 | 125 |
126 void PositionInstr::Compile(MacroAssembler* masm) { | 126 void PositionInstr::Compile(MacroAssembler* masm) { |
127 if (FLAG_debug_info && pos_ != RelocInfo::kNoPosition) { | 127 if (FLAG_debug_info && pos_ != RelocInfo::kNoPosition) { |
128 __ RecordStatementPosition(pos_); | 128 __ RecordStatementPosition(pos_); |
129 __ RecordPosition(pos_); | 129 __ RecordPosition(pos_); |
130 } | 130 } |
131 } | 131 } |
132 | 132 |
133 | 133 |
| 134 void MoveInstr::Compile(MacroAssembler* masm) { |
| 135 location()->Move(masm, value()); |
| 136 } |
| 137 |
| 138 |
134 void BinaryOpInstr::Compile(MacroAssembler* masm) { | 139 void BinaryOpInstr::Compile(MacroAssembler* masm) { |
135 // The right-hand value should not be on the stack---if it is a | 140 // The right-hand value should not be on the stack---if it is a |
136 // compiler-generated temporary it is in the accumulator. | 141 // compiler-generated temporary it is in the accumulator. |
137 ASSERT(!val1_->is_on_stack()); | 142 ASSERT(!value1()->is_on_stack()); |
138 | 143 |
139 Comment cmnt(masm, "[ BinaryOpInstr"); | 144 Comment cmnt(masm, "[ BinaryOpInstr"); |
140 // We can overwrite one of the operands if it is a temporary. | 145 // We can overwrite one of the operands if it is a temporary. |
141 OverwriteMode mode = NO_OVERWRITE; | 146 OverwriteMode mode = NO_OVERWRITE; |
142 if (val0_->is_temporary()) { | 147 if (value0()->is_temporary()) { |
143 mode = OVERWRITE_LEFT; | 148 mode = OVERWRITE_LEFT; |
144 } else if (val1_->is_temporary()) { | 149 } else if (value1()->is_temporary()) { |
145 mode = OVERWRITE_RIGHT; | 150 mode = OVERWRITE_RIGHT; |
146 } | 151 } |
147 | 152 |
148 // Push both operands and call the specialized stub. | 153 // Push both operands and call the specialized stub. |
149 if (!val0_->is_on_stack()) { | 154 if (!value0()->is_on_stack()) { |
150 val0_->Push(masm); | 155 value0()->Push(masm); |
151 } | 156 } |
152 val1_->Push(masm); | 157 value1()->Push(masm); |
153 GenericBinaryOpStub stub(op_, mode, SMI_CODE_IN_STUB); | 158 GenericBinaryOpStub stub(op(), mode, SMI_CODE_IN_STUB); |
154 __ CallStub(&stub); | 159 __ CallStub(&stub); |
155 loc_->Set(masm, rax); | 160 location()->Set(masm, rax); |
156 } | 161 } |
157 | 162 |
158 | 163 |
159 void ReturnInstr::Compile(MacroAssembler* masm) { | 164 void ReturnInstr::Compile(MacroAssembler* masm) { |
160 // The location should be 'Effect'. As a side effect, move the value to | 165 // The location should be 'Effect'. As a side effect, move the value to |
161 // the accumulator. | 166 // the accumulator. |
162 Comment cmnt(masm, "[ ReturnInstr"); | 167 Comment cmnt(masm, "[ ReturnInstr"); |
163 value_->Get(masm, rax); | 168 value_->Get(masm, rax); |
164 } | 169 } |
165 | 170 |
(...skipping 18 matching lines...) Expand all Loading... |
184 const int kOffset = JavaScriptFrameConstants::kLocal0Offset; | 189 const int kOffset = JavaScriptFrameConstants::kLocal0Offset; |
185 return Operand(rbp, kOffset - loc->index() * kPointerSize); | 190 return Operand(rbp, kOffset - loc->index() * kPointerSize); |
186 } | 191 } |
187 default: | 192 default: |
188 UNREACHABLE(); | 193 UNREACHABLE(); |
189 return Operand(rax, 0); | 194 return Operand(rax, 0); |
190 } | 195 } |
191 } | 196 } |
192 | 197 |
193 | 198 |
| 199 void Constant::MoveToSlot(MacroAssembler* masm, SlotLocation* loc) { |
| 200 __ Move(ToOperand(loc), handle_); |
| 201 } |
| 202 |
| 203 |
194 void SlotLocation::Get(MacroAssembler* masm, Register reg) { | 204 void SlotLocation::Get(MacroAssembler* masm, Register reg) { |
195 __ movq(reg, ToOperand(this)); | 205 __ movq(reg, ToOperand(this)); |
196 } | 206 } |
197 | 207 |
198 | 208 |
199 void SlotLocation::Set(MacroAssembler* masm, Register reg) { | 209 void SlotLocation::Set(MacroAssembler* masm, Register reg) { |
200 __ movq(ToOperand(this), reg); | 210 __ movq(ToOperand(this), reg); |
201 } | 211 } |
202 | 212 |
203 | 213 |
| 214 void SlotLocation::Move(MacroAssembler* masm, Value* value) { |
| 215 // We dispatch to the value because in some cases (temp or constant) we |
| 216 // can use special instruction sequences. |
| 217 value->MoveToSlot(masm, this); |
| 218 } |
| 219 |
| 220 |
| 221 void SlotLocation::MoveToSlot(MacroAssembler* masm, SlotLocation* loc) { |
| 222 __ movq(kScratchRegister, ToOperand(this)); |
| 223 __ movq(ToOperand(loc), kScratchRegister); |
| 224 } |
| 225 |
| 226 |
204 void SlotLocation::Push(MacroAssembler* masm) { | 227 void SlotLocation::Push(MacroAssembler* masm) { |
205 __ push(ToOperand(this)); | 228 __ push(ToOperand(this)); |
206 } | 229 } |
207 | 230 |
208 | 231 |
209 void TempLocation::Get(MacroAssembler* masm, Register reg) { | 232 void TempLocation::Get(MacroAssembler* masm, Register reg) { |
210 switch (where_) { | 233 switch (where_) { |
211 case ACCUMULATOR: | 234 case ACCUMULATOR: |
212 if (!reg.is(rax)) __ movq(reg, rax); | 235 if (!reg.is(rax)) __ movq(reg, rax); |
213 break; | 236 break; |
214 case STACK: | 237 case STACK: |
215 __ pop(reg); | 238 __ pop(reg); |
216 break; | 239 break; |
217 case NOWHERE: | 240 case NOT_ALLOCATED: |
218 UNREACHABLE(); | 241 UNREACHABLE(); |
219 break; | |
220 } | 242 } |
221 } | 243 } |
222 | 244 |
223 | 245 |
224 void TempLocation::Set(MacroAssembler* masm, Register reg) { | 246 void TempLocation::Set(MacroAssembler* masm, Register reg) { |
225 switch (where_) { | 247 switch (where_) { |
226 case ACCUMULATOR: | 248 case ACCUMULATOR: |
227 if (!reg.is(rax)) __ movq(rax, reg); | 249 if (!reg.is(rax)) __ movq(rax, reg); |
228 break; | 250 break; |
229 case STACK: | 251 case STACK: |
230 __ push(reg); | 252 __ push(reg); |
231 break; | 253 break; |
232 case NOWHERE: | 254 case NOT_ALLOCATED: |
233 UNREACHABLE(); | 255 UNREACHABLE(); |
234 break; | |
235 } | 256 } |
236 } | 257 } |
237 | 258 |
238 | 259 |
239 void TempLocation::Push(MacroAssembler* masm) { | 260 void TempLocation::Push(MacroAssembler* masm) { |
240 switch (where_) { | 261 switch (where_) { |
241 case ACCUMULATOR: | 262 case ACCUMULATOR: |
242 __ push(rax); | 263 __ push(rax); |
243 break; | 264 break; |
244 case STACK: | 265 case STACK: |
245 case NOWHERE: | 266 case NOT_ALLOCATED: |
246 UNREACHABLE(); | 267 UNREACHABLE(); |
| 268 } |
| 269 } |
| 270 |
| 271 |
| 272 void TempLocation::Move(MacroAssembler* masm, Value* value) { |
| 273 switch (where_) { |
| 274 case ACCUMULATOR: |
| 275 value->Get(masm, rax); |
247 break; | 276 break; |
| 277 case STACK: |
| 278 value->Push(masm); |
| 279 break; |
| 280 case NOT_ALLOCATED: |
| 281 UNREACHABLE(); |
| 282 } |
| 283 } |
| 284 |
| 285 |
| 286 void TempLocation::MoveToSlot(MacroAssembler* masm, SlotLocation* loc) { |
| 287 switch (where_) { |
| 288 case ACCUMULATOR: |
| 289 __ movq(ToOperand(loc), rax); |
| 290 break; |
| 291 case STACK: |
| 292 __ pop(ToOperand(loc)); |
| 293 break; |
| 294 case NOT_ALLOCATED: |
| 295 UNREACHABLE(); |
248 } | 296 } |
249 } | 297 } |
250 | 298 |
251 | 299 |
252 #undef __ | 300 #undef __ |
253 | 301 |
254 } } // namespace v8::internal | 302 } } // namespace v8::internal |
OLD | NEW |