Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |