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

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

Issue 114085: X64: Implement CEntryStub and JSEntryTrampoline. (Closed)
Patch Set: Addressed review comments Created 11 years, 6 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
OLDNEW
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 // doing certain constant folds, which may significantly reduce the 70 // doing certain constant folds, which may significantly reduce the
71 // code generated for some assembly instructions (because they boil down 71 // code generated for some assembly instructions (because they boil down
72 // to a few constants). If this is a problem, we could change the code 72 // to a few constants). If this is a problem, we could change the code
73 // such that we use an enum in optimized mode, and the struct in debug 73 // such that we use an enum in optimized mode, and the struct in debug
74 // mode. This way we get the compile-time error checking in debug mode 74 // mode. This way we get the compile-time error checking in debug mode
75 // and best performance in optimized code. 75 // and best performance in optimized code.
76 // 76 //
77 77
78 struct Register { 78 struct Register {
79 static Register toRegister(int code) { 79 static Register toRegister(int code) {
80 Register r = {code}; 80 Register r = { code };
81 return r; 81 return r;
82 } 82 }
83 bool is_valid() const { return 0 <= code_ && code_ < 16; } 83 bool is_valid() const { return 0 <= code_ && code_ < 16; }
84 bool is(Register reg) const { return code_ == reg.code_; } 84 bool is(Register reg) const { return code_ == reg.code_; }
85 // The byte-register distinction of ai32 has dissapeared. 85 // The byte-register distinction of ai32 has dissapeared.
86 bool is_byte_register() const { return false; } 86 bool is_byte_register() const { return false; }
87 int code() const { 87 int code() const {
88 ASSERT(is_valid()); 88 ASSERT(is_valid());
89 return code_; 89 return code_;
90 } 90 }
91 int bit() const { 91 int bit() const {
92 UNIMPLEMENTED(); 92 return 1 << code_;
93 return 0;
94 } 93 }
95 94
96 // (unfortunately we can't make this private in a struct) 95 // (unfortunately we can't make this private in a struct when initializing
96 // by assignment.)
97 int code_; 97 int code_;
98 }; 98 };
99 99
100 extern Register rax; 100 extern Register rax;
101 extern Register rcx; 101 extern Register rcx;
102 extern Register rdx; 102 extern Register rdx;
103 extern Register rbx; 103 extern Register rbx;
104 extern Register rsp; 104 extern Register rsp;
105 extern Register rbp; 105 extern Register rbp;
106 extern Register rsi; 106 extern Register rsi;
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 kTimes4 = 2, 243 kTimes4 = 2,
244 kTimes8 = 3, 244 kTimes8 = 3,
245 kTimesIntSize = kTimes4, 245 kTimesIntSize = kTimes4,
246 kTimesPointerSize = kTimes8 246 kTimesPointerSize = kTimes8
247 }; 247 };
248 248
249 249
250 class Operand BASE_EMBEDDED { 250 class Operand BASE_EMBEDDED {
251 public: 251 public:
252 // [base + disp/r] 252 // [base + disp/r]
253 INLINE(Operand(Register base, int32_t disp)); 253 Operand(Register base, int32_t disp);
254 254
255 // [base + index*scale + disp/r] 255 // [base + index*scale + disp/r]
256 Operand(Register base, 256 Operand(Register base,
257 Register index, 257 Register index,
258 ScaleFactor scale, 258 ScaleFactor scale,
259 int32_t disp); 259 int32_t disp);
260 260
261 // [index*scale + disp/r] 261 // [index*scale + disp/r]
262 Operand(Register index, 262 Operand(Register index,
263 ScaleFactor scale, 263 ScaleFactor scale,
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 void movl(Register dst, Immediate imm32); 427 void movl(Register dst, Immediate imm32);
428 428
429 void movq(Register dst, int32_t imm32); 429 void movq(Register dst, int32_t imm32);
430 void movq(Register dst, const Operand& src); 430 void movq(Register dst, const Operand& src);
431 // Sign extends immediate 32-bit value to 64 bits. 431 // Sign extends immediate 32-bit value to 64 bits.
432 void movq(Register dst, Immediate x); 432 void movq(Register dst, Immediate x);
433 void movq(Register dst, Register src); 433 void movq(Register dst, Register src);
434 434
435 // Move 64 bit register value to 64-bit memory location. 435 // Move 64 bit register value to 64-bit memory location.
436 void movq(const Operand& dst, Register src); 436 void movq(const Operand& dst, Register src);
437 437 // Move sign extended immediate to memory location.
438 void movq(const Operand& dst, Immediate value);
438 // New x64 instructions to load a 64-bit immediate into a register. 439 // New x64 instructions to load a 64-bit immediate into a register.
439 // All 64-bit immediates must have a relocation mode. 440 // All 64-bit immediates must have a relocation mode.
440 void movq(Register dst, void* ptr, RelocInfo::Mode rmode); 441 void movq(Register dst, void* ptr, RelocInfo::Mode rmode);
441 void movq(Register dst, int64_t value, RelocInfo::Mode rmode); 442 void movq(Register dst, int64_t value, RelocInfo::Mode rmode);
442 void movq(Register dst, const char* s, RelocInfo::Mode rmode); 443 void movq(Register dst, const char* s, RelocInfo::Mode rmode);
443 // Moves the address of the external reference into the register. 444 // Moves the address of the external reference into the register.
444 void movq(Register dst, ExternalReference ext); 445 void movq(Register dst, ExternalReference ext);
445 void movq(Register dst, Handle<Object> handle, RelocInfo::Mode rmode); 446 void movq(Register dst, Handle<Object> handle, RelocInfo::Mode rmode);
446 447
447
448 // New x64 instruction to load from an immediate 64-bit pointer into RAX. 448 // New x64 instruction to load from an immediate 64-bit pointer into RAX.
449 void load_rax(void* ptr, RelocInfo::Mode rmode); 449 void load_rax(void* ptr, RelocInfo::Mode rmode);
450 void load_rax(ExternalReference ext); 450 void load_rax(ExternalReference ext);
451 451
452 void movsx_b(Register dst, const Operand& src); 452 void movsx_b(Register dst, const Operand& src);
453 453
454 void movsx_w(Register dst, const Operand& src); 454 void movsx_w(Register dst, const Operand& src);
455 455
456 void movzx_b(Register dst, const Operand& src); 456 void movzx_b(Register dst, const Operand& src);
457 457
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 void sub(const Operand& dst, Immediate src) { 640 void sub(const Operand& dst, Immediate src) {
641 immediate_arithmetic_op(0x5, dst, src); 641 immediate_arithmetic_op(0x5, dst, src);
642 } 642 }
643 643
644 void testb(Register reg, Immediate mask); 644 void testb(Register reg, Immediate mask);
645 void testb(const Operand& op, Immediate mask); 645 void testb(const Operand& op, Immediate mask);
646 void testl(Register reg, Immediate mask); 646 void testl(Register reg, Immediate mask);
647 void testl(const Operand& op, Immediate mask); 647 void testl(const Operand& op, Immediate mask);
648 void testq(const Operand& op, Register reg); 648 void testq(const Operand& op, Register reg);
649 void testq(Register dst, Register src); 649 void testq(Register dst, Register src);
650 void testq(Register dst, Immediate mask);
650 651
651 void xor_(Register dst, Register src) { 652 void xor_(Register dst, Register src) {
652 arithmetic_op(0x33, dst, src); 653 arithmetic_op(0x33, dst, src);
653 } 654 }
654 655
655 void xor_(Register dst, const Operand& src) { 656 void xor_(Register dst, const Operand& src) {
656 arithmetic_op(0x33, dst, src); 657 arithmetic_op(0x33, dst, src);
657 } 658 }
658 659
659 void xor_(const Operand& dst, Register src) { 660 void xor_(const Operand& dst, Register src) {
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
1034 private: 1035 private:
1035 Assembler* assembler_; 1036 Assembler* assembler_;
1036 #ifdef DEBUG 1037 #ifdef DEBUG
1037 int space_before_; 1038 int space_before_;
1038 #endif 1039 #endif
1039 }; 1040 };
1040 1041
1041 } } // namespace v8::internal 1042 } } // namespace v8::internal
1042 1043
1043 #endif // V8_X64_ASSEMBLER_X64_H_ 1044 #endif // V8_X64_ASSEMBLER_X64_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698