| 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 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 817 | 817 |
| 818 // Insert the smallest number of nop instructions | 818 // Insert the smallest number of nop instructions |
| 819 // possible to align the pc offset to a multiple | 819 // possible to align the pc offset to a multiple |
| 820 // of m. m must be a power of 2 (>= 4). | 820 // of m. m must be a power of 2 (>= 4). |
| 821 void Align(int m); | 821 void Align(int m); |
| 822 // Aligns code to something that's optimal for a jump target for the platform. | 822 // Aligns code to something that's optimal for a jump target for the platform. |
| 823 void CodeTargetAlign(); | 823 void CodeTargetAlign(); |
| 824 | 824 |
| 825 // Branch instructions | 825 // Branch instructions |
| 826 void b(int branch_offset, Condition cond = al); | 826 void b(int branch_offset, Condition cond = al); |
| 827 void b_thumb(int branch_offset, Condition cond); |
| 827 void bl(int branch_offset, Condition cond = al); | 828 void bl(int branch_offset, Condition cond = al); |
| 828 void blx(int branch_offset); // v5 and above | 829 void blx(int branch_offset); // v5 and above |
| 829 void blx(Register target, Condition cond = al); // v5 and above | 830 void blx(Register target, Condition cond = al); // v5 and above |
| 830 void bx(Register target, Condition cond = al); // v5 and above, plus v4t | 831 void bx(Register target, Condition cond = al); // v5 and above, plus v4t |
| 831 | 832 |
| 832 // Convenience branch instructions using labels | 833 // Convenience branch instructions using labels |
| 833 void b(Label* L, Condition cond = al) { | 834 void b(Label* L, Condition cond = al) { |
| 834 b(branch_offset(L, cond == al), cond); | 835 b(branch_offset(L, cond == al), cond); |
| 835 } | 836 } |
| 836 void b(Condition cond, Label* L) { b(branch_offset(L, cond == al), cond); } | 837 void b(Condition cond, Label* L) { b(branch_offset(L, cond == al), cond); } |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1016 uint32_t i, uint32_t imm3, uint32_t imm8); | 1017 uint32_t i, uint32_t imm3, uint32_t imm8); |
| 1017 void mvn_reg_t2(Register dst, const Operand& src, | 1018 void mvn_reg_t2(Register dst, const Operand& src, |
| 1018 SBit s, Condition cond); | 1019 SBit s, Condition cond); |
| 1019 void mvn_thumb(Register dst, const Operand& src, | 1020 void mvn_thumb(Register dst, const Operand& src, |
| 1020 SBit s, Condition cond); | 1021 SBit s, Condition cond); |
| 1021 | 1022 |
| 1022 // Multiply instructions | 1023 // Multiply instructions |
| 1023 | 1024 |
| 1024 void mla(Register dst, Register src1, Register src2, Register srcA, | 1025 void mla(Register dst, Register src1, Register src2, Register srcA, |
| 1025 SBit s = LeaveCC, Condition cond = al); | 1026 SBit s = LeaveCC, Condition cond = al); |
| 1027 void mla_thumb(Register dst, Register src1, Register src2, Register srcA, |
| 1028 SBit s, Condition cond); |
| 1026 | 1029 |
| 1027 void mls(Register dst, Register src1, Register src2, Register srcA, | 1030 void mls(Register dst, Register src1, Register src2, Register srcA, |
| 1028 Condition cond = al); | 1031 Condition cond = al); |
| 1032 void mls_thumb(Register dst, Register src1, Register src2, Register srcA, |
| 1033 Condition cond); |
| 1029 | 1034 |
| 1030 void sdiv(Register dst, Register src1, Register src2, | 1035 void sdiv(Register dst, Register src1, Register src2, |
| 1031 Condition cond = al); | 1036 Condition cond = al); |
| 1037 void sdiv_thumb(Register dst, Register src1, Register src2, |
| 1038 Condition cond); |
| 1032 | 1039 |
| 1033 void mul(Register dst, Register src1, Register src2, | 1040 void mul(Register dst, Register src1, Register src2, |
| 1034 SBit s = LeaveCC, Condition cond = al); | 1041 SBit s = LeaveCC, Condition cond = al); |
| 1035 void mul_t2(Register dst, Register src1, Register src2, | 1042 void mul_t2(Register dst, Register src1, Register src2, |
| 1036 SBit s, Condition cond); | 1043 SBit s, Condition cond); |
| 1037 void mul_thumb(Register dst, Register src1, Register src2, | 1044 void mul_thumb(Register dst, Register src1, Register src2, |
| 1038 SBit s, Condition cond); | 1045 SBit s, Condition cond); |
| 1039 | 1046 |
| 1040 void smlal(Register dstL, Register dstH, Register src1, Register src2, | 1047 void smlal(Register dstL, Register dstH, Register src1, Register src2, |
| 1041 SBit s = LeaveCC, Condition cond = al); | 1048 SBit s = LeaveCC, Condition cond = al); |
| 1049 void smlal_thumb(Register dstL, Register dstH, Register src1, Register src2, |
| 1050 SBit s, Condition cond); |
| 1042 | 1051 |
| 1043 void smull(Register dstL, Register dstH, Register src1, Register src2, | 1052 void smull(Register dstL, Register dstH, Register src1, Register src2, |
| 1044 SBit s = LeaveCC, Condition cond = al); | 1053 SBit s = LeaveCC, Condition cond = al); |
| 1054 void smull_thumb(Register dstL, Register dstH, Register src1, Register src2, |
| 1055 SBit s, Condition cond); |
| 1045 | 1056 |
| 1046 void umlal(Register dstL, Register dstH, Register src1, Register src2, | 1057 void umlal(Register dstL, Register dstH, Register src1, Register src2, |
| 1047 SBit s = LeaveCC, Condition cond = al); | 1058 SBit s = LeaveCC, Condition cond = al); |
| 1059 void umlal_thumb(Register dstL, Register dstH, Register src1, Register src2, |
| 1060 SBit s, Condition cond); |
| 1048 | 1061 |
| 1049 void umull(Register dstL, Register dstH, Register src1, Register src2, | 1062 void umull(Register dstL, Register dstH, Register src1, Register src2, |
| 1050 SBit s = LeaveCC, Condition cond = al); | 1063 SBit s = LeaveCC, Condition cond = al); |
| 1064 void umull_thumb(Register dstL, Register dstH, Register src1, Register src2, |
| 1065 SBit s, Condition cond); |
| 1051 | 1066 |
| 1052 // Miscellaneous arithmetic instructions | 1067 // Miscellaneous arithmetic instructions |
| 1053 | 1068 |
| 1054 void clz(Register dst, Register src, Condition cond = al); // v5 and above | 1069 void clz(Register dst, Register src, Condition cond = al); // v5 and above |
| 1055 | 1070 |
| 1056 // Saturating instructions. v6 and above. | 1071 // Saturating instructions. v6 and above. |
| 1057 | 1072 |
| 1058 // Unsigned saturate. | 1073 // Unsigned saturate. |
| 1059 // | 1074 // |
| 1060 // Saturate an optionally shifted signed value to an unsigned range. | 1075 // Saturate an optionally shifted signed value to an unsigned range. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1098 | 1113 |
| 1099 void uxtb16(Register dst, const Operand& src, Condition cond = al); | 1114 void uxtb16(Register dst, const Operand& src, Condition cond = al); |
| 1100 | 1115 |
| 1101 // Status register access instructions | 1116 // Status register access instructions |
| 1102 | 1117 |
| 1103 void mrs(Register dst, SRegister s, Condition cond = al); | 1118 void mrs(Register dst, SRegister s, Condition cond = al); |
| 1104 void msr(SRegisterFieldMask fields, const Operand& src, Condition cond = al); | 1119 void msr(SRegisterFieldMask fields, const Operand& src, Condition cond = al); |
| 1105 | 1120 |
| 1106 // Load/Store instructions | 1121 // Load/Store instructions |
| 1107 void ldr(Register dst, const MemOperand& src, Condition cond = al); | 1122 void ldr(Register dst, const MemOperand& src, Condition cond = al); |
| 1123 void ldr_thumb(Register dst, const MemOperand& src); |
| 1124 void ldr_thumb_immediate(Register dst, const MemOperand& src); |
| 1125 void ldr_thumb_register(Register dst, const MemOperand& src); |
| 1126 |
| 1108 void str(Register src, const MemOperand& dst, Condition cond = al); | 1127 void str(Register src, const MemOperand& dst, Condition cond = al); |
| 1128 void str_thumb(Register src, const MemOperand& dst); |
| 1129 void str_thumb_register(Register src, const MemOperand& dst); |
| 1130 void str_thumb_immediate(Register src, const MemOperand& dst); |
| 1131 |
| 1109 void ldrb(Register dst, const MemOperand& src, Condition cond = al); | 1132 void ldrb(Register dst, const MemOperand& src, Condition cond = al); |
| 1133 void ldrb_thumb_immediate(Register dst, const MemOperand& src); |
| 1134 void ldrb_thumb_register(Register dst, const MemOperand& src); |
| 1135 void ldrb_thumb(Register dst, const MemOperand& src); |
| 1136 |
| 1110 void strb(Register src, const MemOperand& dst, Condition cond = al); | 1137 void strb(Register src, const MemOperand& dst, Condition cond = al); |
| 1138 void strb_thumb_immediate(Register src, const MemOperand& dst); |
| 1139 void strb_thumb_register(Register src, const MemOperand& dst); |
| 1140 void strb_thumb(Register src, const MemOperand& dst); |
| 1141 |
| 1111 void ldrh(Register dst, const MemOperand& src, Condition cond = al); | 1142 void ldrh(Register dst, const MemOperand& src, Condition cond = al); |
| 1143 void ldrh_thumb_immediate(Register dst, const MemOperand& src); |
| 1144 void ldrh_thumb_register(Register dst, const MemOperand& src); |
| 1145 void ldrh_thumb(Register dst, const MemOperand& src); |
| 1146 |
| 1112 void strh(Register src, const MemOperand& dst, Condition cond = al); | 1147 void strh(Register src, const MemOperand& dst, Condition cond = al); |
| 1148 void strh_thumb_immediate(Register src, const MemOperand& dst); // 4_4 |
| 1149 void strh_thumb_register(Register src, const MemOperand& dst); // 4_1 |
| 1150 void strh_thumb(Register src, const MemOperand& dst); |
| 1151 |
| 1113 void ldrsb(Register dst, const MemOperand& src, Condition cond = al); | 1152 void ldrsb(Register dst, const MemOperand& src, Condition cond = al); |
| 1153 void ldrsb_thumb_immediate(Register dst, const MemOperand& src); |
| 1154 void ldrsb_thumb_register(Register dst, const MemOperand& src); |
| 1155 void ldrsb_thumb(Register dst, const MemOperand& src); |
| 1156 |
| 1114 void ldrsh(Register dst, const MemOperand& src, Condition cond = al); | 1157 void ldrsh(Register dst, const MemOperand& src, Condition cond = al); |
| 1158 void ldrsh_thumb(Register dst, const MemOperand& src); |
| 1159 void ldrsh_thumb_immediate(Register dst, const MemOperand& src); |
| 1160 void ldrsh_thumb_register(Register dst, const MemOperand& src); |
| 1161 |
| 1115 void ldrd(Register dst1, | 1162 void ldrd(Register dst1, |
| 1116 Register dst2, | 1163 Register dst2, |
| 1117 const MemOperand& src, Condition cond = al); | 1164 const MemOperand& src, Condition cond = al); |
| 1118 void ldrd_imm_t1(Register dst1, | 1165 void ldrd_imm_t1(Register dst1, |
| 1119 Register dst2, | 1166 Register dst2, |
| 1120 const MemOperand& src); | 1167 const MemOperand& src); |
| 1121 void strd(Register src1, | 1168 void strd(Register src1, |
| 1122 Register src2, | 1169 Register src2, |
| 1123 const MemOperand& dst, Condition cond = al); | 1170 const MemOperand& dst, Condition cond = al); |
| 1124 void strd_imm_t1(Register src1, | 1171 void strd_imm_t1(Register src1, |
| 1125 Register src2, | 1172 Register src2, |
| 1126 const MemOperand& dst); | 1173 const MemOperand& dst); |
| 1127 | 1174 |
| 1128 // Preload instructions | 1175 // Preload instructions |
| 1129 void pld(const MemOperand& address); | 1176 void pld(const MemOperand& address); |
| 1130 | 1177 |
| 1131 // Load/Store multiple instructions | 1178 // Load/Store multiple instructions |
| 1132 void ldm(BlockAddrMode am, Register base, RegList dst, Condition cond = al); | 1179 void ldm(BlockAddrMode am, Register base, RegList dst, Condition cond = al); |
| 1180 void ldm_thumb(BlockAddrMode am, Register base, RegList dst, Condition cond); |
| 1181 |
| 1133 void stm(BlockAddrMode am, Register base, RegList src, Condition cond = al); | 1182 void stm(BlockAddrMode am, Register base, RegList src, Condition cond = al); |
| 1183 void stm_thumb(BlockAddrMode am, Register base, RegList dst, Condition cond); |
| 1134 | 1184 |
| 1135 // Exception-generating instructions and debugging support | 1185 // Exception-generating instructions and debugging support |
| 1136 void stop(const char* msg, | 1186 void stop(const char* msg, |
| 1137 Condition cond = al, | 1187 Condition cond = al, |
| 1138 int32_t code = kDefaultStopCode); | 1188 int32_t code = kDefaultStopCode); |
| 1139 | 1189 |
| 1140 void bkpt(uint32_t imm16); // v5 and above | 1190 void bkpt(uint32_t imm16); // v5 and above |
| 1141 void svc(uint32_t imm24, Condition cond = al); | 1191 void svc(uint32_t imm24, Condition cond = al); |
| 1142 | 1192 |
| 1143 // Coprocessor instructions | 1193 // Coprocessor instructions |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1382 void pop() { | 1432 void pop() { |
| 1383 add(sp, sp, Operand(kPointerSize)); | 1433 add(sp, sp, Operand(kPointerSize)); |
| 1384 } | 1434 } |
| 1385 | 1435 |
| 1386 // Jump unconditionally to given label. | 1436 // Jump unconditionally to given label. |
| 1387 void jmp(Label* L) { b(L, al); } | 1437 void jmp(Label* L) { b(L, al); } |
| 1388 | 1438 |
| 1389 void it_thumb(Condition cond, int num_instr, bool cond2 = false, | 1439 void it_thumb(Condition cond, int num_instr, bool cond2 = false, |
| 1390 bool cond3 = false, bool cond4 = false); | 1440 bool cond3 = false, bool cond4 = false); |
| 1391 inline void emit_it(Condition cond); | 1441 inline void emit_it(Condition cond); |
| 1442 void ldr_pc_thumb(Register dst, const Operand& src); |
| 1392 | 1443 |
| 1393 static bool use_immediate_embedded_pointer_loads( | 1444 static bool use_immediate_embedded_pointer_loads( |
| 1394 const Assembler* assembler) { | 1445 const Assembler* assembler) { |
| 1395 return CpuFeatures::IsSupported(MOVW_MOVT_IMMEDIATE_LOADS) && | 1446 return CpuFeatures::IsSupported(MOVW_MOVT_IMMEDIATE_LOADS) && |
| 1396 (assembler == NULL || !assembler->predictable_code_size()); | 1447 (assembler == NULL || !assembler->predictable_code_size()); |
| 1397 } | 1448 } |
| 1398 | 1449 |
| 1399 // Check the code size generated from label to here. | 1450 // Check the code size generated from label to here. |
| 1400 int SizeOfCodeGeneratedSince(Label* label) { | 1451 int SizeOfCodeGeneratedSince(Label* label) { |
| 1401 return pc_offset() - label->pos(); | 1452 return pc_offset() - label->pos(); |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1656 void GrowBuffer(); | 1707 void GrowBuffer(); |
| 1657 inline void emit(Instr x); | 1708 inline void emit(Instr x); |
| 1658 inline void emit16(Instr16 x, bool check_buffer = true); | 1709 inline void emit16(Instr16 x, bool check_buffer = true); |
| 1659 inline void emit32(Instr x); // proper half-word order for thumb | 1710 inline void emit32(Instr x); // proper half-word order for thumb |
| 1660 | 1711 |
| 1661 // 32-bit immediate values | 1712 // 32-bit immediate values |
| 1662 void move_32_bit_immediate(Condition cond, | 1713 void move_32_bit_immediate(Condition cond, |
| 1663 Register rd, | 1714 Register rd, |
| 1664 SBit s, | 1715 SBit s, |
| 1665 const Operand& x); | 1716 const Operand& x); |
| 1717 void move_32_bit_immediate_thumb(Register rd, |
| 1718 SBit s, |
| 1719 const Operand& x, |
| 1720 Condition cond = al); |
| 1666 | 1721 |
| 1667 // Instruction generation | 1722 // Instruction generation |
| 1668 void addrmod1(Instr instr, Register rn, Register rd, const Operand& x); | 1723 void addrmod1(Instr instr, Register rn, Register rd, const Operand& x); |
| 1669 void addrmod2(Instr instr, Register rd, const MemOperand& x); | 1724 void addrmod2(Instr instr, Register rd, const MemOperand& x); |
| 1670 void addrmod3(Instr instr, Register rd, const MemOperand& x); | 1725 void addrmod3(Instr instr, Register rd, const MemOperand& x); |
| 1671 void addrmod4(Instr instr, Register rn, RegList rl); | 1726 void addrmod4(Instr instr, Register rn, RegList rl); |
| 1672 void addrmod5(Instr instr, CRegister crd, const MemOperand& x); | 1727 void addrmod5(Instr instr, CRegister crd, const MemOperand& x); |
| 1673 | 1728 |
| 1674 Instr16 thumb16_mode1(ThumbMode1Opcode16 op); // A6.2.1 -> mode1 | 1729 Instr16 thumb16_mode1(ThumbMode1Opcode16 op); // A6.2.1 -> mode1 |
| 1675 Instr16 thumb16_mode2(ThumbMode2Opcode16 op); // A6.2.2 -> mode2 | 1730 Instr16 thumb16_mode2(ThumbMode2Opcode16 op); // A6.2.2 -> mode2 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1803 public: | 1858 public: |
| 1804 explicit EnsureSpace(Assembler* assembler) { | 1859 explicit EnsureSpace(Assembler* assembler) { |
| 1805 assembler->CheckBuffer(); | 1860 assembler->CheckBuffer(); |
| 1806 } | 1861 } |
| 1807 }; | 1862 }; |
| 1808 | 1863 |
| 1809 | 1864 |
| 1810 } } // namespace v8::internal | 1865 } } // namespace v8::internal |
| 1811 | 1866 |
| 1812 #endif // V8_ARM_ASSEMBLER_ARM_H_ | 1867 #endif // V8_ARM_ASSEMBLER_ARM_H_ |
| OLD | NEW |