OLD | NEW |
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 | 5 // modification, are permitted provided that the following conditions |
6 // are met: | 6 // are 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 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 PrintF("val = %" V8PRIdPTR ", 0x%" V8PRIxPTR | 635 PrintF("val = %" V8PRIdPTR ", 0x%" V8PRIxPTR |
636 ", is_unsigned_imm16(val)=%d, kImm16Mask=0x%x\n", | 636 ", is_unsigned_imm16(val)=%d, kImm16Mask=0x%x\n", |
637 val, val, is_uint16(val), kImm16Mask); | 637 val, val, is_uint16(val), kImm16Mask); |
638 } | 638 } |
639 CHECK(is_uint16(val)); | 639 CHECK(is_uint16(val)); |
640 } | 640 } |
641 emit(instr | rt.code() * B21 | ra.code() * B16 | (kImm16Mask & val)); | 641 emit(instr | rt.code() * B21 | ra.code() * B16 | (kImm16Mask & val)); |
642 } | 642 } |
643 | 643 |
644 | 644 |
645 void Assembler::x_form(Instr instr, Register ra, Register rs, Register rb, | |
646 RCBit r) { | |
647 emit(instr | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | r); | |
648 } | |
649 | |
650 void Assembler::xo_form(Instr instr, Register rt, Register ra, Register rb, | 645 void Assembler::xo_form(Instr instr, Register rt, Register ra, Register rb, |
651 OEBit o, RCBit r) { | 646 OEBit o, RCBit r) { |
652 emit(instr | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | o | r); | 647 emit(instr | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | o | r); |
653 } | 648 } |
654 | 649 |
655 void Assembler::md_form(Instr instr, Register ra, Register rs, int shift, | 650 void Assembler::md_form(Instr instr, Register ra, Register rs, int shift, |
656 int maskbit, RCBit r) { | 651 int maskbit, RCBit r) { |
657 int sh0_4 = shift & 0x1f; | 652 int sh0_4 = shift & 0x1f; |
658 int sh5 = (shift >> 5) & 0x1; | 653 int sh5 = (shift >> 5) & 0x1; |
659 int m0_4 = maskbit & 0x1f; | 654 int m0_4 = maskbit & 0x1f; |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 void Assembler::xori(Register dst, Register src, const Operand& imm) { | 746 void Assembler::xori(Register dst, Register src, const Operand& imm) { |
752 d_form(XORI, src, dst, imm.imm_, false); | 747 d_form(XORI, src, dst, imm.imm_, false); |
753 } | 748 } |
754 | 749 |
755 | 750 |
756 void Assembler::xoris(Register ra, Register rs, const Operand& imm) { | 751 void Assembler::xoris(Register ra, Register rs, const Operand& imm) { |
757 d_form(XORIS, rs, ra, imm.imm_, false); | 752 d_form(XORIS, rs, ra, imm.imm_, false); |
758 } | 753 } |
759 | 754 |
760 | 755 |
761 void Assembler::xor_(Register dst, Register src1, Register src2, RCBit rc) { | |
762 x_form(EXT2 | XORX, dst, src1, src2, rc); | |
763 } | |
764 | |
765 | |
766 void Assembler::cntlzw_(Register ra, Register rs, RCBit rc) { | |
767 x_form(EXT2 | CNTLZWX, ra, rs, r0, rc); | |
768 } | |
769 | |
770 | |
771 void Assembler::popcntw(Register ra, Register rs) { | |
772 emit(EXT2 | POPCNTW | rs.code() * B21 | ra.code() * B16); | |
773 } | |
774 | |
775 | |
776 void Assembler::and_(Register ra, Register rs, Register rb, RCBit rc) { | |
777 x_form(EXT2 | ANDX, ra, rs, rb, rc); | |
778 } | |
779 | |
780 | |
781 void Assembler::rlwinm(Register ra, Register rs, int sh, int mb, int me, | 756 void Assembler::rlwinm(Register ra, Register rs, int sh, int mb, int me, |
782 RCBit rc) { | 757 RCBit rc) { |
783 sh &= 0x1f; | 758 sh &= 0x1f; |
784 mb &= 0x1f; | 759 mb &= 0x1f; |
785 me &= 0x1f; | 760 me &= 0x1f; |
786 emit(RLWINMX | rs.code() * B21 | ra.code() * B16 | sh * B11 | mb * B6 | | 761 emit(RLWINMX | rs.code() * B21 | ra.code() * B16 | sh * B11 | mb * B6 | |
787 me << 1 | rc); | 762 me << 1 | rc); |
788 } | 763 } |
789 | 764 |
790 | 765 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 } | 801 } |
827 | 802 |
828 | 803 |
829 void Assembler::clrlwi(Register dst, Register src, const Operand& val, | 804 void Assembler::clrlwi(Register dst, Register src, const Operand& val, |
830 RCBit rc) { | 805 RCBit rc) { |
831 DCHECK((32 > val.imm_) && (val.imm_ >= 0)); | 806 DCHECK((32 > val.imm_) && (val.imm_ >= 0)); |
832 rlwinm(dst, src, 0, val.imm_, 31, rc); | 807 rlwinm(dst, src, 0, val.imm_, 31, rc); |
833 } | 808 } |
834 | 809 |
835 | 810 |
836 void Assembler::srawi(Register ra, Register rs, int sh, RCBit r) { | |
837 emit(EXT2 | SRAWIX | rs.code() * B21 | ra.code() * B16 | sh * B11 | r); | |
838 } | |
839 | |
840 | |
841 void Assembler::srw(Register dst, Register src1, Register src2, RCBit r) { | |
842 x_form(EXT2 | SRWX, dst, src1, src2, r); | |
843 } | |
844 | |
845 | |
846 void Assembler::slw(Register dst, Register src1, Register src2, RCBit r) { | |
847 x_form(EXT2 | SLWX, dst, src1, src2, r); | |
848 } | |
849 | |
850 | |
851 void Assembler::sraw(Register ra, Register rs, Register rb, RCBit r) { | |
852 x_form(EXT2 | SRAW, ra, rs, rb, r); | |
853 } | |
854 | |
855 | |
856 void Assembler::rotlw(Register ra, Register rs, Register rb, RCBit r) { | 811 void Assembler::rotlw(Register ra, Register rs, Register rb, RCBit r) { |
857 rlwnm(ra, rs, rb, 0, 31, r); | 812 rlwnm(ra, rs, rb, 0, 31, r); |
858 } | 813 } |
859 | 814 |
860 | 815 |
861 void Assembler::rotlwi(Register ra, Register rs, int sh, RCBit r) { | 816 void Assembler::rotlwi(Register ra, Register rs, int sh, RCBit r) { |
862 rlwinm(ra, rs, sh, 0, 31, r); | 817 rlwinm(ra, rs, sh, 0, 31, r); |
863 } | 818 } |
864 | 819 |
865 | 820 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 xo_form(EXT2 | DIVW, dst, src1, src2, o, r); | 894 xo_form(EXT2 | DIVW, dst, src1, src2, o, r); |
940 } | 895 } |
941 | 896 |
942 | 897 |
943 // Divide word unsigned | 898 // Divide word unsigned |
944 void Assembler::divwu(Register dst, Register src1, Register src2, OEBit o, | 899 void Assembler::divwu(Register dst, Register src1, Register src2, OEBit o, |
945 RCBit r) { | 900 RCBit r) { |
946 xo_form(EXT2 | DIVWU, dst, src1, src2, o, r); | 901 xo_form(EXT2 | DIVWU, dst, src1, src2, o, r); |
947 } | 902 } |
948 | 903 |
949 void Assembler::modsw(Register rt, Register ra, Register rb) { | |
950 x_form(EXT2 | MODSW, ra, rt, rb, LeaveRC); | |
951 } | |
952 | |
953 void Assembler::moduw(Register rt, Register ra, Register rb) { | |
954 x_form(EXT2 | MODUW, ra, rt, rb, LeaveRC); | |
955 } | |
956 | 904 |
957 void Assembler::addi(Register dst, Register src, const Operand& imm) { | 905 void Assembler::addi(Register dst, Register src, const Operand& imm) { |
958 DCHECK(!src.is(r0)); // use li instead to show intent | 906 DCHECK(!src.is(r0)); // use li instead to show intent |
959 d_form(ADDI, dst, src, imm.imm_, true); | 907 d_form(ADDI, dst, src, imm.imm_, true); |
960 } | 908 } |
961 | 909 |
962 | 910 |
963 void Assembler::addis(Register dst, Register src, const Operand& imm) { | 911 void Assembler::addis(Register dst, Register src, const Operand& imm) { |
964 DCHECK(!src.is(r0)); // use lis instead to show intent | 912 DCHECK(!src.is(r0)); // use lis instead to show intent |
965 d_form(ADDIS, dst, src, imm.imm_, true); | 913 d_form(ADDIS, dst, src, imm.imm_, true); |
966 } | 914 } |
967 | 915 |
968 | 916 |
969 void Assembler::addic(Register dst, Register src, const Operand& imm) { | 917 void Assembler::addic(Register dst, Register src, const Operand& imm) { |
970 d_form(ADDIC, dst, src, imm.imm_, true); | 918 d_form(ADDIC, dst, src, imm.imm_, true); |
971 } | 919 } |
972 | 920 |
973 | 921 |
974 void Assembler::andi(Register ra, Register rs, const Operand& imm) { | 922 void Assembler::andi(Register ra, Register rs, const Operand& imm) { |
975 d_form(ANDIx, rs, ra, imm.imm_, false); | 923 d_form(ANDIx, rs, ra, imm.imm_, false); |
976 } | 924 } |
977 | 925 |
978 | 926 |
979 void Assembler::andis(Register ra, Register rs, const Operand& imm) { | 927 void Assembler::andis(Register ra, Register rs, const Operand& imm) { |
980 d_form(ANDISx, rs, ra, imm.imm_, false); | 928 d_form(ANDISx, rs, ra, imm.imm_, false); |
981 } | 929 } |
982 | 930 |
983 | 931 |
984 void Assembler::nor(Register dst, Register src1, Register src2, RCBit r) { | |
985 x_form(EXT2 | NORX, dst, src1, src2, r); | |
986 } | |
987 | |
988 | |
989 void Assembler::notx(Register dst, Register src, RCBit r) { | |
990 x_form(EXT2 | NORX, dst, src, src, r); | |
991 } | |
992 | |
993 | |
994 void Assembler::ori(Register ra, Register rs, const Operand& imm) { | 932 void Assembler::ori(Register ra, Register rs, const Operand& imm) { |
995 d_form(ORI, rs, ra, imm.imm_, false); | 933 d_form(ORI, rs, ra, imm.imm_, false); |
996 } | 934 } |
997 | 935 |
998 | 936 |
999 void Assembler::oris(Register dst, Register src, const Operand& imm) { | 937 void Assembler::oris(Register dst, Register src, const Operand& imm) { |
1000 d_form(ORIS, src, dst, imm.imm_, false); | 938 d_form(ORIS, src, dst, imm.imm_, false); |
1001 } | 939 } |
1002 | 940 |
1003 | 941 |
1004 void Assembler::orx(Register dst, Register src1, Register src2, RCBit rc) { | |
1005 x_form(EXT2 | ORX, dst, src1, src2, rc); | |
1006 } | |
1007 | |
1008 | |
1009 void Assembler::orc(Register dst, Register src1, Register src2, RCBit rc) { | |
1010 x_form(EXT2 | ORC, dst, src1, src2, rc); | |
1011 } | |
1012 | |
1013 | |
1014 void Assembler::cmpi(Register src1, const Operand& src2, CRegister cr) { | 942 void Assembler::cmpi(Register src1, const Operand& src2, CRegister cr) { |
1015 intptr_t imm16 = src2.imm_; | 943 intptr_t imm16 = src2.imm_; |
1016 #if V8_TARGET_ARCH_PPC64 | 944 #if V8_TARGET_ARCH_PPC64 |
1017 int L = 1; | 945 int L = 1; |
1018 #else | 946 #else |
1019 int L = 0; | 947 int L = 0; |
1020 #endif | 948 #endif |
1021 DCHECK(is_int16(imm16)); | 949 DCHECK(is_int16(imm16)); |
1022 DCHECK(cr.code() >= 0 && cr.code() <= 7); | 950 DCHECK(cr.code() >= 0 && cr.code() <= 7); |
1023 imm16 &= kImm16Mask; | 951 imm16 &= kImm16Mask; |
1024 emit(CMPI | cr.code() * B23 | L * B21 | src1.code() * B16 | imm16); | 952 emit(CMPI | cr.code() * B23 | L * B21 | src1.code() * B16 | imm16); |
1025 } | 953 } |
1026 | 954 |
1027 | 955 |
1028 void Assembler::cmpli(Register src1, const Operand& src2, CRegister cr) { | 956 void Assembler::cmpli(Register src1, const Operand& src2, CRegister cr) { |
1029 uintptr_t uimm16 = src2.imm_; | 957 uintptr_t uimm16 = src2.imm_; |
1030 #if V8_TARGET_ARCH_PPC64 | 958 #if V8_TARGET_ARCH_PPC64 |
1031 int L = 1; | 959 int L = 1; |
1032 #else | 960 #else |
1033 int L = 0; | 961 int L = 0; |
1034 #endif | 962 #endif |
1035 DCHECK(is_uint16(uimm16)); | 963 DCHECK(is_uint16(uimm16)); |
1036 DCHECK(cr.code() >= 0 && cr.code() <= 7); | 964 DCHECK(cr.code() >= 0 && cr.code() <= 7); |
1037 uimm16 &= kImm16Mask; | 965 uimm16 &= kImm16Mask; |
1038 emit(CMPLI | cr.code() * B23 | L * B21 | src1.code() * B16 | uimm16); | 966 emit(CMPLI | cr.code() * B23 | L * B21 | src1.code() * B16 | uimm16); |
1039 } | 967 } |
1040 | 968 |
1041 | 969 |
1042 void Assembler::cmp(Register src1, Register src2, CRegister cr) { | |
1043 #if V8_TARGET_ARCH_PPC64 | |
1044 int L = 1; | |
1045 #else | |
1046 int L = 0; | |
1047 #endif | |
1048 DCHECK(cr.code() >= 0 && cr.code() <= 7); | |
1049 emit(EXT2 | CMP | cr.code() * B23 | L * B21 | src1.code() * B16 | | |
1050 src2.code() * B11); | |
1051 } | |
1052 | |
1053 | |
1054 void Assembler::cmpl(Register src1, Register src2, CRegister cr) { | |
1055 #if V8_TARGET_ARCH_PPC64 | |
1056 int L = 1; | |
1057 #else | |
1058 int L = 0; | |
1059 #endif | |
1060 DCHECK(cr.code() >= 0 && cr.code() <= 7); | |
1061 emit(EXT2 | CMPL | cr.code() * B23 | L * B21 | src1.code() * B16 | | |
1062 src2.code() * B11); | |
1063 } | |
1064 | |
1065 | |
1066 void Assembler::cmpwi(Register src1, const Operand& src2, CRegister cr) { | 970 void Assembler::cmpwi(Register src1, const Operand& src2, CRegister cr) { |
1067 intptr_t imm16 = src2.imm_; | 971 intptr_t imm16 = src2.imm_; |
1068 int L = 0; | 972 int L = 0; |
1069 int pos = pc_offset(); | 973 int pos = pc_offset(); |
1070 DCHECK(is_int16(imm16)); | 974 DCHECK(is_int16(imm16)); |
1071 DCHECK(cr.code() >= 0 && cr.code() <= 7); | 975 DCHECK(cr.code() >= 0 && cr.code() <= 7); |
1072 imm16 &= kImm16Mask; | 976 imm16 &= kImm16Mask; |
1073 | 977 |
1074 // For cmpwi against 0, save postition and cr for later examination | 978 // For cmpwi against 0, save postition and cr for later examination |
1075 // of potential optimization. | 979 // of potential optimization. |
1076 if (imm16 == 0 && pos > 0 && last_bound_pos_ != pos) { | 980 if (imm16 == 0 && pos > 0 && last_bound_pos_ != pos) { |
1077 optimizable_cmpi_pos_ = pos; | 981 optimizable_cmpi_pos_ = pos; |
1078 cmpi_cr_ = cr; | 982 cmpi_cr_ = cr; |
1079 } | 983 } |
1080 emit(CMPI | cr.code() * B23 | L * B21 | src1.code() * B16 | imm16); | 984 emit(CMPI | cr.code() * B23 | L * B21 | src1.code() * B16 | imm16); |
1081 } | 985 } |
1082 | 986 |
1083 | 987 |
1084 void Assembler::cmplwi(Register src1, const Operand& src2, CRegister cr) { | 988 void Assembler::cmplwi(Register src1, const Operand& src2, CRegister cr) { |
1085 uintptr_t uimm16 = src2.imm_; | 989 uintptr_t uimm16 = src2.imm_; |
1086 int L = 0; | 990 int L = 0; |
1087 DCHECK(is_uint16(uimm16)); | 991 DCHECK(is_uint16(uimm16)); |
1088 DCHECK(cr.code() >= 0 && cr.code() <= 7); | 992 DCHECK(cr.code() >= 0 && cr.code() <= 7); |
1089 uimm16 &= kImm16Mask; | 993 uimm16 &= kImm16Mask; |
1090 emit(CMPLI | cr.code() * B23 | L * B21 | src1.code() * B16 | uimm16); | 994 emit(CMPLI | cr.code() * B23 | L * B21 | src1.code() * B16 | uimm16); |
1091 } | 995 } |
1092 | 996 |
1093 | 997 |
1094 void Assembler::cmpw(Register src1, Register src2, CRegister cr) { | |
1095 int L = 0; | |
1096 DCHECK(cr.code() >= 0 && cr.code() <= 7); | |
1097 emit(EXT2 | CMP | cr.code() * B23 | L * B21 | src1.code() * B16 | | |
1098 src2.code() * B11); | |
1099 } | |
1100 | |
1101 | |
1102 void Assembler::cmplw(Register src1, Register src2, CRegister cr) { | |
1103 int L = 0; | |
1104 DCHECK(cr.code() >= 0 && cr.code() <= 7); | |
1105 emit(EXT2 | CMPL | cr.code() * B23 | L * B21 | src1.code() * B16 | | |
1106 src2.code() * B11); | |
1107 } | |
1108 | |
1109 | |
1110 void Assembler::isel(Register rt, Register ra, Register rb, int cb) { | 998 void Assembler::isel(Register rt, Register ra, Register rb, int cb) { |
1111 emit(EXT2 | ISEL | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | 999 emit(EXT2 | ISEL | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | |
1112 cb * B6); | 1000 cb * B6); |
1113 } | 1001 } |
1114 | 1002 |
1115 | 1003 |
1116 // Pseudo op - load immediate | 1004 // Pseudo op - load immediate |
1117 void Assembler::li(Register dst, const Operand& imm) { | 1005 void Assembler::li(Register dst, const Operand& imm) { |
1118 d_form(ADDI, dst, r0, imm.imm_, true); | 1006 d_form(ADDI, dst, r0, imm.imm_, true); |
1119 } | 1007 } |
(...skipping 10 matching lines...) Expand all Loading... |
1130 orx(dst, src, src); | 1018 orx(dst, src, src); |
1131 } | 1019 } |
1132 | 1020 |
1133 | 1021 |
1134 void Assembler::lbz(Register dst, const MemOperand& src) { | 1022 void Assembler::lbz(Register dst, const MemOperand& src) { |
1135 DCHECK(!src.ra_.is(r0)); | 1023 DCHECK(!src.ra_.is(r0)); |
1136 d_form(LBZ, dst, src.ra(), src.offset(), true); | 1024 d_form(LBZ, dst, src.ra(), src.offset(), true); |
1137 } | 1025 } |
1138 | 1026 |
1139 | 1027 |
1140 void Assembler::lbzx(Register rt, const MemOperand& src) { | |
1141 Register ra = src.ra(); | |
1142 Register rb = src.rb(); | |
1143 DCHECK(!ra.is(r0)); | |
1144 emit(EXT2 | LBZX | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
1145 LeaveRC); | |
1146 } | |
1147 | |
1148 | |
1149 void Assembler::lbzux(Register rt, const MemOperand& src) { | |
1150 Register ra = src.ra(); | |
1151 Register rb = src.rb(); | |
1152 DCHECK(!ra.is(r0)); | |
1153 emit(EXT2 | LBZUX | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
1154 LeaveRC); | |
1155 } | |
1156 | |
1157 | |
1158 void Assembler::lhz(Register dst, const MemOperand& src) { | 1028 void Assembler::lhz(Register dst, const MemOperand& src) { |
1159 DCHECK(!src.ra_.is(r0)); | 1029 DCHECK(!src.ra_.is(r0)); |
1160 d_form(LHZ, dst, src.ra(), src.offset(), true); | 1030 d_form(LHZ, dst, src.ra(), src.offset(), true); |
1161 } | 1031 } |
1162 | 1032 |
1163 | 1033 |
1164 void Assembler::lhzx(Register rt, const MemOperand& src) { | |
1165 Register ra = src.ra(); | |
1166 Register rb = src.rb(); | |
1167 DCHECK(!ra.is(r0)); | |
1168 emit(EXT2 | LHZX | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
1169 LeaveRC); | |
1170 } | |
1171 | |
1172 | |
1173 void Assembler::lhzux(Register rt, const MemOperand& src) { | |
1174 Register ra = src.ra(); | |
1175 Register rb = src.rb(); | |
1176 DCHECK(!ra.is(r0)); | |
1177 emit(EXT2 | LHZUX | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
1178 LeaveRC); | |
1179 } | |
1180 | |
1181 | |
1182 void Assembler::lhax(Register rt, const MemOperand& src) { | |
1183 Register ra = src.ra(); | |
1184 Register rb = src.rb(); | |
1185 DCHECK(!ra.is(r0)); | |
1186 emit(EXT2 | LHAX | rt.code() * B21 | ra.code() * B16 | rb.code() * B11); | |
1187 } | |
1188 | |
1189 | |
1190 void Assembler::lwz(Register dst, const MemOperand& src) { | 1034 void Assembler::lwz(Register dst, const MemOperand& src) { |
1191 DCHECK(!src.ra_.is(r0)); | 1035 DCHECK(!src.ra_.is(r0)); |
1192 d_form(LWZ, dst, src.ra(), src.offset(), true); | 1036 d_form(LWZ, dst, src.ra(), src.offset(), true); |
1193 } | 1037 } |
1194 | 1038 |
1195 | 1039 |
1196 void Assembler::lwzu(Register dst, const MemOperand& src) { | 1040 void Assembler::lwzu(Register dst, const MemOperand& src) { |
1197 DCHECK(!src.ra_.is(r0)); | 1041 DCHECK(!src.ra_.is(r0)); |
1198 d_form(LWZU, dst, src.ra(), src.offset(), true); | 1042 d_form(LWZU, dst, src.ra(), src.offset(), true); |
1199 } | 1043 } |
1200 | 1044 |
1201 | 1045 |
1202 void Assembler::lwzx(Register rt, const MemOperand& src) { | |
1203 Register ra = src.ra(); | |
1204 Register rb = src.rb(); | |
1205 DCHECK(!ra.is(r0)); | |
1206 emit(EXT2 | LWZX | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
1207 LeaveRC); | |
1208 } | |
1209 | |
1210 | |
1211 void Assembler::lwzux(Register rt, const MemOperand& src) { | |
1212 Register ra = src.ra(); | |
1213 Register rb = src.rb(); | |
1214 DCHECK(!ra.is(r0)); | |
1215 emit(EXT2 | LWZUX | rt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
1216 LeaveRC); | |
1217 } | |
1218 | |
1219 | |
1220 void Assembler::lha(Register dst, const MemOperand& src) { | 1046 void Assembler::lha(Register dst, const MemOperand& src) { |
1221 DCHECK(!src.ra_.is(r0)); | 1047 DCHECK(!src.ra_.is(r0)); |
1222 d_form(LHA, dst, src.ra(), src.offset(), true); | 1048 d_form(LHA, dst, src.ra(), src.offset(), true); |
1223 } | 1049 } |
1224 | 1050 |
1225 | 1051 |
1226 void Assembler::lwa(Register dst, const MemOperand& src) { | 1052 void Assembler::lwa(Register dst, const MemOperand& src) { |
1227 #if V8_TARGET_ARCH_PPC64 | 1053 #if V8_TARGET_ARCH_PPC64 |
1228 int offset = src.offset(); | 1054 int offset = src.offset(); |
1229 DCHECK(!src.ra_.is(r0)); | 1055 DCHECK(!src.ra_.is(r0)); |
1230 CHECK(!(offset & 3) && is_int16(offset)); | 1056 CHECK(!(offset & 3) && is_int16(offset)); |
1231 offset = kImm16Mask & offset; | 1057 offset = kImm16Mask & offset; |
1232 emit(LD | dst.code() * B21 | src.ra().code() * B16 | offset | 2); | 1058 emit(LD | dst.code() * B21 | src.ra().code() * B16 | offset | 2); |
1233 #else | 1059 #else |
1234 lwz(dst, src); | 1060 lwz(dst, src); |
1235 #endif | 1061 #endif |
1236 } | 1062 } |
1237 | 1063 |
1238 | 1064 |
1239 void Assembler::lwax(Register rt, const MemOperand& src) { | |
1240 #if V8_TARGET_ARCH_PPC64 | |
1241 Register ra = src.ra(); | |
1242 Register rb = src.rb(); | |
1243 DCHECK(!ra.is(r0)); | |
1244 emit(EXT2 | LWAX | rt.code() * B21 | ra.code() * B16 | rb.code() * B11); | |
1245 #else | |
1246 lwzx(rt, src); | |
1247 #endif | |
1248 } | |
1249 | |
1250 | |
1251 void Assembler::ldbrx(Register dst, const MemOperand& src) { | |
1252 x_form(EXT2 | LDBRX, src.ra(), dst, src.rb(), LeaveRC); | |
1253 } | |
1254 | |
1255 | |
1256 void Assembler::lwbrx(Register dst, const MemOperand& src) { | |
1257 x_form(EXT2 | LWBRX, src.ra(), dst, src.rb(), LeaveRC); | |
1258 } | |
1259 | |
1260 | |
1261 void Assembler::lhbrx(Register dst, const MemOperand& src) { | |
1262 x_form(EXT2 | LHBRX, src.ra(), dst, src.rb(), LeaveRC); | |
1263 } | |
1264 | |
1265 | |
1266 void Assembler::stb(Register dst, const MemOperand& src) { | 1065 void Assembler::stb(Register dst, const MemOperand& src) { |
1267 DCHECK(!src.ra_.is(r0)); | 1066 DCHECK(!src.ra_.is(r0)); |
1268 d_form(STB, dst, src.ra(), src.offset(), true); | 1067 d_form(STB, dst, src.ra(), src.offset(), true); |
1269 } | 1068 } |
1270 | 1069 |
1271 | 1070 |
1272 void Assembler::stbx(Register rs, const MemOperand& src) { | |
1273 Register ra = src.ra(); | |
1274 Register rb = src.rb(); | |
1275 DCHECK(!ra.is(r0)); | |
1276 emit(EXT2 | STBX | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
1277 LeaveRC); | |
1278 } | |
1279 | |
1280 | |
1281 void Assembler::stbux(Register rs, const MemOperand& src) { | |
1282 Register ra = src.ra(); | |
1283 Register rb = src.rb(); | |
1284 DCHECK(!ra.is(r0)); | |
1285 emit(EXT2 | STBUX | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
1286 LeaveRC); | |
1287 } | |
1288 | |
1289 | |
1290 void Assembler::sth(Register dst, const MemOperand& src) { | 1071 void Assembler::sth(Register dst, const MemOperand& src) { |
1291 DCHECK(!src.ra_.is(r0)); | 1072 DCHECK(!src.ra_.is(r0)); |
1292 d_form(STH, dst, src.ra(), src.offset(), true); | 1073 d_form(STH, dst, src.ra(), src.offset(), true); |
1293 } | 1074 } |
1294 | 1075 |
1295 | 1076 |
1296 void Assembler::sthx(Register rs, const MemOperand& src) { | |
1297 Register ra = src.ra(); | |
1298 Register rb = src.rb(); | |
1299 DCHECK(!ra.is(r0)); | |
1300 emit(EXT2 | STHX | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
1301 LeaveRC); | |
1302 } | |
1303 | |
1304 | |
1305 void Assembler::sthux(Register rs, const MemOperand& src) { | |
1306 Register ra = src.ra(); | |
1307 Register rb = src.rb(); | |
1308 DCHECK(!ra.is(r0)); | |
1309 emit(EXT2 | STHUX | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
1310 LeaveRC); | |
1311 } | |
1312 | |
1313 | |
1314 void Assembler::stw(Register dst, const MemOperand& src) { | 1077 void Assembler::stw(Register dst, const MemOperand& src) { |
1315 DCHECK(!src.ra_.is(r0)); | 1078 DCHECK(!src.ra_.is(r0)); |
1316 d_form(STW, dst, src.ra(), src.offset(), true); | 1079 d_form(STW, dst, src.ra(), src.offset(), true); |
1317 } | 1080 } |
1318 | 1081 |
1319 | 1082 |
1320 void Assembler::stwu(Register dst, const MemOperand& src) { | 1083 void Assembler::stwu(Register dst, const MemOperand& src) { |
1321 DCHECK(!src.ra_.is(r0)); | 1084 DCHECK(!src.ra_.is(r0)); |
1322 d_form(STWU, dst, src.ra(), src.offset(), true); | 1085 d_form(STWU, dst, src.ra(), src.offset(), true); |
1323 } | 1086 } |
1324 | 1087 |
1325 | 1088 |
1326 void Assembler::stwx(Register rs, const MemOperand& src) { | |
1327 Register ra = src.ra(); | |
1328 Register rb = src.rb(); | |
1329 DCHECK(!ra.is(r0)); | |
1330 emit(EXT2 | STWX | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
1331 LeaveRC); | |
1332 } | |
1333 | |
1334 | |
1335 void Assembler::stwux(Register rs, const MemOperand& src) { | |
1336 Register ra = src.ra(); | |
1337 Register rb = src.rb(); | |
1338 DCHECK(!ra.is(r0)); | |
1339 emit(EXT2 | STWUX | rs.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
1340 LeaveRC); | |
1341 } | |
1342 | |
1343 | |
1344 void Assembler::extsb(Register rs, Register ra, RCBit rc) { | |
1345 emit(EXT2 | EXTSB | ra.code() * B21 | rs.code() * B16 | rc); | |
1346 } | |
1347 | |
1348 | |
1349 void Assembler::extsh(Register rs, Register ra, RCBit rc) { | |
1350 emit(EXT2 | EXTSH | ra.code() * B21 | rs.code() * B16 | rc); | |
1351 } | |
1352 | |
1353 | |
1354 void Assembler::extsw(Register rs, Register ra, RCBit rc) { | |
1355 #if V8_TARGET_ARCH_PPC64 | |
1356 emit(EXT2 | EXTSW | ra.code() * B21 | rs.code() * B16 | rc); | |
1357 #else | |
1358 // nop on 32-bit | |
1359 DCHECK(rs.is(ra) && rc == LeaveRC); | |
1360 #endif | |
1361 } | |
1362 | |
1363 | |
1364 void Assembler::neg(Register rt, Register ra, OEBit o, RCBit r) { | 1089 void Assembler::neg(Register rt, Register ra, OEBit o, RCBit r) { |
1365 emit(EXT2 | NEGX | rt.code() * B21 | ra.code() * B16 | o | r); | 1090 emit(EXT2 | NEGX | rt.code() * B21 | ra.code() * B16 | o | r); |
1366 } | 1091 } |
1367 | 1092 |
1368 | 1093 |
1369 void Assembler::andc(Register dst, Register src1, Register src2, RCBit rc) { | |
1370 x_form(EXT2 | ANDCX, dst, src1, src2, rc); | |
1371 } | |
1372 | |
1373 | |
1374 #if V8_TARGET_ARCH_PPC64 | 1094 #if V8_TARGET_ARCH_PPC64 |
1375 // 64bit specific instructions | 1095 // 64bit specific instructions |
1376 void Assembler::ld(Register rd, const MemOperand& src) { | 1096 void Assembler::ld(Register rd, const MemOperand& src) { |
1377 int offset = src.offset(); | 1097 int offset = src.offset(); |
1378 DCHECK(!src.ra_.is(r0)); | 1098 DCHECK(!src.ra_.is(r0)); |
1379 CHECK(!(offset & 3) && is_int16(offset)); | 1099 CHECK(!(offset & 3) && is_int16(offset)); |
1380 offset = kImm16Mask & offset; | 1100 offset = kImm16Mask & offset; |
1381 emit(LD | rd.code() * B21 | src.ra().code() * B16 | offset); | 1101 emit(LD | rd.code() * B21 | src.ra().code() * B16 | offset); |
1382 } | 1102 } |
1383 | 1103 |
1384 | 1104 |
1385 void Assembler::ldx(Register rd, const MemOperand& src) { | |
1386 Register ra = src.ra(); | |
1387 Register rb = src.rb(); | |
1388 DCHECK(!ra.is(r0)); | |
1389 emit(EXT2 | LDX | rd.code() * B21 | ra.code() * B16 | rb.code() * B11); | |
1390 } | |
1391 | |
1392 | |
1393 void Assembler::ldu(Register rd, const MemOperand& src) { | 1105 void Assembler::ldu(Register rd, const MemOperand& src) { |
1394 int offset = src.offset(); | 1106 int offset = src.offset(); |
1395 DCHECK(!src.ra_.is(r0)); | 1107 DCHECK(!src.ra_.is(r0)); |
1396 CHECK(!(offset & 3) && is_int16(offset)); | 1108 CHECK(!(offset & 3) && is_int16(offset)); |
1397 offset = kImm16Mask & offset; | 1109 offset = kImm16Mask & offset; |
1398 emit(LD | rd.code() * B21 | src.ra().code() * B16 | offset | 1); | 1110 emit(LD | rd.code() * B21 | src.ra().code() * B16 | offset | 1); |
1399 } | 1111 } |
1400 | 1112 |
1401 | 1113 |
1402 void Assembler::ldux(Register rd, const MemOperand& src) { | |
1403 Register ra = src.ra(); | |
1404 Register rb = src.rb(); | |
1405 DCHECK(!ra.is(r0)); | |
1406 emit(EXT2 | LDUX | rd.code() * B21 | ra.code() * B16 | rb.code() * B11); | |
1407 } | |
1408 | |
1409 | |
1410 void Assembler::std(Register rs, const MemOperand& src) { | 1114 void Assembler::std(Register rs, const MemOperand& src) { |
1411 int offset = src.offset(); | 1115 int offset = src.offset(); |
1412 DCHECK(!src.ra_.is(r0)); | 1116 DCHECK(!src.ra_.is(r0)); |
1413 CHECK(!(offset & 3) && is_int16(offset)); | 1117 CHECK(!(offset & 3) && is_int16(offset)); |
1414 offset = kImm16Mask & offset; | 1118 offset = kImm16Mask & offset; |
1415 emit(STD | rs.code() * B21 | src.ra().code() * B16 | offset); | 1119 emit(STD | rs.code() * B21 | src.ra().code() * B16 | offset); |
1416 } | 1120 } |
1417 | 1121 |
1418 | 1122 |
1419 void Assembler::stdx(Register rs, const MemOperand& src) { | |
1420 Register ra = src.ra(); | |
1421 Register rb = src.rb(); | |
1422 DCHECK(!ra.is(r0)); | |
1423 emit(EXT2 | STDX | rs.code() * B21 | ra.code() * B16 | rb.code() * B11); | |
1424 } | |
1425 | |
1426 | |
1427 void Assembler::stdu(Register rs, const MemOperand& src) { | 1123 void Assembler::stdu(Register rs, const MemOperand& src) { |
1428 int offset = src.offset(); | 1124 int offset = src.offset(); |
1429 DCHECK(!src.ra_.is(r0)); | 1125 DCHECK(!src.ra_.is(r0)); |
1430 CHECK(!(offset & 3) && is_int16(offset)); | 1126 CHECK(!(offset & 3) && is_int16(offset)); |
1431 offset = kImm16Mask & offset; | 1127 offset = kImm16Mask & offset; |
1432 emit(STD | rs.code() * B21 | src.ra().code() * B16 | offset | 1); | 1128 emit(STD | rs.code() * B21 | src.ra().code() * B16 | offset | 1); |
1433 } | 1129 } |
1434 | 1130 |
1435 | 1131 |
1436 void Assembler::stdux(Register rs, const MemOperand& src) { | |
1437 Register ra = src.ra(); | |
1438 Register rb = src.rb(); | |
1439 DCHECK(!ra.is(r0)); | |
1440 emit(EXT2 | STDUX | rs.code() * B21 | ra.code() * B16 | rb.code() * B11); | |
1441 } | |
1442 | |
1443 | |
1444 void Assembler::rldic(Register ra, Register rs, int sh, int mb, RCBit r) { | 1132 void Assembler::rldic(Register ra, Register rs, int sh, int mb, RCBit r) { |
1445 md_form(EXT5 | RLDIC, ra, rs, sh, mb, r); | 1133 md_form(EXT5 | RLDIC, ra, rs, sh, mb, r); |
1446 } | 1134 } |
1447 | 1135 |
1448 | 1136 |
1449 void Assembler::rldicl(Register ra, Register rs, int sh, int mb, RCBit r) { | 1137 void Assembler::rldicl(Register ra, Register rs, int sh, int mb, RCBit r) { |
1450 md_form(EXT5 | RLDICL, ra, rs, sh, mb, r); | 1138 md_form(EXT5 | RLDICL, ra, rs, sh, mb, r); |
1451 } | 1139 } |
1452 | 1140 |
1453 | 1141 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1494 | 1182 |
1495 void Assembler::sradi(Register ra, Register rs, int sh, RCBit r) { | 1183 void Assembler::sradi(Register ra, Register rs, int sh, RCBit r) { |
1496 int sh0_4 = sh & 0x1f; | 1184 int sh0_4 = sh & 0x1f; |
1497 int sh5 = (sh >> 5) & 0x1; | 1185 int sh5 = (sh >> 5) & 0x1; |
1498 | 1186 |
1499 emit(EXT2 | SRADIX | rs.code() * B21 | ra.code() * B16 | sh0_4 * B11 | | 1187 emit(EXT2 | SRADIX | rs.code() * B21 | ra.code() * B16 | sh0_4 * B11 | |
1500 sh5 * B1 | r); | 1188 sh5 * B1 | r); |
1501 } | 1189 } |
1502 | 1190 |
1503 | 1191 |
1504 void Assembler::srd(Register dst, Register src1, Register src2, RCBit r) { | |
1505 x_form(EXT2 | SRDX, dst, src1, src2, r); | |
1506 } | |
1507 | |
1508 | |
1509 void Assembler::sld(Register dst, Register src1, Register src2, RCBit r) { | |
1510 x_form(EXT2 | SLDX, dst, src1, src2, r); | |
1511 } | |
1512 | |
1513 | |
1514 void Assembler::srad(Register ra, Register rs, Register rb, RCBit r) { | |
1515 x_form(EXT2 | SRAD, ra, rs, rb, r); | |
1516 } | |
1517 | |
1518 | |
1519 void Assembler::rotld(Register ra, Register rs, Register rb, RCBit r) { | 1192 void Assembler::rotld(Register ra, Register rs, Register rb, RCBit r) { |
1520 rldcl(ra, rs, rb, 0, r); | 1193 rldcl(ra, rs, rb, 0, r); |
1521 } | 1194 } |
1522 | 1195 |
1523 | 1196 |
1524 void Assembler::rotldi(Register ra, Register rs, int sh, RCBit r) { | 1197 void Assembler::rotldi(Register ra, Register rs, int sh, RCBit r) { |
1525 rldicl(ra, rs, sh, 0, r); | 1198 rldicl(ra, rs, sh, 0, r); |
1526 } | 1199 } |
1527 | 1200 |
1528 | 1201 |
1529 void Assembler::rotrdi(Register ra, Register rs, int sh, RCBit r) { | 1202 void Assembler::rotrdi(Register ra, Register rs, int sh, RCBit r) { |
1530 rldicl(ra, rs, 64 - sh, 0, r); | 1203 rldicl(ra, rs, 64 - sh, 0, r); |
1531 } | 1204 } |
1532 | 1205 |
1533 | 1206 |
1534 void Assembler::cntlzd_(Register ra, Register rs, RCBit rc) { | |
1535 x_form(EXT2 | CNTLZDX, ra, rs, r0, rc); | |
1536 } | |
1537 | |
1538 | |
1539 void Assembler::popcntd(Register ra, Register rs) { | |
1540 emit(EXT2 | POPCNTD | rs.code() * B21 | ra.code() * B16); | |
1541 } | |
1542 | |
1543 | |
1544 void Assembler::mulld(Register dst, Register src1, Register src2, OEBit o, | 1207 void Assembler::mulld(Register dst, Register src1, Register src2, OEBit o, |
1545 RCBit r) { | 1208 RCBit r) { |
1546 xo_form(EXT2 | MULLD, dst, src1, src2, o, r); | 1209 xo_form(EXT2 | MULLD, dst, src1, src2, o, r); |
1547 } | 1210 } |
1548 | 1211 |
1549 | 1212 |
1550 void Assembler::divd(Register dst, Register src1, Register src2, OEBit o, | 1213 void Assembler::divd(Register dst, Register src1, Register src2, OEBit o, |
1551 RCBit r) { | 1214 RCBit r) { |
1552 xo_form(EXT2 | DIVD, dst, src1, src2, o, r); | 1215 xo_form(EXT2 | DIVD, dst, src1, src2, o, r); |
1553 } | 1216 } |
1554 | 1217 |
1555 | 1218 |
1556 void Assembler::divdu(Register dst, Register src1, Register src2, OEBit o, | 1219 void Assembler::divdu(Register dst, Register src1, Register src2, OEBit o, |
1557 RCBit r) { | 1220 RCBit r) { |
1558 xo_form(EXT2 | DIVDU, dst, src1, src2, o, r); | 1221 xo_form(EXT2 | DIVDU, dst, src1, src2, o, r); |
1559 } | 1222 } |
1560 | |
1561 void Assembler::modsd(Register rt, Register ra, Register rb) { | |
1562 x_form(EXT2 | MODSD, ra, rt, rb, LeaveRC); | |
1563 } | |
1564 | |
1565 void Assembler::modud(Register rt, Register ra, Register rb) { | |
1566 x_form(EXT2 | MODUD, ra, rt, rb, LeaveRC); | |
1567 } | |
1568 #endif | 1223 #endif |
1569 | 1224 |
1570 | 1225 |
1571 // Function descriptor for AIX. | 1226 // Function descriptor for AIX. |
1572 // Code address skips the function descriptor "header". | 1227 // Code address skips the function descriptor "header". |
1573 // TOC and static chain are ignored and set to 0. | 1228 // TOC and static chain are ignored and set to 0. |
1574 void Assembler::function_descriptor() { | 1229 void Assembler::function_descriptor() { |
1575 if (ABI_USES_FUNCTION_DESCRIPTORS) { | 1230 if (ABI_USES_FUNCTION_DESCRIPTORS) { |
1576 Label instructions; | 1231 Label instructions; |
1577 DCHECK(pc_offset() == 0); | 1232 DCHECK(pc_offset() == 0); |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2005 int offset = src.offset(); | 1660 int offset = src.offset(); |
2006 Register ra = src.ra(); | 1661 Register ra = src.ra(); |
2007 DCHECK(!ra.is(r0)); | 1662 DCHECK(!ra.is(r0)); |
2008 CHECK(is_int16(offset)); | 1663 CHECK(is_int16(offset)); |
2009 int imm16 = offset & kImm16Mask; | 1664 int imm16 = offset & kImm16Mask; |
2010 // could be x_form instruction with some casting magic | 1665 // could be x_form instruction with some casting magic |
2011 emit(LFDU | frt.code() * B21 | ra.code() * B16 | imm16); | 1666 emit(LFDU | frt.code() * B21 | ra.code() * B16 | imm16); |
2012 } | 1667 } |
2013 | 1668 |
2014 | 1669 |
2015 void Assembler::lfdx(const DoubleRegister frt, const MemOperand& src) { | |
2016 Register ra = src.ra(); | |
2017 Register rb = src.rb(); | |
2018 DCHECK(!ra.is(r0)); | |
2019 emit(EXT2 | LFDX | frt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
2020 LeaveRC); | |
2021 } | |
2022 | |
2023 | |
2024 void Assembler::lfdux(const DoubleRegister frt, const MemOperand& src) { | |
2025 Register ra = src.ra(); | |
2026 Register rb = src.rb(); | |
2027 DCHECK(!ra.is(r0)); | |
2028 emit(EXT2 | LFDUX | frt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
2029 LeaveRC); | |
2030 } | |
2031 | |
2032 | |
2033 void Assembler::lfs(const DoubleRegister frt, const MemOperand& src) { | 1670 void Assembler::lfs(const DoubleRegister frt, const MemOperand& src) { |
2034 int offset = src.offset(); | 1671 int offset = src.offset(); |
2035 Register ra = src.ra(); | 1672 Register ra = src.ra(); |
2036 CHECK(is_int16(offset)); | 1673 CHECK(is_int16(offset)); |
2037 DCHECK(!ra.is(r0)); | 1674 DCHECK(!ra.is(r0)); |
2038 int imm16 = offset & kImm16Mask; | 1675 int imm16 = offset & kImm16Mask; |
2039 // could be x_form instruction with some casting magic | 1676 // could be x_form instruction with some casting magic |
2040 emit(LFS | frt.code() * B21 | ra.code() * B16 | imm16); | 1677 emit(LFS | frt.code() * B21 | ra.code() * B16 | imm16); |
2041 } | 1678 } |
2042 | 1679 |
2043 | 1680 |
2044 void Assembler::lfsu(const DoubleRegister frt, const MemOperand& src) { | 1681 void Assembler::lfsu(const DoubleRegister frt, const MemOperand& src) { |
2045 int offset = src.offset(); | 1682 int offset = src.offset(); |
2046 Register ra = src.ra(); | 1683 Register ra = src.ra(); |
2047 CHECK(is_int16(offset)); | 1684 CHECK(is_int16(offset)); |
2048 DCHECK(!ra.is(r0)); | 1685 DCHECK(!ra.is(r0)); |
2049 int imm16 = offset & kImm16Mask; | 1686 int imm16 = offset & kImm16Mask; |
2050 // could be x_form instruction with some casting magic | 1687 // could be x_form instruction with some casting magic |
2051 emit(LFSU | frt.code() * B21 | ra.code() * B16 | imm16); | 1688 emit(LFSU | frt.code() * B21 | ra.code() * B16 | imm16); |
2052 } | 1689 } |
2053 | 1690 |
2054 | 1691 |
2055 void Assembler::lfsx(const DoubleRegister frt, const MemOperand& src) { | |
2056 Register ra = src.ra(); | |
2057 Register rb = src.rb(); | |
2058 DCHECK(!ra.is(r0)); | |
2059 emit(EXT2 | LFSX | frt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
2060 LeaveRC); | |
2061 } | |
2062 | |
2063 | |
2064 void Assembler::lfsux(const DoubleRegister frt, const MemOperand& src) { | |
2065 Register ra = src.ra(); | |
2066 Register rb = src.rb(); | |
2067 DCHECK(!ra.is(r0)); | |
2068 emit(EXT2 | LFSUX | frt.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
2069 LeaveRC); | |
2070 } | |
2071 | |
2072 | |
2073 void Assembler::stfd(const DoubleRegister frs, const MemOperand& src) { | 1692 void Assembler::stfd(const DoubleRegister frs, const MemOperand& src) { |
2074 int offset = src.offset(); | 1693 int offset = src.offset(); |
2075 Register ra = src.ra(); | 1694 Register ra = src.ra(); |
2076 CHECK(is_int16(offset)); | 1695 CHECK(is_int16(offset)); |
2077 DCHECK(!ra.is(r0)); | 1696 DCHECK(!ra.is(r0)); |
2078 int imm16 = offset & kImm16Mask; | 1697 int imm16 = offset & kImm16Mask; |
2079 // could be x_form instruction with some casting magic | 1698 // could be x_form instruction with some casting magic |
2080 emit(STFD | frs.code() * B21 | ra.code() * B16 | imm16); | 1699 emit(STFD | frs.code() * B21 | ra.code() * B16 | imm16); |
2081 } | 1700 } |
2082 | 1701 |
2083 | 1702 |
2084 void Assembler::stfdu(const DoubleRegister frs, const MemOperand& src) { | 1703 void Assembler::stfdu(const DoubleRegister frs, const MemOperand& src) { |
2085 int offset = src.offset(); | 1704 int offset = src.offset(); |
2086 Register ra = src.ra(); | 1705 Register ra = src.ra(); |
2087 CHECK(is_int16(offset)); | 1706 CHECK(is_int16(offset)); |
2088 DCHECK(!ra.is(r0)); | 1707 DCHECK(!ra.is(r0)); |
2089 int imm16 = offset & kImm16Mask; | 1708 int imm16 = offset & kImm16Mask; |
2090 // could be x_form instruction with some casting magic | 1709 // could be x_form instruction with some casting magic |
2091 emit(STFDU | frs.code() * B21 | ra.code() * B16 | imm16); | 1710 emit(STFDU | frs.code() * B21 | ra.code() * B16 | imm16); |
2092 } | 1711 } |
2093 | 1712 |
2094 | 1713 |
2095 void Assembler::stfdx(const DoubleRegister frs, const MemOperand& src) { | |
2096 Register ra = src.ra(); | |
2097 Register rb = src.rb(); | |
2098 DCHECK(!ra.is(r0)); | |
2099 emit(EXT2 | STFDX | frs.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
2100 LeaveRC); | |
2101 } | |
2102 | |
2103 | |
2104 void Assembler::stfdux(const DoubleRegister frs, const MemOperand& src) { | |
2105 Register ra = src.ra(); | |
2106 Register rb = src.rb(); | |
2107 DCHECK(!ra.is(r0)); | |
2108 emit(EXT2 | STFDUX | frs.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
2109 LeaveRC); | |
2110 } | |
2111 | |
2112 | |
2113 void Assembler::stfs(const DoubleRegister frs, const MemOperand& src) { | 1714 void Assembler::stfs(const DoubleRegister frs, const MemOperand& src) { |
2114 int offset = src.offset(); | 1715 int offset = src.offset(); |
2115 Register ra = src.ra(); | 1716 Register ra = src.ra(); |
2116 CHECK(is_int16(offset)); | 1717 CHECK(is_int16(offset)); |
2117 DCHECK(!ra.is(r0)); | 1718 DCHECK(!ra.is(r0)); |
2118 int imm16 = offset & kImm16Mask; | 1719 int imm16 = offset & kImm16Mask; |
2119 // could be x_form instruction with some casting magic | 1720 // could be x_form instruction with some casting magic |
2120 emit(STFS | frs.code() * B21 | ra.code() * B16 | imm16); | 1721 emit(STFS | frs.code() * B21 | ra.code() * B16 | imm16); |
2121 } | 1722 } |
2122 | 1723 |
2123 | 1724 |
2124 void Assembler::stfsu(const DoubleRegister frs, const MemOperand& src) { | 1725 void Assembler::stfsu(const DoubleRegister frs, const MemOperand& src) { |
2125 int offset = src.offset(); | 1726 int offset = src.offset(); |
2126 Register ra = src.ra(); | 1727 Register ra = src.ra(); |
2127 CHECK(is_int16(offset)); | 1728 CHECK(is_int16(offset)); |
2128 DCHECK(!ra.is(r0)); | 1729 DCHECK(!ra.is(r0)); |
2129 int imm16 = offset & kImm16Mask; | 1730 int imm16 = offset & kImm16Mask; |
2130 // could be x_form instruction with some casting magic | 1731 // could be x_form instruction with some casting magic |
2131 emit(STFSU | frs.code() * B21 | ra.code() * B16 | imm16); | 1732 emit(STFSU | frs.code() * B21 | ra.code() * B16 | imm16); |
2132 } | 1733 } |
2133 | 1734 |
2134 | 1735 |
2135 void Assembler::stfsx(const DoubleRegister frs, const MemOperand& src) { | |
2136 Register ra = src.ra(); | |
2137 Register rb = src.rb(); | |
2138 DCHECK(!ra.is(r0)); | |
2139 emit(EXT2 | STFSX | frs.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
2140 LeaveRC); | |
2141 } | |
2142 | |
2143 | |
2144 void Assembler::stfsux(const DoubleRegister frs, const MemOperand& src) { | |
2145 Register ra = src.ra(); | |
2146 Register rb = src.rb(); | |
2147 DCHECK(!ra.is(r0)); | |
2148 emit(EXT2 | STFSUX | frs.code() * B21 | ra.code() * B16 | rb.code() * B11 | | |
2149 LeaveRC); | |
2150 } | |
2151 | |
2152 | |
2153 void Assembler::fsub(const DoubleRegister frt, const DoubleRegister fra, | 1736 void Assembler::fsub(const DoubleRegister frt, const DoubleRegister fra, |
2154 const DoubleRegister frb, RCBit rc) { | 1737 const DoubleRegister frb, RCBit rc) { |
2155 a_form(EXT4 | FSUB, frt, fra, frb, rc); | 1738 a_form(EXT4 | FSUB, frt, fra, frb, rc); |
2156 } | 1739 } |
2157 | 1740 |
2158 | 1741 |
2159 void Assembler::fadd(const DoubleRegister frt, const DoubleRegister fra, | 1742 void Assembler::fadd(const DoubleRegister frt, const DoubleRegister fra, |
2160 const DoubleRegister frb, RCBit rc) { | 1743 const DoubleRegister frb, RCBit rc) { |
2161 a_form(EXT4 | FADD, frt, fra, frb, rc); | 1744 a_form(EXT4 | FADD, frt, fra, frb, rc); |
2162 } | 1745 } |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2554 } | 2137 } |
2555 | 2138 |
2556 void PatchingAssembler::FlushICache(Isolate* isolate) { | 2139 void PatchingAssembler::FlushICache(Isolate* isolate) { |
2557 Assembler::FlushICache(isolate, buffer_, buffer_size_ - kGap); | 2140 Assembler::FlushICache(isolate, buffer_, buffer_size_ - kGap); |
2558 } | 2141 } |
2559 | 2142 |
2560 } // namespace internal | 2143 } // namespace internal |
2561 } // namespace v8 | 2144 } // namespace v8 |
2562 | 2145 |
2563 #endif // V8_TARGET_ARCH_PPC | 2146 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |