Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(683)

Side by Side Diff: src/arm/assembler-arm.cc

Issue 426233002: Land the Fan (disabled) (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback, rebase and "git cl format" Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/arm/assembler-arm.h ('k') | src/arm/code-stubs-arm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/arm/assembler-arm.h ('k') | src/arm/code-stubs-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698