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

Side by Side Diff: src/IceAssemblerX86Base.h

Issue 1224173006: Adds the x86-64 assembler. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: make format Created 5 years, 4 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 //===- subzero/src/IceAssemblerX86Base.h - base x86 assembler -*- C++ -*---===// 1 //===- subzero/src/IceAssemblerX86Base.h - base x86 assembler -*- C++ -*---===//
2 // 2 //
3 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 3 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
4 // for details. All rights reserved. Use of this source code is governed by a 4 // for details. All rights reserved. Use of this source code is governed by a
5 // BSD-style license that can be found in the LICENSE file. 5 // BSD-style license that can be found in the LICENSE file.
6 // 6 //
7 // Modified by the Subzero authors. 7 // Modified by the Subzero authors.
8 // 8 //
9 //===----------------------------------------------------------------------===// 9 //===----------------------------------------------------------------------===//
10 // 10 //
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 307
308 TypedEmitRegRegImm RegRegImm; 308 TypedEmitRegRegImm RegRegImm;
309 TypedEmitRegAddrImm RegAddrImm; 309 TypedEmitRegAddrImm RegAddrImm;
310 }; 310 };
311 311
312 /* 312 /*
313 * Emit Machine Instructions. 313 * Emit Machine Instructions.
314 */ 314 */
315 void call(typename Traits::GPRRegister reg); 315 void call(typename Traits::GPRRegister reg);
316 void call(const typename Traits::Address &address); 316 void call(const typename Traits::Address &address);
317 void call(const ConstantRelocatable *label); 317 void call(const ConstantRelocatable *label); // not testable.
318 void call(const Immediate &abs_address); 318 void call(const Immediate &abs_address);
319 319
320 static const intptr_t kCallExternalLabelSize = 5; 320 static const intptr_t kCallExternalLabelSize = 5;
321 321
322 void pushl(typename Traits::GPRRegister reg); 322 void pushl(typename Traits::GPRRegister reg);
323 323
324 void popl(typename Traits::GPRRegister reg); 324 void popl(typename Traits::GPRRegister reg);
325 void popl(const typename Traits::Address &address); 325 void popl(const typename Traits::Address &address);
326 326
327 template <typename T = Traits,
328 typename = typename std::enable_if<T::HasPusha>::type>
327 void pushal(); 329 void pushal();
330 template <typename T = Traits,
331 typename = typename std::enable_if<T::HasPopa>::type>
328 void popal(); 332 void popal();
329 333
330 void setcc(typename Traits::Cond::BrCond condition, 334 void setcc(typename Traits::Cond::BrCond condition,
331 typename Traits::ByteRegister dst); 335 typename Traits::ByteRegister dst);
332 void setcc(typename Traits::Cond::BrCond condition, 336 void setcc(typename Traits::Cond::BrCond condition,
333 const typename Traits::Address &address); 337 const typename Traits::Address &address);
334 338
335 // All mov() overloads are tested.
336 void mov(Type Ty, typename Traits::GPRRegister dst, const Immediate &src); 339 void mov(Type Ty, typename Traits::GPRRegister dst, const Immediate &src);
337 void mov(Type Ty, typename Traits::GPRRegister dst, 340 void mov(Type Ty, typename Traits::GPRRegister dst,
338 typename Traits::GPRRegister src); 341 typename Traits::GPRRegister src);
339 void mov(Type Ty, typename Traits::GPRRegister dst, 342 void mov(Type Ty, typename Traits::GPRRegister dst,
340 const typename Traits::Address &src); 343 const typename Traits::Address &src);
341 void mov(Type Ty, const typename Traits::Address &dst, 344 void mov(Type Ty, const typename Traits::Address &dst,
342 typename Traits::GPRRegister src); 345 typename Traits::GPRRegister src);
343 void mov(Type Ty, const typename Traits::Address &dst, const Immediate &imm); 346 void mov(Type Ty, const typename Traits::Address &dst, const Immediate &imm);
344 347
348 void movFromAh(const typename Traits::GPRRegister dst);
349
345 void movzx(Type Ty, typename Traits::GPRRegister dst, 350 void movzx(Type Ty, typename Traits::GPRRegister dst,
346 typename Traits::GPRRegister src); 351 typename Traits::GPRRegister src);
347 void movzx(Type Ty, typename Traits::GPRRegister dst, 352 void movzx(Type Ty, typename Traits::GPRRegister dst,
348 const typename Traits::Address &src); 353 const typename Traits::Address &src);
349 void movsx(Type Ty, typename Traits::GPRRegister dst, 354 void movsx(Type Ty, typename Traits::GPRRegister dst,
350 typename Traits::GPRRegister src); 355 typename Traits::GPRRegister src);
351 void movsx(Type Ty, typename Traits::GPRRegister dst, 356 void movsx(Type Ty, typename Traits::GPRRegister dst,
352 const typename Traits::Address &src); 357 const typename Traits::Address &src);
353 358
354 void lea(Type Ty, typename Traits::GPRRegister dst, 359 void lea(Type Ty, typename Traits::GPRRegister dst,
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 501
497 void cmpps(typename Traits::XmmRegister dst, typename Traits::XmmRegister src, 502 void cmpps(typename Traits::XmmRegister dst, typename Traits::XmmRegister src,
498 typename Traits::Cond::CmppsCond CmpCondition); 503 typename Traits::Cond::CmppsCond CmpCondition);
499 void cmpps(typename Traits::XmmRegister dst, 504 void cmpps(typename Traits::XmmRegister dst,
500 const typename Traits::Address &src, 505 const typename Traits::Address &src,
501 typename Traits::Cond::CmppsCond CmpCondition); 506 typename Traits::Cond::CmppsCond CmpCondition);
502 507
503 void sqrtps(typename Traits::XmmRegister dst); 508 void sqrtps(typename Traits::XmmRegister dst);
504 void rsqrtps(typename Traits::XmmRegister dst); 509 void rsqrtps(typename Traits::XmmRegister dst);
505 void reciprocalps(typename Traits::XmmRegister dst); 510 void reciprocalps(typename Traits::XmmRegister dst);
511
506 void movhlps(typename Traits::XmmRegister dst, 512 void movhlps(typename Traits::XmmRegister dst,
507 typename Traits::XmmRegister src); 513 typename Traits::XmmRegister src);
508 void movlhps(typename Traits::XmmRegister dst, 514 void movlhps(typename Traits::XmmRegister dst,
509 typename Traits::XmmRegister src); 515 typename Traits::XmmRegister src);
510 void unpcklps(typename Traits::XmmRegister dst, 516 void unpcklps(typename Traits::XmmRegister dst,
511 typename Traits::XmmRegister src); 517 typename Traits::XmmRegister src);
512 void unpckhps(typename Traits::XmmRegister dst, 518 void unpckhps(typename Traits::XmmRegister dst,
513 typename Traits::XmmRegister src); 519 typename Traits::XmmRegister src);
514 void unpcklpd(typename Traits::XmmRegister dst, 520 void unpcklpd(typename Traits::XmmRegister dst,
515 typename Traits::XmmRegister src); 521 typename Traits::XmmRegister src);
516 void unpckhpd(typename Traits::XmmRegister dst, 522 void unpckhpd(typename Traits::XmmRegister dst,
517 typename Traits::XmmRegister src); 523 typename Traits::XmmRegister src);
518 524
519 void set1ps(typename Traits::XmmRegister dst, 525 void set1ps(typename Traits::XmmRegister dst,
520 typename Traits::GPRRegister tmp, const Immediate &imm); 526 typename Traits::GPRRegister tmp, const Immediate &imm);
521 void shufps(typename Traits::XmmRegister dst,
522 typename Traits::XmmRegister src, const Immediate &mask);
523 527
524 void minpd(typename Traits::XmmRegister dst, 528 void minpd(typename Traits::XmmRegister dst,
525 typename Traits::XmmRegister src); 529 typename Traits::XmmRegister src);
526 void maxpd(typename Traits::XmmRegister dst, 530 void maxpd(typename Traits::XmmRegister dst,
527 typename Traits::XmmRegister src); 531 typename Traits::XmmRegister src);
528 void sqrtpd(typename Traits::XmmRegister dst); 532 void sqrtpd(typename Traits::XmmRegister dst);
533
529 void shufpd(typename Traits::XmmRegister dst, 534 void shufpd(typename Traits::XmmRegister dst,
530 typename Traits::XmmRegister src, const Immediate &mask); 535 typename Traits::XmmRegister src, const Immediate &mask);
531 536
532 void pshufd(Type Ty, typename Traits::XmmRegister dst, 537 void pshufd(Type Ty, typename Traits::XmmRegister dst,
533 typename Traits::XmmRegister src, const Immediate &mask); 538 typename Traits::XmmRegister src, const Immediate &mask);
534 void pshufd(Type Ty, typename Traits::XmmRegister dst, 539 void pshufd(Type Ty, typename Traits::XmmRegister dst,
535 const typename Traits::Address &src, const Immediate &mask); 540 const typename Traits::Address &src, const Immediate &mask);
541 void shufps(typename Traits::XmmRegister dst,
542 typename Traits::XmmRegister src, const Immediate &mask);
536 void shufps(Type Ty, typename Traits::XmmRegister dst, 543 void shufps(Type Ty, typename Traits::XmmRegister dst,
537 typename Traits::XmmRegister src, const Immediate &mask); 544 typename Traits::XmmRegister src, const Immediate &mask);
538 void shufps(Type Ty, typename Traits::XmmRegister dst, 545 void shufps(Type Ty, typename Traits::XmmRegister dst,
539 const typename Traits::Address &src, const Immediate &mask); 546 const typename Traits::Address &src, const Immediate &mask);
540 547
541 void cvtdq2ps(Type, typename Traits::XmmRegister dst, 548 void cvtdq2ps(Type, typename Traits::XmmRegister dst,
542 typename Traits::XmmRegister src); 549 typename Traits::XmmRegister src);
543 void cvtdq2ps(Type, typename Traits::XmmRegister dst, 550 void cvtdq2ps(Type, typename Traits::XmmRegister dst,
544 const typename Traits::Address &src); 551 const typename Traits::Address &src);
545 552
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 void insertps(Type Ty, typename Traits::XmmRegister dst, 606 void insertps(Type Ty, typename Traits::XmmRegister dst,
600 const typename Traits::Address &src, const Immediate &imm); 607 const typename Traits::Address &src, const Immediate &imm);
601 608
602 void pinsr(Type Ty, typename Traits::XmmRegister dst, 609 void pinsr(Type Ty, typename Traits::XmmRegister dst,
603 typename Traits::GPRRegister src, const Immediate &imm); 610 typename Traits::GPRRegister src, const Immediate &imm);
604 void pinsr(Type Ty, typename Traits::XmmRegister dst, 611 void pinsr(Type Ty, typename Traits::XmmRegister dst,
605 const typename Traits::Address &src, const Immediate &imm); 612 const typename Traits::Address &src, const Immediate &imm);
606 613
607 void pextr(Type Ty, typename Traits::GPRRegister dst, 614 void pextr(Type Ty, typename Traits::GPRRegister dst,
608 typename Traits::XmmRegister src, const Immediate &imm); 615 typename Traits::XmmRegister src, const Immediate &imm);
616 // The following overload is not implemented.
609 void pextr(Type Ty, typename Traits::GPRRegister dst, 617 void pextr(Type Ty, typename Traits::GPRRegister dst,
610 const typename Traits::Address &src, const Immediate &imm); 618 const typename Traits::Address &src, const Immediate &imm);
611 619
612 void pmovsxdq(typename Traits::XmmRegister dst, 620 void pmovsxdq(typename Traits::XmmRegister dst,
613 typename Traits::XmmRegister src); 621 typename Traits::XmmRegister src);
614 622
615 void pcmpeq(Type Ty, typename Traits::XmmRegister dst, 623 void pcmpeq(Type Ty, typename Traits::XmmRegister dst,
616 typename Traits::XmmRegister src); 624 typename Traits::XmmRegister src);
617 void pcmpeq(Type Ty, typename Traits::XmmRegister dst, 625 void pcmpeq(Type Ty, typename Traits::XmmRegister dst,
618 const typename Traits::Address &src); 626 const typename Traits::Address &src);
619 void pcmpgt(Type Ty, typename Traits::XmmRegister dst, 627 void pcmpgt(Type Ty, typename Traits::XmmRegister dst,
620 typename Traits::XmmRegister src); 628 typename Traits::XmmRegister src);
621 void pcmpgt(Type Ty, typename Traits::XmmRegister dst, 629 void pcmpgt(Type Ty, typename Traits::XmmRegister dst,
622 const typename Traits::Address &src); 630 const typename Traits::Address &src);
623 631
624 enum RoundingMode { 632 enum RoundingMode {
625 kRoundToNearest = 0x0, 633 kRoundToNearest = 0x0,
626 kRoundDown = 0x1, 634 kRoundDown = 0x1,
627 kRoundUp = 0x2, 635 kRoundUp = 0x2,
628 kRoundToZero = 0x3 636 kRoundToZero = 0x3
629 }; 637 };
630 void roundsd(typename Traits::XmmRegister dst, 638 void roundsd(typename Traits::XmmRegister dst,
631 typename Traits::XmmRegister src, RoundingMode mode); 639 typename Traits::XmmRegister src, RoundingMode mode);
632 640
633 void fld(Type Ty, const typename Traits::Address &src); 641 //----------------------------------------------------------------------------
634 void fstp(Type Ty, const typename Traits::Address &dst); 642 //
635 void fstp(typename Traits::X87STRegister st); 643 // Begin: X87 instructions. Only available when Traits::UsesX87.
644 //
645 //----------------------------------------------------------------------------
646 template <typename T = Traits,
647 typename = typename std::enable_if<T::UsesX87>::type>
648 void fld(Type Ty, const typename T::Address &src);
649 template <typename T = Traits,
650 typename = typename std::enable_if<T::UsesX87>::type>
651 void fstp(Type Ty, const typename T::Address &dst);
652 template <typename T = Traits,
653 typename = typename std::enable_if<T::UsesX87>::type>
654 void fstp(typename T::X87STRegister st);
636 655
637 void fnstcw(const typename Traits::Address &dst); 656 template <typename T = Traits,
638 void fldcw(const typename Traits::Address &src); 657 typename = typename std::enable_if<T::UsesX87>::type>
658 void fnstcw(const typename T::Address &dst);
659 template <typename T = Traits,
660 typename = typename std::enable_if<T::UsesX87>::type>
661 void fldcw(const typename T::Address &src);
639 662
640 void fistpl(const typename Traits::Address &dst); 663 template <typename T = Traits,
641 void fistps(const typename Traits::Address &dst); 664 typename = typename std::enable_if<T::UsesX87>::type>
642 void fildl(const typename Traits::Address &src); 665 void fistpl(const typename T::Address &dst);
643 void filds(const typename Traits::Address &src); 666 template <typename T = Traits,
667 typename = typename std::enable_if<T::UsesX87>::type>
668 void fistps(const typename T::Address &dst);
669 template <typename T = Traits,
670 typename = typename std::enable_if<T::UsesX87>::type>
671 void fildl(const typename T::Address &src);
672 template <typename T = Traits,
673 typename = typename std::enable_if<T::UsesX87>::type>
674 void filds(const typename T::Address &src);
644 675
676 template <typename T = Traits,
677 typename = typename std::enable_if<T::UsesX87>::type>
645 void fincstp(); 678 void fincstp();
679 //----------------------------------------------------------------------------
680 //
681 // End: X87 instructions.
682 //
683 //----------------------------------------------------------------------------
646 684
647 void cmp(Type Ty, typename Traits::GPRRegister reg0, 685 void cmp(Type Ty, typename Traits::GPRRegister reg0,
648 typename Traits::GPRRegister reg1); 686 typename Traits::GPRRegister reg1);
649 void cmp(Type Ty, typename Traits::GPRRegister reg, 687 void cmp(Type Ty, typename Traits::GPRRegister reg,
650 const typename Traits::Address &address); 688 const typename Traits::Address &address);
651 void cmp(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm); 689 void cmp(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
652 void cmp(Type Ty, const typename Traits::Address &address, 690 void cmp(Type Ty, const typename Traits::Address &address,
653 typename Traits::GPRRegister reg); 691 typename Traits::GPRRegister reg);
654 void cmp(Type Ty, const typename Traits::Address &address, 692 void cmp(Type Ty, const typename Traits::Address &address,
655 const Immediate &imm); 693 const Immediate &imm);
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 void imul(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm); 785 void imul(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
748 void imul(Type Ty, typename Traits::GPRRegister reg, 786 void imul(Type Ty, typename Traits::GPRRegister reg,
749 const typename Traits::Address &address); 787 const typename Traits::Address &address);
750 788
751 void imul(Type Ty, typename Traits::GPRRegister reg); 789 void imul(Type Ty, typename Traits::GPRRegister reg);
752 void imul(Type Ty, const typename Traits::Address &address); 790 void imul(Type Ty, const typename Traits::Address &address);
753 791
754 void mul(Type Ty, typename Traits::GPRRegister reg); 792 void mul(Type Ty, typename Traits::GPRRegister reg);
755 void mul(Type Ty, const typename Traits::Address &address); 793 void mul(Type Ty, const typename Traits::Address &address);
756 794
795 template <class T = Traits,
796 typename = typename std::enable_if<!T::Is64Bit>::type>
757 void incl(typename Traits::GPRRegister reg); 797 void incl(typename Traits::GPRRegister reg);
758 void incl(const typename Traits::Address &address); 798 void incl(const typename Traits::Address &address);
759 799
800 template <class T = Traits,
801 typename = typename std::enable_if<!T::Is64Bit>::type>
760 void decl(typename Traits::GPRRegister reg); 802 void decl(typename Traits::GPRRegister reg);
761 void decl(const typename Traits::Address &address); 803 void decl(const typename Traits::Address &address);
762 804
763 void rol(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm); 805 void rol(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
764 void rol(Type Ty, typename Traits::GPRRegister operand, 806 void rol(Type Ty, typename Traits::GPRRegister operand,
765 typename Traits::GPRRegister shifter); 807 typename Traits::GPRRegister shifter);
766 void rol(Type Ty, const typename Traits::Address &operand, 808 void rol(Type Ty, const typename Traits::Address &operand,
767 typename Traits::GPRRegister shifter); 809 typename Traits::GPRRegister shifter);
768 810
769 void shl(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm); 811 void shl(Type Ty, typename Traits::GPRRegister reg, const Immediate &imm);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
818 void ret(); 860 void ret();
819 void ret(const Immediate &imm); 861 void ret(const Immediate &imm);
820 862
821 // 'size' indicates size in bytes and must be in the range 1..8. 863 // 'size' indicates size in bytes and must be in the range 1..8.
822 void nop(int size = 1); 864 void nop(int size = 1);
823 void int3(); 865 void int3();
824 void hlt(); 866 void hlt();
825 void ud2(); 867 void ud2();
826 868
827 // j(Label) is fully tested. 869 // j(Label) is fully tested.
828 // j(ConstantRelocatable) is not tested as the test can not easily create such
829 // an argument.
830 void j(typename Traits::Cond::BrCond condition, Label *label, 870 void j(typename Traits::Cond::BrCond condition, Label *label,
831 bool near = kFarJump); 871 bool near = kFarJump);
832 void j(typename Traits::Cond::BrCond condition, 872 void j(typename Traits::Cond::BrCond condition,
833 const ConstantRelocatable *label); 873 const ConstantRelocatable *label); // not testable.
834 874
835 void jmp(typename Traits::GPRRegister reg); 875 void jmp(typename Traits::GPRRegister reg);
836 void jmp(Label *label, bool near = kFarJump); 876 void jmp(Label *label, bool near = kFarJump);
837 void jmp(const ConstantRelocatable *label); 877 void jmp(const ConstantRelocatable *label); // not testable.
838 878
839 void mfence(); 879 void mfence();
840 880
841 void lock(); 881 void lock();
842 void cmpxchg(Type Ty, const typename Traits::Address &address, 882 void cmpxchg(Type Ty, const typename Traits::Address &address,
843 typename Traits::GPRRegister reg, bool Locked); 883 typename Traits::GPRRegister reg, bool Locked);
844 void cmpxchg8b(const typename Traits::Address &address, bool Locked); 884 void cmpxchg8b(const typename Traits::Address &address, bool Locked);
845 void xadd(Type Ty, const typename Traits::Address &address, 885 void xadd(Type Ty, const typename Traits::Address &address,
846 typename Traits::GPRRegister reg, bool Locked); 886 typename Traits::GPRRegister reg, bool Locked);
847 void xchg(Type Ty, const typename Traits::Address &address, 887 void xchg(Type Ty, const typename Traits::Address &address,
848 typename Traits::GPRRegister reg); 888 typename Traits::GPRRegister reg);
849 889
850 void emitSegmentOverride(uint8_t prefix); 890 void emitSegmentOverride(uint8_t prefix);
851 891
852 intptr_t preferredLoopAlignment() { return 16; } 892 intptr_t preferredLoopAlignment() { return 16; }
853 void align(intptr_t alignment, intptr_t offset); 893 void align(intptr_t alignment, intptr_t offset);
854 void bind(Label *label); 894 void bind(Label *label);
855 895
856 intptr_t CodeSize() const { return Buffer.size(); } 896 intptr_t CodeSize() const { return Buffer.size(); }
857 897
898 protected:
899 inline void emitUint8(uint8_t value);
900
858 private: 901 private:
859 inline void emitUint8(uint8_t value);
860 inline void emitInt16(int16_t value); 902 inline void emitInt16(int16_t value);
861 inline void emitInt32(int32_t value); 903 inline void emitInt32(int32_t value);
862 inline void emitRegisterOperand(int rm, int reg); 904 inline void emitRegisterOperand(int rm, int reg);
863 inline void emitXmmRegisterOperand(int rm, typename Traits::XmmRegister reg); 905 template <typename RegType, typename RmType>
906 inline void emitXmmRegisterOperand(RegType reg, RmType rm);
864 inline void emitFixup(AssemblerFixup *fixup); 907 inline void emitFixup(AssemblerFixup *fixup);
865 inline void emitOperandSizeOverride(); 908 inline void emitOperandSizeOverride();
866 909
867 void emitOperand(int rm, const typename Traits::Operand &operand); 910 void emitOperand(int rm, const typename Traits::Operand &operand);
868 void emitImmediate(Type ty, const Immediate &imm); 911 void emitImmediate(Type ty, const Immediate &imm);
869 void emitComplexI8(int rm, const typename Traits::Operand &operand, 912 void emitComplexI8(int rm, const typename Traits::Operand &operand,
870 const Immediate &immediate); 913 const Immediate &immediate);
871 void emitComplex(Type Ty, int rm, const typename Traits::Operand &operand, 914 void emitComplex(Type Ty, int rm, const typename Traits::Operand &operand,
872 const Immediate &immediate); 915 const Immediate &immediate);
873 void emitLabel(Label *label, intptr_t instruction_size); 916 void emitLabel(Label *label, intptr_t instruction_size);
(...skipping 29 matching lines...) Expand all
903 void arith_int(Type Ty, typename Traits::GPRRegister reg, 946 void arith_int(Type Ty, typename Traits::GPRRegister reg,
904 const typename Traits::Address &address); 947 const typename Traits::Address &address);
905 948
906 template <uint32_t Tag> 949 template <uint32_t Tag>
907 void arith_int(Type Ty, const typename Traits::Address &address, 950 void arith_int(Type Ty, const typename Traits::Address &address,
908 typename Traits::GPRRegister reg); 951 typename Traits::GPRRegister reg);
909 952
910 template <uint32_t Tag> 953 template <uint32_t Tag>
911 void arith_int(Type Ty, const typename Traits::Address &address, 954 void arith_int(Type Ty, const typename Traits::Address &address,
912 const Immediate &imm); 955 const Immediate &imm);
956
957 // gprEncoding returns Reg encoding for operand emission. For x86-64 we mask
958 // out the 4th bit as it is encoded in the REX.[RXB] bits. No other bits are
959 // touched because we don't want to mask errors.
960 template <typename RegType, typename T = Traits>
961 typename std::enable_if<T::Is64Bit, typename T::GPRRegister>::type
962 gprEncoding(const RegType Reg) {
963 static_assert(
964 &AssemblerX86Base<Machine>::gprEncoding<RegType> !=
965 &T::Assembler::template gprEncoding<RegType>,
966 "You need to define the gprEncoding() template in your assembler.");
967 return static_cast<typename T::Assembler *>(this)->gprEncoding(Reg);
968 }
969
970 template <typename RegType, typename T = Traits>
971 typename std::enable_if<!T::Is64Bit, typename T::GPRRegister>::type
972 gprEncoding(const RegType Reg) {
973 return static_cast<typename T::GPRRegister>(Reg);
974 }
975
976 // emitRex is used for emitting a Rex prefix for an address and a GPR. The
Jim Stichnoth 2015/07/26 15:31:11 Did you swap the description of emitRex and emitRe
John 2015/07/27 20:35:58 Yes I did. Done. On a related note, I changed thi
977 // address may contain zero, one, or two registers.
978 template <typename RegType, typename RmType, typename T = Traits>
979 typename std::enable_if<T::Is64Bit, void>::type
980 emitRexRB(const Type Ty, const RegType Reg, const RmType Rm) {
981 static_assert(
982 &AssemblerX86Base<Machine>::emitRexRB<RegType, RmType> !=
983 &T::Assembler::template emitRexRB<RegType, RmType>,
984 "You need to define the emitRexRB() template in your assembler.");
985 static_cast<typename T::Assembler *>(this)->emitRexRB(Ty, Reg, Rm);
986 }
987
988 template <typename RegType, typename RmType, typename T = Traits>
989 typename std::enable_if<!T::Is64Bit, void>::type
990 emitRexRB(const Type, const RegType, const RmType) {}
991
992 // emitRexB is used for emitting a Rex prefix if one is needed on encoding the
993 // Reg field in an x86 instruction. It is invoked by the template when Reg is
994 // the single register operand in the instruction (e.g., push Reg.)
995 template <typename RmType, typename T = Traits>
996 typename std::enable_if<T::Is64Bit, void>::type emitRexB(const Type Ty,
997 const RmType Rm) {
998 static_assert(
999 &AssemblerX86Base<Machine>::emitRexB<RmType> !=
1000 &T::Assembler::template emitRexB<RmType>,
1001 "You need to define the emitRexB() template in your assembler.");
1002 static_cast<typename T::Assembler *>(this)->emitRexB(Ty, Rm);
1003 }
1004
1005 template <typename RmType, typename T = Traits>
1006 typename std::enable_if<!T::Is64Bit, void>::type emitRexB(const Type,
1007 const RmType) {}
1008
1009 // emitRexRB is used for emitting a Rex prefix instructions with two explicit
1010 // register operands in its mod-rm byte.
1011 template <typename RegType, typename T = Traits>
1012 typename std::enable_if<T::Is64Bit, void>::type
1013 emitRex(const Type Ty, const typename Traits::Address &Addr,
1014 const RegType Reg) {
1015 static_assert(
1016 &AssemblerX86Base<Machine>::emitRex<RegType> !=
1017 &T::Assembler::template emitRex<RegType>,
1018 "You need to define the emitRex() template in your assembler.");
1019 static_cast<typename T::Assembler *>(this)
1020 ->emitRex(Ty, Addr, static_cast<typename Traits::GPRRegister>(Reg));
1021 }
1022
1023 template <typename RegType, typename T = Traits>
1024 typename std::enable_if<!T::Is64Bit, void>::type
1025 emitRex(const Type, const typename Traits::Address &, const RegType) {}
913 }; 1026 };
914 1027
915 template <class Machine> 1028 template <class Machine>
916 inline void AssemblerX86Base<Machine>::emitUint8(uint8_t value) { 1029 inline void AssemblerX86Base<Machine>::emitUint8(uint8_t value) {
917 Buffer.emit<uint8_t>(value); 1030 Buffer.emit<uint8_t>(value);
918 } 1031 }
919 1032
920 template <class Machine> 1033 template <class Machine>
921 inline void AssemblerX86Base<Machine>::emitInt16(int16_t value) { 1034 inline void AssemblerX86Base<Machine>::emitInt16(int16_t value) {
922 Buffer.emit<int16_t>(value); 1035 Buffer.emit<int16_t>(value);
923 } 1036 }
924 1037
925 template <class Machine> 1038 template <class Machine>
926 inline void AssemblerX86Base<Machine>::emitInt32(int32_t value) { 1039 inline void AssemblerX86Base<Machine>::emitInt32(int32_t value) {
927 Buffer.emit<int32_t>(value); 1040 Buffer.emit<int32_t>(value);
928 } 1041 }
929 1042
930 template <class Machine> 1043 template <class Machine>
931 inline void AssemblerX86Base<Machine>::emitRegisterOperand(int rm, int reg) { 1044 inline void AssemblerX86Base<Machine>::emitRegisterOperand(int reg, int rm) {
1045 assert(reg >= 0 && reg < 8);
932 assert(rm >= 0 && rm < 8); 1046 assert(rm >= 0 && rm < 8);
933 Buffer.emit<uint8_t>(0xC0 + (rm << 3) + reg); 1047 Buffer.emit<uint8_t>(0xC0 + (reg << 3) + rm);
934 } 1048 }
935 1049
936 template <class Machine> 1050 template <class Machine>
937 inline void AssemblerX86Base<Machine>::emitXmmRegisterOperand( 1051 template <typename RegType, typename RmType>
938 int rm, typename Traits::XmmRegister reg) { 1052 inline void AssemblerX86Base<Machine>::emitXmmRegisterOperand(RegType reg,
939 emitRegisterOperand(rm, static_cast<typename Traits::GPRRegister>(reg)); 1053 RmType rm) {
1054 emitRegisterOperand(gprEncoding(reg), gprEncoding(rm));
940 } 1055 }
941 1056
942 template <class Machine> 1057 template <class Machine>
943 inline void AssemblerX86Base<Machine>::emitFixup(AssemblerFixup *fixup) { 1058 inline void AssemblerX86Base<Machine>::emitFixup(AssemblerFixup *fixup) {
944 Buffer.emitFixup(fixup); 1059 Buffer.emitFixup(fixup);
945 } 1060 }
946 1061
947 template <class Machine> 1062 template <class Machine>
948 inline void AssemblerX86Base<Machine>::emitOperandSizeOverride() { 1063 inline void AssemblerX86Base<Machine>::emitOperandSizeOverride() {
949 emitUint8(0x66); 1064 emitUint8(0x66);
950 } 1065 }
951 1066
952 } // end of namespace X86Internal 1067 } // end of namespace X86Internal
953 1068
954 } // end of namespace Ice 1069 } // end of namespace Ice
955 1070
956 #include "IceAssemblerX86BaseImpl.h" 1071 #include "IceAssemblerX86BaseImpl.h"
957 1072
958 #endif // SUBZERO_SRC_ICEASSEMBLERX86BASE_H 1073 #endif // SUBZERO_SRC_ICEASSEMBLERX86BASE_H
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698