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

Side by Side Diff: src/x64/macro-assembler-x64.h

Issue 2885018: X64: Added register holding Smi::FromInt(1). (Closed)
Patch Set: Addressed review comments Created 10 years, 5 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
« no previous file with comments | « src/x64/frames-x64.h ('k') | src/x64/macro-assembler-x64.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 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 29 matching lines...) Expand all
40 // Return the pointer to the allocated already tagged as a heap object. 40 // Return the pointer to the allocated already tagged as a heap object.
41 TAG_OBJECT = 1 << 0, 41 TAG_OBJECT = 1 << 0,
42 // The content of the result register already contains the allocation top in 42 // The content of the result register already contains the allocation top in
43 // new space. 43 // new space.
44 RESULT_CONTAINS_TOP = 1 << 1 44 RESULT_CONTAINS_TOP = 1 << 1
45 }; 45 };
46 46
47 // Default scratch register used by MacroAssembler (and other code that needs 47 // Default scratch register used by MacroAssembler (and other code that needs
48 // a spare register). The register isn't callee save, and not used by the 48 // a spare register). The register isn't callee save, and not used by the
49 // function calling convention. 49 // function calling convention.
50 static const Register kScratchRegister = { 10 }; // r10. 50 static const Register kScratchRegister = { 10 }; // r10.
51 static const Register kRootRegister = { 13 }; // r13 51 static const Register kSmiConstantRegister = { 15 }; // r15 (callee save).
52 static const Register kRootRegister = { 13 }; // r13 (callee save).
53 // Value of smi in kSmiConstantRegister.
54 static const int kSmiConstantRegisterValue = 1;
52 55
53 // Convenience for platform-independent signatures. 56 // Convenience for platform-independent signatures.
54 typedef Operand MemOperand; 57 typedef Operand MemOperand;
55 58
56 // Forward declaration. 59 // Forward declaration.
57 class JumpTarget; 60 class JumpTarget;
58 61
59 struct SmiIndex { 62 struct SmiIndex {
60 SmiIndex(Register index_register, ScaleFactor scale) 63 SmiIndex(Register index_register, ScaleFactor scale)
61 : reg(index_register), 64 : reg(index_register),
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 // the unresolved list if the name does not resolve. 198 // the unresolved list if the name does not resolve.
196 void InvokeBuiltin(Builtins::JavaScript id, InvokeFlag flag); 199 void InvokeBuiltin(Builtins::JavaScript id, InvokeFlag flag);
197 200
198 // Store the code object for the given builtin in the target register. 201 // Store the code object for the given builtin in the target register.
199 void GetBuiltinEntry(Register target, Builtins::JavaScript id); 202 void GetBuiltinEntry(Register target, Builtins::JavaScript id);
200 203
201 204
202 // --------------------------------------------------------------------------- 205 // ---------------------------------------------------------------------------
203 // Smi tagging, untagging and operations on tagged smis. 206 // Smi tagging, untagging and operations on tagged smis.
204 207
208 void InitializeSmiConstantRegister() {
209 movq(kSmiConstantRegister,
210 reinterpret_cast<uint64_t>(Smi::FromInt(kSmiConstantRegisterValue)),
211 RelocInfo::NONE);
212 }
213
205 // Conversions between tagged smi values and non-tagged integer values. 214 // Conversions between tagged smi values and non-tagged integer values.
206 215
207 // Tag an integer value. The result must be known to be a valid smi value. 216 // Tag an integer value. The result must be known to be a valid smi value.
208 // Only uses the low 32 bits of the src register. Sets the N and Z flags 217 // Only uses the low 32 bits of the src register. Sets the N and Z flags
209 // based on the value of the resulting integer. 218 // based on the value of the resulting integer.
210 void Integer32ToSmi(Register dst, Register src); 219 void Integer32ToSmi(Register dst, Register src);
211 220
212 // Tag an integer value if possible, or jump the integer value cannot be 221 // Tag an integer value if possible, or jump the integer value cannot be
213 // represented as a smi. Only uses the low 32 bit of the src registers. 222 // represented as a smi. Only uses the low 32 bit of the src registers.
214 // NOTICE: Destroys the dst register even if unsuccessful! 223 // NOTICE: Destroys the dst register even if unsuccessful!
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 // The returned index register may be either src or dst, depending 471 // The returned index register may be either src or dst, depending
463 // on what is most efficient. If src and dst are different registers, 472 // on what is most efficient. If src and dst are different registers,
464 // src is always unchanged. 473 // src is always unchanged.
465 SmiIndex SmiToIndex(Register dst, Register src, int shift); 474 SmiIndex SmiToIndex(Register dst, Register src, int shift);
466 475
467 // Converts a positive smi to a negative index. 476 // Converts a positive smi to a negative index.
468 SmiIndex SmiToNegativeIndex(Register dst, Register src, int shift); 477 SmiIndex SmiToNegativeIndex(Register dst, Register src, int shift);
469 478
470 // Basic Smi operations. 479 // Basic Smi operations.
471 void Move(Register dst, Smi* source) { 480 void Move(Register dst, Smi* source) {
472 Set(dst, reinterpret_cast<int64_t>(source)); 481 LoadSmiConstant(dst, source);
473 } 482 }
474 483
475 void Move(const Operand& dst, Smi* source) { 484 void Move(const Operand& dst, Smi* source) {
476 Set(dst, reinterpret_cast<int64_t>(source)); 485 Register constant = GetSmiConstant(source);
486 movq(dst, constant);
477 } 487 }
478 488
479 void Push(Smi* smi); 489 void Push(Smi* smi);
480 void Test(const Operand& dst, Smi* source); 490 void Test(const Operand& dst, Smi* source);
481 491
482 // --------------------------------------------------------------------------- 492 // ---------------------------------------------------------------------------
483 // String macros. 493 // String macros.
484 void JumpIfNotBothSequentialAsciiStrings(Register first_object, 494 void JumpIfNotBothSequentialAsciiStrings(Register first_object,
485 Register second_object, 495 Register second_object,
486 Register scratch1, 496 Register scratch1,
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 823
814 // Verify restrictions about code generated in stubs. 824 // Verify restrictions about code generated in stubs.
815 void set_generating_stub(bool value) { generating_stub_ = value; } 825 void set_generating_stub(bool value) { generating_stub_ = value; }
816 bool generating_stub() { return generating_stub_; } 826 bool generating_stub() { return generating_stub_; }
817 void set_allow_stub_calls(bool value) { allow_stub_calls_ = value; } 827 void set_allow_stub_calls(bool value) { allow_stub_calls_ = value; }
818 bool allow_stub_calls() { return allow_stub_calls_; } 828 bool allow_stub_calls() { return allow_stub_calls_; }
819 829
820 private: 830 private:
821 bool generating_stub_; 831 bool generating_stub_;
822 bool allow_stub_calls_; 832 bool allow_stub_calls_;
833
834 // Returns a register holding the smi value. The register MUST NOT be
835 // modified. It may be the "smi 1 constant" register.
836 Register GetSmiConstant(Smi* value);
837
838 // Moves the smi value to the destination register.
839 void LoadSmiConstant(Register dst, Smi* value);
840
823 // This handle will be patched with the code object on installation. 841 // This handle will be patched with the code object on installation.
824 Handle<Object> code_object_; 842 Handle<Object> code_object_;
825 843
826 // Helper functions for generating invokes. 844 // Helper functions for generating invokes.
827 void InvokePrologue(const ParameterCount& expected, 845 void InvokePrologue(const ParameterCount& expected,
828 const ParameterCount& actual, 846 const ParameterCount& actual,
829 Handle<Code> code_constant, 847 Handle<Code> code_constant,
830 Register code_register, 848 Register code_register,
831 Label* done, 849 Label* done,
832 InvokeFlag flag); 850 InvokeFlag flag);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 } \ 925 } \
908 masm-> 926 masm->
909 #else 927 #else
910 #define ACCESS_MASM(masm) masm-> 928 #define ACCESS_MASM(masm) masm->
911 #endif 929 #endif
912 930
913 931
914 } } // namespace v8::internal 932 } } // namespace v8::internal
915 933
916 #endif // V8_X64_MACRO_ASSEMBLER_X64_H_ 934 #endif // V8_X64_MACRO_ASSEMBLER_X64_H_
OLDNEW
« no previous file with comments | « src/x64/frames-x64.h ('k') | src/x64/macro-assembler-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698