Changeset 39342 in webkit for trunk/JavaScriptCore/assembler/MacroAssembler.h
- Timestamp:
- Dec 16, 2008, 4:03:34 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/assembler/MacroAssembler.h
r39316 r39342 39 39 X86Assembler m_assembler; 40 40 41 #if PLATFORM(X86_64) 42 static const X86::RegisterID scratchRegister = X86::r11; 43 #endif 44 41 45 public: 42 46 typedef X86::RegisterID RegisterID; … … 522 526 m_assembler.movq_mr(address.offset, address.base, dest); 523 527 #else 524 load32(address, dest); 525 #endif 526 } 527 528 #if !PLATFORM(X86_64) 528 load32(address, dest); 529 #endif 530 } 531 529 532 void loadPtr(BaseIndex address, RegisterID dest) 530 533 { 534 #if PLATFORM(X86_64) 535 m_assembler.movq_mr(address.offset, address.base, address.index, address.scale, dest); 536 #else 531 537 load32(address, dest); 538 #endif 532 539 } 533 540 534 541 void loadPtr(void* address, RegisterID dest) 535 542 { 543 #if PLATFORM(X86_64) 544 if (dest == X86::eax) 545 m_assembler.movq_mEAX(address); 546 else { 547 move(X86::eax, dest); 548 m_assembler.movq_mEAX(address); 549 swap(X86::eax, dest); 550 } 551 #else 536 552 load32(address, dest); 537 } 538 #endif 553 #endif 554 } 539 555 540 556 void load32(ImplicitAddress address, RegisterID dest) … … 548 564 } 549 565 550 #if !PLATFORM(X86_64)551 566 void load32(void* address, RegisterID dest) 552 567 { 568 #if PLATFORM(X86_64) 569 if (dest == X86::eax) 570 m_assembler.movl_mEAX(address); 571 else { 572 move(X86::eax, dest); 573 m_assembler.movl_mEAX(address); 574 swap(X86::eax, dest); 575 } 576 #else 553 577 m_assembler.movl_mr(address, dest); 554 } 555 #endif 578 #endif 579 } 556 580 557 581 void load16(BaseIndex address, RegisterID dest) … … 565 589 m_assembler.movq_rm(src, address.offset, address.base); 566 590 #else 567 m_assembler.movl_rm(src, address.offset, address.base); 568 #endif 569 } 570 571 #if !PLATFORM(X86_64) 591 store32(src, address); 592 #endif 593 } 594 595 void storePtr(RegisterID src, BaseIndex address) 596 { 597 #if PLATFORM(X86_64) 598 m_assembler.movq_rm(src, address.offset, address.base, address.index, address.scale); 599 #else 600 store32(src, address); 601 #endif 602 } 603 572 604 void storePtr(ImmPtr imm, ImplicitAddress address) 573 605 { 606 #if PLATFORM(X86_64) 607 move(imm, scratchRegister); 608 storePtr(scratchRegister, address); 609 #else 574 610 m_assembler.movl_i32m(reinterpret_cast<unsigned>(imm.m_value), address.offset, address.base); 575 } 576 577 void storePtr(RegisterID src, BaseIndex address) 578 { 579 store32(src, address); 611 #endif 580 612 } 581 613 582 614 DataLabelPtr storePtrWithRepatch(Address address) 583 615 { 616 #if PLATFORM(X86_64) 617 m_assembler.movq_i64r(0, scratchRegister); 618 DataLabelPtr label(this); 619 storePtr(scratchRegister, address); 620 return label; 621 #else 584 622 m_assembler.movl_i32m(0, address.offset, address.base); 585 623 return DataLabelPtr(this); 586 } 587 #endif 624 #endif 625 } 588 626 589 627 void store32(RegisterID src, ImplicitAddress address) … … 602 640 } 603 641 604 #if !PLATFORM(X86_64)605 642 void store32(Imm32 imm, void* address) 606 643 { 644 #if PLATFORM(X86_64) 645 move(X86::eax, scratchRegister); 646 move(imm, X86::eax); 647 m_assembler.movl_EAXm(address); 648 move(scratchRegister, X86::eax); 649 #else 607 650 m_assembler.movl_i32m(imm.m_value, address); 608 } 609 #endif 651 #endif 652 } 610 653 611 654 … … 648 691 } 649 692 650 #if !PLATFORM(X86_64)651 693 void poke(ImmPtr imm, int index = 0) 652 694 { 653 695 storePtr(imm, Address(X86::esp, (index * sizeof(void *)))); 654 696 } 655 #endif656 697 657 698 // Register move operations: … … 680 721 } 681 722 682 #if !PLATFORM(X86_64)683 723 void move(ImmPtr imm, RegisterID dest) 684 724 { 725 #if PLATFORM(X86_64) 726 m_assembler.movq_i64r(reinterpret_cast<int64_t>(imm.m_value), dest); 727 #else 685 728 m_assembler.movl_i32r(reinterpret_cast<int32_t>(imm.m_value), dest); 686 } 687 #endif 729 #endif 730 } 688 731 689 732 void swap(RegisterID reg1, RegisterID reg2) … … 772 815 m_assembler.testq_i32r(mask.m_value, reg); 773 816 } 817 818 void testImm64(Address address, Imm32 mask) 819 { 820 if (mask.m_value == -1) 821 m_assembler.cmpq_im(0, address.offset, address.base); 822 else 823 m_assembler.testq_i32m(mask.m_value, address.offset, address.base); 824 } 825 826 void testImm64(BaseIndex address, Imm32 mask) 827 { 828 if (mask.m_value == -1) 829 m_assembler.cmpq_im(0, address.offset, address.base, address.index, address.scale); 830 else 831 m_assembler.testq_i32m(mask.m_value, address.offset, address.base, address.index, address.scale); 832 } 774 833 #endif 775 834 … … 799 858 } 800 859 801 #if !PLATFORM(X86_64)802 860 Jump jePtr(RegisterID op1, RegisterID op2) 803 861 { 862 #if PLATFORM(X86_64) 863 m_assembler.cmpq_rr(op1, op2); 864 return Jump(m_assembler.je()); 865 #else 804 866 return je32(op1, op2); 805 } 806 #endif 867 #endif 868 } 807 869 808 870 Jump je32(RegisterID op1, RegisterID op2) … … 884 946 } 885 947 886 #if !PLATFORM(X86_64) 948 Jump jnePtr(RegisterID op1, RegisterID op2) 949 { 950 #if PLATFORM(X86_64) 951 m_assembler.cmpq_rr(op1, op2); 952 return Jump(m_assembler.jne()); 953 #else 954 return jne32(op1, op2); 955 #endif 956 } 957 887 958 Jump jnePtr(RegisterID reg, Address address) 959 { 960 #if PLATFORM(X86_64) 961 m_assembler.cmpq_rm(reg, address.offset, address.base); 962 #else 963 m_assembler.cmpl_rm(reg, address.offset, address.base); 964 #endif 965 return Jump(m_assembler.jne()); 966 } 967 968 Jump jnePtr(RegisterID reg, ImmPtr imm) 969 { 970 #if PLATFORM(X86_64) 971 move(imm, scratchRegister); 972 return jnePtr(scratchRegister, reg); 973 #else 974 return jne32(reg, Imm32(reinterpret_cast<int32_t>(imm.m_value))); 975 #endif 976 } 977 978 Jump jnePtr(Address address, ImmPtr imm) 979 { 980 #if PLATFORM(X86_64) 981 move(imm, scratchRegister); 982 return jnePtr(scratchRegister, address); 983 #else 984 return jne32(address, Imm32(reinterpret_cast<int32_t>(imm.m_value))); 985 #endif 986 } 987 988 Jump jne32(RegisterID op1, RegisterID op2) 989 { 990 m_assembler.cmpl_rr(op1, op2); 991 return Jump(m_assembler.jne()); 992 } 993 994 Jump jne32(RegisterID reg, Imm32 imm) 995 { 996 compareImm32ForBranchEquality(reg, imm.m_value); 997 return Jump(m_assembler.jne()); 998 } 999 1000 Jump jne32(Address address, Imm32 imm) 1001 { 1002 compareImm32ForBranchEquality(address, imm.m_value); 1003 return Jump(m_assembler.jne()); 1004 } 1005 1006 Jump jne32(Address address, RegisterID reg) 888 1007 { 889 1008 m_assembler.cmpl_rm(reg, address.offset, address.base); 890 1009 return Jump(m_assembler.jne()); 891 1010 } 892 893 Jump jnePtr(Address address, ImmPtr imm)894 {895 return jne32(address, Imm32(reinterpret_cast<int32_t>(imm.m_value)));896 }897 #endif898 899 Jump jne32(RegisterID op1, RegisterID op2)900 {901 m_assembler.cmpl_rr(op1, op2);902 return Jump(m_assembler.jne());903 }904 905 Jump jne32(RegisterID reg, Imm32 imm)906 {907 compareImm32ForBranchEquality(reg, imm.m_value);908 return Jump(m_assembler.jne());909 }910 911 Jump jne32(Address address, Imm32 imm)912 {913 compareImm32ForBranchEquality(address, imm.m_value);914 return Jump(m_assembler.jne());915 }916 917 Jump jne32(Address address, RegisterID reg)918 {919 m_assembler.cmpl_rm(reg, address.offset, address.base);920 return Jump(m_assembler.jne());921 }922 1011 923 1012 Jump jnzPtr(RegisterID reg, Imm32 mask = Imm32(-1)) … … 931 1020 } 932 1021 933 #if !PLATFORM(X86_64)934 1022 Jump jnzPtr(Address address, Imm32 mask = Imm32(-1)) 935 1023 { 1024 #if PLATFORM(X86_64) 1025 testImm64(address, mask); 1026 return Jump(m_assembler.jne()); 1027 #else 936 1028 return jnz32(address, mask); 937 } 938 #endif 1029 #endif 1030 } 939 1031 940 1032 Jump jnz32(RegisterID reg, Imm32 mask = Imm32(-1)) … … 950 1042 } 951 1043 952 #if !PLATFORM(X86_64)953 1044 Jump jzPtr(RegisterID reg, Imm32 mask = Imm32(-1)) 954 1045 { 1046 #if PLATFORM(X86_64) 1047 testImm64(reg, mask); 1048 return Jump(m_assembler.je()); 1049 #else 955 1050 return jz32(reg, mask); 1051 #endif 956 1052 } 957 1053 958 1054 Jump jzPtr(Address address, Imm32 mask = Imm32(-1)) 959 1055 { 1056 #if PLATFORM(X86_64) 1057 testImm64(address, mask); 1058 return Jump(m_assembler.je()); 1059 #else 960 1060 return jz32(address, mask); 1061 #endif 961 1062 } 962 1063 963 1064 Jump jzPtr(BaseIndex address, Imm32 mask = Imm32(-1)) 964 1065 { 1066 #if PLATFORM(X86_64) 1067 testImm64(address, mask); 1068 return Jump(m_assembler.je()); 1069 #else 965 1070 return jz32(address, mask); 966 } 967 #endif 1071 #endif 1072 } 968 1073 969 1074 Jump jz32(RegisterID reg, Imm32 mask = Imm32(-1)) … … 1046 1151 } 1047 1152 1048 #if !PLATFORM(X86_64)1049 1153 void jzPtr(RegisterID reg, Label target) 1050 1154 { 1051 1155 jzPtr(reg).linkTo(target, this); 1052 1156 } 1053 #endif1054 1157 1055 1158 void jump(Label target)
Note:
See TracChangeset
for help on using the changeset viewer.