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 1345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1356 void Assembler::ldrsb(Register dst, const MemOperand& src, Condition cond) { | 1356 void Assembler::ldrsb(Register dst, const MemOperand& src, Condition cond) { |
1357 addrmod3(cond | L | B7 | S6 | B4, dst, src); | 1357 addrmod3(cond | L | B7 | S6 | B4, dst, src); |
1358 } | 1358 } |
1359 | 1359 |
1360 | 1360 |
1361 void Assembler::ldrsh(Register dst, const MemOperand& src, Condition cond) { | 1361 void Assembler::ldrsh(Register dst, const MemOperand& src, Condition cond) { |
1362 addrmod3(cond | L | B7 | S6 | H | B4, dst, src); | 1362 addrmod3(cond | L | B7 | S6 | H | B4, dst, src); |
1363 } | 1363 } |
1364 | 1364 |
1365 | 1365 |
1366 void Assembler::ldrd(Register dst, const MemOperand& src, Condition cond) { | 1366 void Assembler::ldrd(Register dst1, |
| 1367 Register dst2, |
| 1368 const MemOperand& src, Condition cond) { |
1367 ASSERT(src.rm().is(no_reg)); | 1369 ASSERT(src.rm().is(no_reg)); |
| 1370 ASSERT(!dst1.is(lr)); // r14. |
| 1371 ASSERT_EQ(0, dst1.code() % 2); |
| 1372 ASSERT_EQ(dst1.code() + 1, dst2.code()); |
1368 #ifdef CAN_USE_ARMV7_INSTRUCTIONS | 1373 #ifdef CAN_USE_ARMV7_INSTRUCTIONS |
1369 addrmod3(cond | B7 | B6 | B4, dst, src); | 1374 addrmod3(cond | B7 | B6 | B4, dst1, src); |
1370 #else | 1375 #else |
1371 // Generate two ldr instructions if ldrd is not available. | 1376 // Generate two ldr instructions if ldrd is not available. |
1372 MemOperand src1(src); | 1377 MemOperand src2(src); |
1373 src1.set_offset(src1.offset() + 4); | 1378 src2.set_offset(src2.offset() + 4); |
1374 Register dst1(dst); | 1379 if (dst1.is(src.rn())) { |
1375 dst1.set_code(dst1.code() + 1); | 1380 ldr(dst2, src2, cond); |
1376 if (dst.is(src.rn())) { | 1381 ldr(dst1, src, cond); |
1377 ldr(dst1, src1, cond); | |
1378 ldr(dst, src, cond); | |
1379 } else { | 1382 } else { |
1380 ldr(dst, src, cond); | 1383 ldr(dst1, src, cond); |
1381 ldr(dst1, src1, cond); | 1384 ldr(dst2, src2, cond); |
1382 } | 1385 } |
1383 #endif | 1386 #endif |
1384 } | 1387 } |
1385 | 1388 |
1386 | 1389 |
1387 void Assembler::strd(Register src, const MemOperand& dst, Condition cond) { | 1390 void Assembler::strd(Register src1, |
| 1391 Register src2, |
| 1392 const MemOperand& dst, Condition cond) { |
1388 ASSERT(dst.rm().is(no_reg)); | 1393 ASSERT(dst.rm().is(no_reg)); |
| 1394 ASSERT(!src1.is(lr)); // r14. |
| 1395 ASSERT_EQ(0, src1.code() % 2); |
| 1396 ASSERT_EQ(src1.code() + 1, src2.code()); |
1389 #ifdef CAN_USE_ARMV7_INSTRUCTIONS | 1397 #ifdef CAN_USE_ARMV7_INSTRUCTIONS |
1390 addrmod3(cond | B7 | B6 | B5 | B4, src, dst); | 1398 addrmod3(cond | B7 | B6 | B5 | B4, src1, dst); |
1391 #else | 1399 #else |
1392 // Generate two str instructions if strd is not available. | 1400 // Generate two str instructions if strd is not available. |
1393 MemOperand dst1(dst); | 1401 MemOperand dst2(dst); |
1394 dst1.set_offset(dst1.offset() + 4); | 1402 dst2.set_offset(dst2.offset() + 4); |
1395 Register src1(src); | 1403 str(src1, dst, cond); |
1396 src1.set_code(src1.code() + 1); | 1404 str(src2, dst2, cond); |
1397 str(src, dst, cond); | |
1398 str(src1, dst1, cond); | |
1399 #endif | 1405 #endif |
1400 } | 1406 } |
1401 | 1407 |
1402 // Load/Store multiple instructions. | 1408 // Load/Store multiple instructions. |
1403 void Assembler::ldm(BlockAddrMode am, | 1409 void Assembler::ldm(BlockAddrMode am, |
1404 Register base, | 1410 Register base, |
1405 RegList dst, | 1411 RegList dst, |
1406 Condition cond) { | 1412 Condition cond) { |
1407 // ABI stack constraint: ldmxx base, {..sp..} base != sp is not restartable. | 1413 // ABI stack constraint: ldmxx base, {..sp..} base != sp is not restartable. |
1408 ASSERT(base.is(sp) || (dst & sp.bit()) == 0); | 1414 ASSERT(base.is(sp) || (dst & sp.bit()) == 0); |
(...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2222 | 2228 |
2223 // Since a constant pool was just emitted, move the check offset forward by | 2229 // Since a constant pool was just emitted, move the check offset forward by |
2224 // the standard interval. | 2230 // the standard interval. |
2225 next_buffer_check_ = pc_offset() + kCheckConstInterval; | 2231 next_buffer_check_ = pc_offset() + kCheckConstInterval; |
2226 } | 2232 } |
2227 | 2233 |
2228 | 2234 |
2229 } } // namespace v8::internal | 2235 } } // namespace v8::internal |
2230 | 2236 |
2231 #endif // V8_TARGET_ARCH_ARM | 2237 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |