Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: src/ia32/codegen-ia32.h

Issue 975001: Use untagged int32 values in evaluation of side-effect free expressions. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ia32/assembler-ia32-inl.h ('k') | src/ia32/codegen-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 // Accessors 350 // Accessors
351 inline bool is_eval(); 351 inline bool is_eval();
352 inline Scope* scope(); 352 inline Scope* scope();
353 353
354 // Generating deferred code. 354 // Generating deferred code.
355 void ProcessDeferred(); 355 void ProcessDeferred();
356 356
357 // State 357 // State
358 ControlDestination* destination() const { return state_->destination(); } 358 ControlDestination* destination() const { return state_->destination(); }
359 359
360 // Control of side-effect-free int32 expression compilation.
361 bool in_safe_int32_mode() { return in_safe_int32_mode_; }
362 void set_in_safe_int32_mode(bool value) { in_safe_int32_mode_ = value; }
363 bool safe_int32_mode_enabled() {
364 return FLAG_safe_int32_compiler && safe_int32_mode_enabled_;
365 }
366 void set_safe_int32_mode_enabled(bool value) {
367 safe_int32_mode_enabled_ = value;
368 }
369 void set_unsafe_bailout(BreakTarget* unsafe_bailout) {
370 unsafe_bailout_ = unsafe_bailout;
371 }
372
373 // Take the Result that is an untagged int32, and convert it to a tagged
374 // Smi or HeapNumber. Remove the untagged_int32 flag from the result.
375 void ConvertInt32ResultToNumber(Result* value);
376
360 // Track loop nesting level. 377 // Track loop nesting level.
361 int loop_nesting() const { return loop_nesting_; } 378 int loop_nesting() const { return loop_nesting_; }
362 void IncrementLoopNesting() { loop_nesting_++; } 379 void IncrementLoopNesting() { loop_nesting_++; }
363 void DecrementLoopNesting() { loop_nesting_--; } 380 void DecrementLoopNesting() { loop_nesting_--; }
364 381
365 // Node visitors. 382 // Node visitors.
366 void VisitStatements(ZoneList<Statement*>* statements); 383 void VisitStatements(ZoneList<Statement*>* statements);
367 384
368 #define DEF_VISIT(type) \ 385 #define DEF_VISIT(type) \
369 void Visit##type(type* node); 386 void Visit##type(type* node);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 423
407 Operand ContextSlotOperandCheckExtensions(Slot* slot, 424 Operand ContextSlotOperandCheckExtensions(Slot* slot,
408 Result tmp, 425 Result tmp,
409 JumpTarget* slow); 426 JumpTarget* slow);
410 427
411 // Expressions 428 // Expressions
412 static Operand GlobalObject() { 429 static Operand GlobalObject() {
413 return ContextOperand(esi, Context::GLOBAL_INDEX); 430 return ContextOperand(esi, Context::GLOBAL_INDEX);
414 } 431 }
415 432
416 void LoadCondition(Expression* x, 433 void LoadCondition(Expression* expr,
417 ControlDestination* destination, 434 ControlDestination* destination,
418 bool force_control); 435 bool force_control);
419 void Load(Expression* expr); 436 void Load(Expression* expr);
420 void LoadGlobal(); 437 void LoadGlobal();
421 void LoadGlobalReceiver(); 438 void LoadGlobalReceiver();
422 439
423 // Generate code to push the value of an expression on top of the frame 440 // Generate code to push the value of an expression on top of the frame
424 // and then spill the frame fully to memory. This function is used 441 // and then spill the frame fully to memory. This function is used
425 // temporarily while the code generator is being transformed. 442 // temporarily while the code generator is being transformed.
426 void LoadAndSpill(Expression* expression); 443 void LoadAndSpill(Expression* expression);
427 444
445 // Evaluate an expression and place its value on top of the frame,
446 // using, or not using, the side-effect-free expression compiler.
447 void LoadInSafeInt32Mode(Expression* expr, BreakTarget* unsafe_bailout);
448 void LoadWithSafeInt32ModeDisabled(Expression* expr);
449
428 // Read a value from a slot and leave it on top of the expression stack. 450 // Read a value from a slot and leave it on top of the expression stack.
429 Result LoadFromSlot(Slot* slot, TypeofState typeof_state); 451 Result LoadFromSlot(Slot* slot, TypeofState typeof_state);
430 Result LoadFromSlotCheckForArguments(Slot* slot, TypeofState typeof_state); 452 Result LoadFromSlotCheckForArguments(Slot* slot, TypeofState typeof_state);
431 Result LoadFromGlobalSlotCheckExtensions(Slot* slot, 453 Result LoadFromGlobalSlotCheckExtensions(Slot* slot,
432 TypeofState typeof_state, 454 TypeofState typeof_state,
433 JumpTarget* slow); 455 JumpTarget* slow);
434 456
435 // Store the value on top of the expression stack into a slot, leaving the 457 // Store the value on top of the expression stack into a slot, leaving the
436 // value in place. 458 // value in place.
437 void StoreToSlot(Slot* slot, InitState init_state); 459 void StoreToSlot(Slot* slot, InitState init_state);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 511
490 // Emit code to perform a binary operation on two likely smis. 512 // Emit code to perform a binary operation on two likely smis.
491 // The code to handle smi arguments is produced inline. 513 // The code to handle smi arguments is produced inline.
492 // Consumes the Results *left and *right. 514 // Consumes the Results *left and *right.
493 Result LikelySmiBinaryOperation(Token::Value op, 515 Result LikelySmiBinaryOperation(Token::Value op,
494 Result* left, 516 Result* left,
495 Result* right, 517 Result* right,
496 OverwriteMode overwrite_mode, 518 OverwriteMode overwrite_mode,
497 bool no_negative_zero); 519 bool no_negative_zero);
498 520
521
522 // Emit code to perform a binary operation on two untagged int32 values.
523 // The values are on top of the frame, and the result is pushed on the frame.
524 void Int32BinaryOperation(BinaryOperation* node);
525
526
499 void Comparison(AstNode* node, 527 void Comparison(AstNode* node,
500 Condition cc, 528 Condition cc,
501 bool strict, 529 bool strict,
502 ControlDestination* destination); 530 ControlDestination* destination);
503 531
504 // To prevent long attacker-controlled byte sequences, integer constants 532 // To prevent long attacker-controlled byte sequences, integer constants
505 // from the JavaScript source are loaded in two parts if they are larger 533 // from the JavaScript source are loaded in two parts if they are larger
506 // than 17 bits. 534 // than 17 bits.
507 static const int kMaxSmiInlinedBits = 17; 535 static const int kMaxSmiInlinedBits = 17;
508 bool IsUnsafeSmi(Handle<Object> value); 536 bool IsUnsafeSmi(Handle<Object> value);
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 // Assembler 663 // Assembler
636 MacroAssembler* masm_; // to generate code 664 MacroAssembler* masm_; // to generate code
637 665
638 CompilationInfo* info_; 666 CompilationInfo* info_;
639 667
640 // Code generation state 668 // Code generation state
641 VirtualFrame* frame_; 669 VirtualFrame* frame_;
642 RegisterAllocator* allocator_; 670 RegisterAllocator* allocator_;
643 CodeGenState* state_; 671 CodeGenState* state_;
644 int loop_nesting_; 672 int loop_nesting_;
673 bool in_safe_int32_mode_;
674 bool safe_int32_mode_enabled_;
645 675
646 // Jump targets. 676 // Jump targets.
647 // The target of the return from the function. 677 // The target of the return from the function.
648 BreakTarget function_return_; 678 BreakTarget function_return_;
679 // The target of the bailout from a side-effect-free int32 subexpression.
680 BreakTarget* unsafe_bailout_;
649 681
650 // True if the function return is shadowed (ie, jumping to the target 682 // True if the function return is shadowed (ie, jumping to the target
651 // function_return_ does not jump to the true function return, but rather 683 // function_return_ does not jump to the true function return, but rather
652 // to some unlinking code). 684 // to some unlinking code).
653 bool function_return_is_shadowed_; 685 bool function_return_is_shadowed_;
654 686
655 // True when we are in code that expects the virtual frame to be fully 687 // True when we are in code that expects the virtual frame to be fully
656 // spilled. Some virtual frame function are disabled in DEBUG builds when 688 // spilled. Some virtual frame function are disabled in DEBUG builds when
657 // called from spilled code, because they do not leave the virtual frame 689 // called from spilled code, because they do not leave the virtual frame
658 // in a spilled state. 690 // in a spilled state.
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 return ObjectBits::encode(object_.code()) | 1044 return ObjectBits::encode(object_.code()) |
1013 AddressBits::encode(addr_.code()) | 1045 AddressBits::encode(addr_.code()) |
1014 ScratchBits::encode(scratch_.code()); 1046 ScratchBits::encode(scratch_.code());
1015 } 1047 }
1016 }; 1048 };
1017 1049
1018 1050
1019 } } // namespace v8::internal 1051 } } // namespace v8::internal
1020 1052
1021 #endif // V8_IA32_CODEGEN_IA32_H_ 1053 #endif // V8_IA32_CODEGEN_IA32_H_
OLDNEW
« no previous file with comments | « src/ia32/assembler-ia32-inl.h ('k') | src/ia32/codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698