| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 private: | 230 private: |
| 231 static const int kForInStackElementCount = 5; | 231 static const int kForInStackElementCount = 5; |
| 232 DISALLOW_COPY_AND_ASSIGN(ForIn); | 232 DISALLOW_COPY_AND_ASSIGN(ForIn); |
| 233 }; | 233 }; |
| 234 | 234 |
| 235 enum Location { | 235 enum Location { |
| 236 kAccumulator, | 236 kAccumulator, |
| 237 kStack | 237 kStack |
| 238 }; | 238 }; |
| 239 | 239 |
| 240 enum ConstantOperand { |
| 241 kNoConstants, |
| 242 kLeftConstant, |
| 243 kRightConstant |
| 244 }; |
| 245 |
| 240 // Compute the frame pointer relative offset for a given local or | 246 // Compute the frame pointer relative offset for a given local or |
| 241 // parameter slot. | 247 // parameter slot. |
| 242 int SlotOffset(Slot* slot); | 248 int SlotOffset(Slot* slot); |
| 243 | 249 |
| 244 // Determine whether or not to inline the smi case for the given | 250 // Determine whether or not to inline the smi case for the given |
| 245 // operation. | 251 // operation. |
| 246 bool ShouldInlineSmiCase(Token::Value op); | 252 bool ShouldInlineSmiCase(Token::Value op); |
| 247 | 253 |
| 254 // Compute which (if any) of the operands is a compile-time constant. |
| 255 ConstantOperand GetConstantOperand(Token::Value op, |
| 256 Expression* left, |
| 257 Expression* right); |
| 258 |
| 248 // Emit code to convert a pure value (in a register, slot, as a literal, | 259 // Emit code to convert a pure value (in a register, slot, as a literal, |
| 249 // or on top of the stack) into the result expected according to an | 260 // or on top of the stack) into the result expected according to an |
| 250 // expression context. | 261 // expression context. |
| 251 void Apply(Expression::Context context, Register reg); | 262 void Apply(Expression::Context context, Register reg); |
| 252 | 263 |
| 253 // Slot cannot have type Slot::LOOKUP. | 264 // Slot cannot have type Slot::LOOKUP. |
| 254 void Apply(Expression::Context context, Slot* slot); | 265 void Apply(Expression::Context context, Slot* slot); |
| 255 | 266 |
| 256 void Apply(Expression::Context context, Literal* lit); | 267 void Apply(Expression::Context context, Literal* lit); |
| 257 void ApplyTOS(Expression::Context context); | 268 void ApplyTOS(Expression::Context context); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 FunctionLiteral* function); | 365 FunctionLiteral* function); |
| 355 | 366 |
| 356 // Platform-specific return sequence | 367 // Platform-specific return sequence |
| 357 void EmitReturnSequence(); | 368 void EmitReturnSequence(); |
| 358 | 369 |
| 359 // Platform-specific code sequences for calls | 370 // Platform-specific code sequences for calls |
| 360 void EmitCallWithStub(Call* expr); | 371 void EmitCallWithStub(Call* expr); |
| 361 void EmitCallWithIC(Call* expr, Handle<Object> name, RelocInfo::Mode mode); | 372 void EmitCallWithIC(Call* expr, Handle<Object> name, RelocInfo::Mode mode); |
| 362 void EmitKeyedCallWithIC(Call* expr, Expression* key, RelocInfo::Mode mode); | 373 void EmitKeyedCallWithIC(Call* expr, Expression* key, RelocInfo::Mode mode); |
| 363 | 374 |
| 364 | |
| 365 // Platform-specific code for inline runtime calls. | 375 // Platform-specific code for inline runtime calls. |
| 366 void EmitInlineRuntimeCall(CallRuntime* expr); | 376 void EmitInlineRuntimeCall(CallRuntime* expr); |
| 367 | 377 |
| 368 #define EMIT_INLINE_RUNTIME_CALL(name, x, y) \ | 378 #define EMIT_INLINE_RUNTIME_CALL(name, x, y) \ |
| 369 void Emit##name(ZoneList<Expression*>* arguments); | 379 void Emit##name(ZoneList<Expression*>* arguments); |
| 370 INLINE_RUNTIME_FUNCTION_LIST(EMIT_INLINE_RUNTIME_CALL) | 380 INLINE_RUNTIME_FUNCTION_LIST(EMIT_INLINE_RUNTIME_CALL) |
| 371 #undef EMIT_INLINE_RUNTIME_CALL | 381 #undef EMIT_INLINE_RUNTIME_CALL |
| 372 | 382 |
| 373 // Platform-specific code for loading variables. | 383 // Platform-specific code for loading variables. |
| 374 void EmitVariableLoad(Variable* expr, Expression::Context context); | 384 void EmitVariableLoad(Variable* expr, Expression::Context context); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 386 // Load a value from a keyed property. | 396 // Load a value from a keyed property. |
| 387 // The receiver and the key is left on the stack by the IC. | 397 // The receiver and the key is left on the stack by the IC. |
| 388 void EmitKeyedPropertyLoad(Property* expr); | 398 void EmitKeyedPropertyLoad(Property* expr); |
| 389 | 399 |
| 390 // Apply the compound assignment operator. Expects the left operand on top | 400 // Apply the compound assignment operator. Expects the left operand on top |
| 391 // of the stack and the right one in the accumulator. | 401 // of the stack and the right one in the accumulator. |
| 392 void EmitBinaryOp(Token::Value op, | 402 void EmitBinaryOp(Token::Value op, |
| 393 Expression::Context context, | 403 Expression::Context context, |
| 394 OverwriteMode mode); | 404 OverwriteMode mode); |
| 395 | 405 |
| 406 // Helper functions for generating inlined smi code for certain |
| 407 // binary operations. |
| 408 void EmitInlineSmiBinaryOp(Expression* expr, |
| 409 Token::Value op, |
| 410 Expression::Context context, |
| 411 OverwriteMode mode, |
| 412 Expression* left, |
| 413 Expression* right, |
| 414 ConstantOperand constant); |
| 415 |
| 416 void EmitConstantSmiBinaryOp(Expression* expr, |
| 417 Token::Value op, |
| 418 Expression::Context context, |
| 419 OverwriteMode mode, |
| 420 bool left_is_constant_smi, |
| 421 Smi* value); |
| 422 |
| 423 void EmitConstantSmiBitOp(Expression* expr, |
| 424 Token::Value op, |
| 425 Expression::Context context, |
| 426 OverwriteMode mode, |
| 427 Smi* value); |
| 428 |
| 429 void EmitConstantSmiShiftOp(Expression* expr, |
| 430 Token::Value op, |
| 431 Expression::Context context, |
| 432 OverwriteMode mode, |
| 433 Smi* value); |
| 434 |
| 435 void EmitConstantSmiAdd(Expression* expr, |
| 436 Expression::Context context, |
| 437 OverwriteMode mode, |
| 438 bool left_is_constant_smi, |
| 439 Smi* value); |
| 440 |
| 441 void EmitConstantSmiSub(Expression* expr, |
| 442 Expression::Context context, |
| 443 OverwriteMode mode, |
| 444 bool left_is_constant_smi, |
| 445 Smi* value); |
| 446 |
| 396 // Assign to the given expression as if via '='. The right-hand-side value | 447 // Assign to the given expression as if via '='. The right-hand-side value |
| 397 // is expected in the accumulator. | 448 // is expected in the accumulator. |
| 398 void EmitAssignment(Expression* expr); | 449 void EmitAssignment(Expression* expr); |
| 399 | 450 |
| 400 // Complete a variable assignment. The right-hand-side value is expected | 451 // Complete a variable assignment. The right-hand-side value is expected |
| 401 // in the accumulator. | 452 // in the accumulator. |
| 402 void EmitVariableAssignment(Variable* var, | 453 void EmitVariableAssignment(Variable* var, |
| 403 Token::Value op, | 454 Token::Value op, |
| 404 Expression::Context context); | 455 Expression::Context context); |
| 405 | 456 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 | 530 |
| 480 friend class NestedStatement; | 531 friend class NestedStatement; |
| 481 | 532 |
| 482 DISALLOW_COPY_AND_ASSIGN(FullCodeGenerator); | 533 DISALLOW_COPY_AND_ASSIGN(FullCodeGenerator); |
| 483 }; | 534 }; |
| 484 | 535 |
| 485 | 536 |
| 486 } } // namespace v8::internal | 537 } } // namespace v8::internal |
| 487 | 538 |
| 488 #endif // V8_FULL_CODEGEN_H_ | 539 #endif // V8_FULL_CODEGEN_H_ |
| OLD | NEW |