| 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 1526 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1537 | 1537 | 
| 1538 void Assembler::sdiv(Register dst, Register src1, Register src2, | 1538 void Assembler::sdiv(Register dst, Register src1, Register src2, | 
| 1539                      Condition cond) { | 1539                      Condition cond) { | 
| 1540   ASSERT(!dst.is(pc) && !src1.is(pc) && !src2.is(pc)); | 1540   ASSERT(!dst.is(pc) && !src1.is(pc) && !src2.is(pc)); | 
| 1541   ASSERT(IsEnabled(SUDIV)); | 1541   ASSERT(IsEnabled(SUDIV)); | 
| 1542   emit(cond | B26 | B25| B24 | B20 | dst.code()*B16 | 0xf * B12 | | 1542   emit(cond | B26 | B25| B24 | B20 | dst.code()*B16 | 0xf * B12 | | 
| 1543        src2.code()*B8 | B4 | src1.code()); | 1543        src2.code()*B8 | B4 | src1.code()); | 
| 1544 } | 1544 } | 
| 1545 | 1545 | 
| 1546 | 1546 | 
|  | 1547 void Assembler::udiv(Register dst, Register src1, Register src2, | 
|  | 1548                      Condition cond) { | 
|  | 1549   ASSERT(!dst.is(pc) && !src1.is(pc) && !src2.is(pc)); | 
|  | 1550   ASSERT(IsEnabled(SUDIV)); | 
|  | 1551   emit(cond | B26 | B25 | B24 | B21 | B20 | dst.code() * B16 | 0xf * B12 | | 
|  | 1552        src2.code() * B8 | B4 | src1.code()); | 
|  | 1553 } | 
|  | 1554 | 
|  | 1555 | 
| 1547 void Assembler::mul(Register dst, Register src1, Register src2, | 1556 void Assembler::mul(Register dst, Register src1, Register src2, | 
| 1548                     SBit s, Condition cond) { | 1557                     SBit s, Condition cond) { | 
| 1549   ASSERT(!dst.is(pc) && !src1.is(pc) && !src2.is(pc)); | 1558   ASSERT(!dst.is(pc) && !src1.is(pc) && !src2.is(pc)); | 
| 1550   // dst goes in bits 16-19 for this instruction! | 1559   // dst goes in bits 16-19 for this instruction! | 
| 1551   emit(cond | s | dst.code()*B16 | src2.code()*B8 | B7 | B4 | src1.code()); | 1560   emit(cond | s | dst.code()*B16 | src2.code()*B8 | B7 | B4 | src1.code()); | 
| 1552 } | 1561 } | 
| 1553 | 1562 | 
| 1554 | 1563 | 
| 1555 void Assembler::smlal(Register dstL, | 1564 void Assembler::smlal(Register dstL, | 
| 1556                       Register dstH, | 1565                       Register dstH, | 
| (...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2149       sub(ip, base, Operand(offset)); | 2158       sub(ip, base, Operand(offset)); | 
| 2150     } | 2159     } | 
| 2151     emit(cond | 0xD*B24 | d*B22 | B20 | ip.code()*B16 | vd*B12 | 0xB*B8); | 2160     emit(cond | 0xD*B24 | d*B22 | B20 | ip.code()*B16 | vd*B12 | 0xB*B8); | 
| 2152   } | 2161   } | 
| 2153 } | 2162 } | 
| 2154 | 2163 | 
| 2155 | 2164 | 
| 2156 void Assembler::vldr(const DwVfpRegister dst, | 2165 void Assembler::vldr(const DwVfpRegister dst, | 
| 2157                      const MemOperand& operand, | 2166                      const MemOperand& operand, | 
| 2158                      const Condition cond) { | 2167                      const Condition cond) { | 
| 2159   ASSERT(!operand.rm().is_valid()); |  | 
| 2160   ASSERT(operand.am_ == Offset); | 2168   ASSERT(operand.am_ == Offset); | 
| 2161   vldr(dst, operand.rn(), operand.offset(), cond); | 2169   if (operand.rm().is_valid()) { | 
|  | 2170     add(ip, operand.rn(), | 
|  | 2171         Operand(operand.rm(), operand.shift_op_, operand.shift_imm_)); | 
|  | 2172     vldr(dst, ip, 0, cond); | 
|  | 2173   } else { | 
|  | 2174     vldr(dst, operand.rn(), operand.offset(), cond); | 
|  | 2175   } | 
| 2162 } | 2176 } | 
| 2163 | 2177 | 
| 2164 | 2178 | 
| 2165 void Assembler::vldr(const SwVfpRegister dst, | 2179 void Assembler::vldr(const SwVfpRegister dst, | 
| 2166                      const Register base, | 2180                      const Register base, | 
| 2167                      int offset, | 2181                      int offset, | 
| 2168                      const Condition cond) { | 2182                      const Condition cond) { | 
| 2169   // Sdst = MEM(Rbase + offset). | 2183   // Sdst = MEM(Rbase + offset). | 
| 2170   // Instruction details available in ARM DDI 0406A, A8-628. | 2184   // Instruction details available in ARM DDI 0406A, A8-628. | 
| 2171   // cond(31-28) | 1101(27-24)| U001(23-20) | Rbase(19-16) | | 2185   // cond(31-28) | 1101(27-24)| U001(23-20) | Rbase(19-16) | | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
| 2192       sub(ip, base, Operand(offset)); | 2206       sub(ip, base, Operand(offset)); | 
| 2193     } | 2207     } | 
| 2194     emit(cond | d*B22 | 0xD1*B20 | ip.code()*B16 | sd*B12 | 0xA*B8); | 2208     emit(cond | d*B22 | 0xD1*B20 | ip.code()*B16 | sd*B12 | 0xA*B8); | 
| 2195   } | 2209   } | 
| 2196 } | 2210 } | 
| 2197 | 2211 | 
| 2198 | 2212 | 
| 2199 void Assembler::vldr(const SwVfpRegister dst, | 2213 void Assembler::vldr(const SwVfpRegister dst, | 
| 2200                      const MemOperand& operand, | 2214                      const MemOperand& operand, | 
| 2201                      const Condition cond) { | 2215                      const Condition cond) { | 
| 2202   ASSERT(!operand.rm().is_valid()); |  | 
| 2203   ASSERT(operand.am_ == Offset); | 2216   ASSERT(operand.am_ == Offset); | 
| 2204   vldr(dst, operand.rn(), operand.offset(), cond); | 2217   if (operand.rm().is_valid()) { | 
|  | 2218     add(ip, operand.rn(), | 
|  | 2219         Operand(operand.rm(), operand.shift_op_, operand.shift_imm_)); | 
|  | 2220     vldr(dst, ip, 0, cond); | 
|  | 2221   } else { | 
|  | 2222     vldr(dst, operand.rn(), operand.offset(), cond); | 
|  | 2223   } | 
| 2205 } | 2224 } | 
| 2206 | 2225 | 
| 2207 | 2226 | 
| 2208 void Assembler::vstr(const DwVfpRegister src, | 2227 void Assembler::vstr(const DwVfpRegister src, | 
| 2209                      const Register base, | 2228                      const Register base, | 
| 2210                      int offset, | 2229                      int offset, | 
| 2211                      const Condition cond) { | 2230                      const Condition cond) { | 
| 2212   // MEM(Rbase + offset) = Dsrc. | 2231   // MEM(Rbase + offset) = Dsrc. | 
| 2213   // Instruction details available in ARM DDI 0406C.b, A8-1082. | 2232   // Instruction details available in ARM DDI 0406C.b, A8-1082. | 
| 2214   // cond(31-28) | 1101(27-24)| U(23) | D(22) | 00(21-20) | Rbase(19-16) | | 2233   // cond(31-28) | 1101(27-24)| U(23) | D(22) | 00(21-20) | Rbase(19-16) | | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
| 2235       sub(ip, base, Operand(offset)); | 2254       sub(ip, base, Operand(offset)); | 
| 2236     } | 2255     } | 
| 2237     emit(cond | 0xD*B24 | d*B22 | ip.code()*B16 | vd*B12 | 0xB*B8); | 2256     emit(cond | 0xD*B24 | d*B22 | ip.code()*B16 | vd*B12 | 0xB*B8); | 
| 2238   } | 2257   } | 
| 2239 } | 2258 } | 
| 2240 | 2259 | 
| 2241 | 2260 | 
| 2242 void Assembler::vstr(const DwVfpRegister src, | 2261 void Assembler::vstr(const DwVfpRegister src, | 
| 2243                      const MemOperand& operand, | 2262                      const MemOperand& operand, | 
| 2244                      const Condition cond) { | 2263                      const Condition cond) { | 
| 2245   ASSERT(!operand.rm().is_valid()); |  | 
| 2246   ASSERT(operand.am_ == Offset); | 2264   ASSERT(operand.am_ == Offset); | 
| 2247   vstr(src, operand.rn(), operand.offset(), cond); | 2265   if (operand.rm().is_valid()) { | 
|  | 2266     add(ip, operand.rn(), | 
|  | 2267         Operand(operand.rm(), operand.shift_op_, operand.shift_imm_)); | 
|  | 2268     vstr(src, ip, 0, cond); | 
|  | 2269   } else { | 
|  | 2270     vstr(src, operand.rn(), operand.offset(), cond); | 
|  | 2271   } | 
| 2248 } | 2272 } | 
| 2249 | 2273 | 
| 2250 | 2274 | 
| 2251 void Assembler::vstr(const SwVfpRegister src, | 2275 void Assembler::vstr(const SwVfpRegister src, | 
| 2252                      const Register base, | 2276                      const Register base, | 
| 2253                      int offset, | 2277                      int offset, | 
| 2254                      const Condition cond) { | 2278                      const Condition cond) { | 
| 2255   // MEM(Rbase + offset) = SSrc. | 2279   // MEM(Rbase + offset) = SSrc. | 
| 2256   // Instruction details available in ARM DDI 0406A, A8-786. | 2280   // Instruction details available in ARM DDI 0406A, A8-786. | 
| 2257   // cond(31-28) | 1101(27-24)| U000(23-20) | Rbase(19-16) | | 2281   // cond(31-28) | 1101(27-24)| U000(23-20) | Rbase(19-16) | | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 2277       sub(ip, base, Operand(offset)); | 2301       sub(ip, base, Operand(offset)); | 
| 2278     } | 2302     } | 
| 2279     emit(cond | d*B22 | 0xD0*B20 | ip.code()*B16 | sd*B12 | 0xA*B8); | 2303     emit(cond | d*B22 | 0xD0*B20 | ip.code()*B16 | sd*B12 | 0xA*B8); | 
| 2280   } | 2304   } | 
| 2281 } | 2305 } | 
| 2282 | 2306 | 
| 2283 | 2307 | 
| 2284 void Assembler::vstr(const SwVfpRegister src, | 2308 void Assembler::vstr(const SwVfpRegister src, | 
| 2285                      const MemOperand& operand, | 2309                      const MemOperand& operand, | 
| 2286                      const Condition cond) { | 2310                      const Condition cond) { | 
| 2287   ASSERT(!operand.rm().is_valid()); |  | 
| 2288   ASSERT(operand.am_ == Offset); | 2311   ASSERT(operand.am_ == Offset); | 
| 2289   vstr(src, operand.rn(), operand.offset(), cond); | 2312   if (operand.rm().is_valid()) { | 
|  | 2313     add(ip, operand.rn(), | 
|  | 2314         Operand(operand.rm(), operand.shift_op_, operand.shift_imm_)); | 
|  | 2315     vstr(src, ip, 0, cond); | 
|  | 2316   } else { | 
|  | 2317     vstr(src, operand.rn(), operand.offset(), cond); | 
|  | 2318   } | 
| 2290 } | 2319 } | 
| 2291 | 2320 | 
| 2292 | 2321 | 
| 2293 void  Assembler::vldm(BlockAddrMode am, | 2322 void  Assembler::vldm(BlockAddrMode am, | 
| 2294                       Register base, | 2323                       Register base, | 
| 2295                       DwVfpRegister first, | 2324                       DwVfpRegister first, | 
| 2296                       DwVfpRegister last, | 2325                       DwVfpRegister last, | 
| 2297                       Condition cond) { | 2326                       Condition cond) { | 
| 2298   // Instruction details available in ARM DDI 0406C.b, A8-922. | 2327   // Instruction details available in ARM DDI 0406C.b, A8-922. | 
| 2299   // cond(31-28) | 110(27-25)| PUDW1(24-20) | Rbase(19-16) | | 2328   // cond(31-28) | 110(27-25)| PUDW1(24-20) | Rbase(19-16) | | 
| (...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3118 } | 3147 } | 
| 3119 | 3148 | 
| 3120 | 3149 | 
| 3121 bool Assembler::IsNop(Instr instr, int type) { | 3150 bool Assembler::IsNop(Instr instr, int type) { | 
| 3122   ASSERT(0 <= type && type <= 14);  // mov pc, pc isn't a nop. | 3151   ASSERT(0 <= type && type <= 14);  // mov pc, pc isn't a nop. | 
| 3123   // Check for mov rx, rx where x = type. | 3152   // Check for mov rx, rx where x = type. | 
| 3124   return instr == (al | 13*B21 | type*B12 | type); | 3153   return instr == (al | 13*B21 | type*B12 | type); | 
| 3125 } | 3154 } | 
| 3126 | 3155 | 
| 3127 | 3156 | 
|  | 3157 // static | 
| 3128 bool Assembler::ImmediateFitsAddrMode1Instruction(int32_t imm32) { | 3158 bool Assembler::ImmediateFitsAddrMode1Instruction(int32_t imm32) { | 
| 3129   uint32_t dummy1; | 3159   uint32_t dummy1; | 
| 3130   uint32_t dummy2; | 3160   uint32_t dummy2; | 
| 3131   return fits_shifter(imm32, &dummy1, &dummy2, NULL); | 3161   return fits_shifter(imm32, &dummy1, &dummy2, NULL); | 
| 3132 } | 3162 } | 
| 3133 | 3163 | 
| 3134 | 3164 | 
| 3135 bool Assembler::ImmediateFitsAddrMode2Instruction(int32_t imm32) { | 3165 bool Assembler::ImmediateFitsAddrMode2Instruction(int32_t imm32) { | 
| 3136   return is_uint12(abs(imm32)); | 3166   return is_uint12(abs(imm32)); | 
| 3137 } | 3167 } | 
| (...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3733       assm->instr_at_put( | 3763       assm->instr_at_put( | 
| 3734           rinfo.pc(), Assembler::SetLdrRegisterImmediateOffset(instr, offset)); | 3764           rinfo.pc(), Assembler::SetLdrRegisterImmediateOffset(instr, offset)); | 
| 3735     } | 3765     } | 
| 3736   } | 3766   } | 
| 3737 } | 3767 } | 
| 3738 | 3768 | 
| 3739 | 3769 | 
| 3740 } }  // namespace v8::internal | 3770 } }  // namespace v8::internal | 
| 3741 | 3771 | 
| 3742 #endif  // V8_TARGET_ARCH_ARM | 3772 #endif  // V8_TARGET_ARCH_ARM | 
| OLD | NEW | 
|---|