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

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

Issue 1986113004: Add cmpxchg and lock instructions to x64 and ia32 {dis,}assemblers (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: merge master Created 4 years, 7 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/ia32/disasm-ia32.cc ('k') | src/x64/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 (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 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 414
415 // Adds operand displacement fields (offsets added to the memory address). 415 // Adds operand displacement fields (offsets added to the memory address).
416 // Needs to be called after set_sib, not before it. 416 // Needs to be called after set_sib, not before it.
417 inline void set_disp8(int disp); 417 inline void set_disp8(int disp);
418 inline void set_disp32(int disp); 418 inline void set_disp32(int disp);
419 inline void set_disp64(int64_t disp); // for labels. 419 inline void set_disp64(int64_t disp); // for labels.
420 420
421 friend class Assembler; 421 friend class Assembler;
422 }; 422 };
423 423
424
425 #define ASSEMBLER_INSTRUCTION_LIST(V) \ 424 #define ASSEMBLER_INSTRUCTION_LIST(V) \
426 V(add) \ 425 V(add) \
427 V(and) \ 426 V(and) \
428 V(cmp) \ 427 V(cmp) \
428 V(cmpxchg) \
429 V(dec) \ 429 V(dec) \
430 V(idiv) \ 430 V(idiv) \
431 V(div) \ 431 V(div) \
432 V(imul) \ 432 V(imul) \
433 V(inc) \ 433 V(inc) \
434 V(lea) \ 434 V(lea) \
435 V(mov) \ 435 V(mov) \
436 V(movzxb) \ 436 V(movzxb) \
437 V(movzxw) \ 437 V(movzxw) \
438 V(neg) \ 438 V(neg) \
439 V(not) \ 439 V(not) \
440 V(or) \ 440 V(or) \
441 V(repmovs) \ 441 V(repmovs) \
442 V(sbb) \ 442 V(sbb) \
443 V(sub) \ 443 V(sub) \
444 V(test) \ 444 V(test) \
445 V(xchg) \ 445 V(xchg) \
446 V(xor) 446 V(xor)
447 447
448
449 // Shift instructions on operands/registers with kPointerSize, kInt32Size and 448 // Shift instructions on operands/registers with kPointerSize, kInt32Size and
450 // kInt64Size. 449 // kInt64Size.
451 #define SHIFT_INSTRUCTION_LIST(V) \ 450 #define SHIFT_INSTRUCTION_LIST(V) \
452 V(rol, 0x0) \ 451 V(rol, 0x0) \
453 V(ror, 0x1) \ 452 V(ror, 0x1) \
454 V(rcl, 0x2) \ 453 V(rcl, 0x2) \
455 V(rcr, 0x3) \ 454 V(rcr, 0x3) \
456 V(shl, 0x4) \ 455 V(shl, 0x4) \
457 V(shr, 0x5) \ 456 V(shr, 0x5) \
458 V(sar, 0x7) \ 457 V(sar, 0x7) \
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 780
782 void testw(Register reg, const Operand& op) { testw(op, reg); } 781 void testw(Register reg, const Operand& op) { testw(op, reg); }
783 782
784 void andb(Register dst, Immediate src) { 783 void andb(Register dst, Immediate src) {
785 immediate_arithmetic_op_8(0x4, dst, src); 784 immediate_arithmetic_op_8(0x4, dst, src);
786 } 785 }
787 786
788 void decb(Register dst); 787 void decb(Register dst);
789 void decb(const Operand& dst); 788 void decb(const Operand& dst);
790 789
790 // Lock prefix.
791 void lock();
792
791 void xchgb(Register reg, const Operand& op); 793 void xchgb(Register reg, const Operand& op);
792 void xchgw(Register reg, const Operand& op); 794 void xchgw(Register reg, const Operand& op);
793 795
796 void cmpxchgb(const Operand& dst, Register src);
797 void cmpxchgw(const Operand& dst, Register src);
798
794 // Sign-extends rax into rdx:rax. 799 // Sign-extends rax into rdx:rax.
795 void cqo(); 800 void cqo();
796 // Sign-extends eax into edx:eax. 801 // Sign-extends eax into edx:eax.
797 void cdq(); 802 void cdq();
798 803
799 // Multiply eax by src, put the result in edx:eax. 804 // Multiply eax by src, put the result in edx:eax.
800 void mull(Register src); 805 void mull(Register src);
801 void mull(const Operand& src); 806 void mull(const Operand& src);
802 // Multiply rax by src, put the result in rdx:rax. 807 // Multiply rax by src, put the result in rdx:rax.
803 void mulq(Register src); 808 void mulq(Register src);
(...skipping 1243 matching lines...) Expand 10 before | Expand all | Expand 10 after
2047 } 2052 }
2048 2053
2049 void emit_cmp(Register dst, Immediate src, int size) { 2054 void emit_cmp(Register dst, Immediate src, int size) {
2050 immediate_arithmetic_op(0x7, dst, src, size); 2055 immediate_arithmetic_op(0x7, dst, src, size);
2051 } 2056 }
2052 2057
2053 void emit_cmp(const Operand& dst, Immediate src, int size) { 2058 void emit_cmp(const Operand& dst, Immediate src, int size) {
2054 immediate_arithmetic_op(0x7, dst, src, size); 2059 immediate_arithmetic_op(0x7, dst, src, size);
2055 } 2060 }
2056 2061
2062 // Compare {al,ax,eax,rax} with src. If equal, set ZF and write dst into
2063 // src. Otherwise clear ZF and write src into {al,ax,eax,rax}. This
2064 // operation is only atomic if prefixed by the lock instruction.
2065 void emit_cmpxchg(const Operand& dst, Register src, int size);
2066
2057 void emit_dec(Register dst, int size); 2067 void emit_dec(Register dst, int size);
2058 void emit_dec(const Operand& dst, int size); 2068 void emit_dec(const Operand& dst, int size);
2059 2069
2060 // Divide rdx:rax by src. Quotient in rax, remainder in rdx when size is 64. 2070 // Divide rdx:rax by src. Quotient in rax, remainder in rdx when size is 64.
2061 // Divide edx:eax by lower 32 bits of src. Quotient in eax, remainder in edx 2071 // Divide edx:eax by lower 32 bits of src. Quotient in eax, remainder in edx
2062 // when size is 32. 2072 // when size is 32.
2063 void emit_idiv(Register src, int size); 2073 void emit_idiv(Register src, int size);
2064 void emit_div(Register src, int size); 2074 void emit_div(Register src, int size);
2065 2075
2066 // Signed multiply instructions. 2076 // Signed multiply instructions.
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
2232 Assembler* assembler_; 2242 Assembler* assembler_;
2233 #ifdef DEBUG 2243 #ifdef DEBUG
2234 int space_before_; 2244 int space_before_;
2235 #endif 2245 #endif
2236 }; 2246 };
2237 2247
2238 } // namespace internal 2248 } // namespace internal
2239 } // namespace v8 2249 } // namespace v8
2240 2250
2241 #endif // V8_X64_ASSEMBLER_X64_H_ 2251 #endif // V8_X64_ASSEMBLER_X64_H_
OLDNEW
« no previous file with comments | « src/ia32/disasm-ia32.cc ('k') | src/x64/assembler-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698