| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 stm(db_w, sp, src1.bit() | src2.bit(), cond); | 313 stm(db_w, sp, src1.bit() | src2.bit(), cond); |
| 314 str(src3, MemOperand(sp, 4, NegPreIndex), cond); | 314 str(src3, MemOperand(sp, 4, NegPreIndex), cond); |
| 315 } | 315 } |
| 316 } else { | 316 } else { |
| 317 str(src1, MemOperand(sp, 4, NegPreIndex), cond); | 317 str(src1, MemOperand(sp, 4, NegPreIndex), cond); |
| 318 Push(src2, src3, cond); | 318 Push(src2, src3, cond); |
| 319 } | 319 } |
| 320 } | 320 } |
| 321 | 321 |
| 322 // Push four registers. Pushes leftmost register first (to highest address). | 322 // Push four registers. Pushes leftmost register first (to highest address). |
| 323 void Push(Register src1, Register src2, | 323 void Push(Register src1, |
| 324 Register src3, Register src4, Condition cond = al) { | 324 Register src2, |
| 325 Register src3, |
| 326 Register src4, |
| 327 Condition cond = al) { |
| 325 ASSERT(!src1.is(src2)); | 328 ASSERT(!src1.is(src2)); |
| 326 ASSERT(!src2.is(src3)); | 329 ASSERT(!src2.is(src3)); |
| 327 ASSERT(!src1.is(src3)); | 330 ASSERT(!src1.is(src3)); |
| 328 ASSERT(!src1.is(src4)); | 331 ASSERT(!src1.is(src4)); |
| 329 ASSERT(!src2.is(src4)); | 332 ASSERT(!src2.is(src4)); |
| 330 ASSERT(!src3.is(src4)); | 333 ASSERT(!src3.is(src4)); |
| 331 if (src1.code() > src2.code()) { | 334 if (src1.code() > src2.code()) { |
| 332 if (src2.code() > src3.code()) { | 335 if (src2.code() > src3.code()) { |
| 333 if (src3.code() > src4.code()) { | 336 if (src3.code() > src4.code()) { |
| 334 stm(db_w, | 337 stm(db_w, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 353 void Pop(Register src1, Register src2, Condition cond = al) { | 356 void Pop(Register src1, Register src2, Condition cond = al) { |
| 354 ASSERT(!src1.is(src2)); | 357 ASSERT(!src1.is(src2)); |
| 355 if (src1.code() > src2.code()) { | 358 if (src1.code() > src2.code()) { |
| 356 ldm(ia_w, sp, src1.bit() | src2.bit(), cond); | 359 ldm(ia_w, sp, src1.bit() | src2.bit(), cond); |
| 357 } else { | 360 } else { |
| 358 ldr(src2, MemOperand(sp, 4, PostIndex), cond); | 361 ldr(src2, MemOperand(sp, 4, PostIndex), cond); |
| 359 ldr(src1, MemOperand(sp, 4, PostIndex), cond); | 362 ldr(src1, MemOperand(sp, 4, PostIndex), cond); |
| 360 } | 363 } |
| 361 } | 364 } |
| 362 | 365 |
| 366 // Pop three registers. Pops rightmost register first (from lower address). |
| 367 void Pop(Register src1, Register src2, Register src3, Condition cond = al) { |
| 368 ASSERT(!src1.is(src2)); |
| 369 ASSERT(!src2.is(src3)); |
| 370 ASSERT(!src1.is(src3)); |
| 371 if (src1.code() > src2.code()) { |
| 372 if (src2.code() > src3.code()) { |
| 373 ldm(ia_w, sp, src1.bit() | src2.bit() | src3.bit(), cond); |
| 374 } else { |
| 375 ldr(src3, MemOperand(sp, 4, PostIndex), cond); |
| 376 ldm(ia_w, sp, src1.bit() | src2.bit(), cond); |
| 377 } |
| 378 } else { |
| 379 Pop(src2, src3, cond); |
| 380 str(src1, MemOperand(sp, 4, PostIndex), cond); |
| 381 } |
| 382 } |
| 383 |
| 384 // Pop four registers. Pops rightmost register first (from lower address). |
| 385 void Pop(Register src1, |
| 386 Register src2, |
| 387 Register src3, |
| 388 Register src4, |
| 389 Condition cond = al) { |
| 390 ASSERT(!src1.is(src2)); |
| 391 ASSERT(!src2.is(src3)); |
| 392 ASSERT(!src1.is(src3)); |
| 393 ASSERT(!src1.is(src4)); |
| 394 ASSERT(!src2.is(src4)); |
| 395 ASSERT(!src3.is(src4)); |
| 396 if (src1.code() > src2.code()) { |
| 397 if (src2.code() > src3.code()) { |
| 398 if (src3.code() > src4.code()) { |
| 399 ldm(ia_w, |
| 400 sp, |
| 401 src1.bit() | src2.bit() | src3.bit() | src4.bit(), |
| 402 cond); |
| 403 } else { |
| 404 ldr(src4, MemOperand(sp, 4, PostIndex), cond); |
| 405 ldm(ia_w, sp, src1.bit() | src2.bit() | src3.bit(), cond); |
| 406 } |
| 407 } else { |
| 408 Pop(src3, src4, cond); |
| 409 ldm(ia_w, sp, src1.bit() | src2.bit(), cond); |
| 410 } |
| 411 } else { |
| 412 Pop(src2, src3, src4, cond); |
| 413 ldr(src1, MemOperand(sp, 4, PostIndex), cond); |
| 414 } |
| 415 } |
| 416 |
| 363 // Push and pop the registers that can hold pointers, as defined by the | 417 // Push and pop the registers that can hold pointers, as defined by the |
| 364 // RegList constant kSafepointSavedRegisters. | 418 // RegList constant kSafepointSavedRegisters. |
| 365 void PushSafepointRegisters(); | 419 void PushSafepointRegisters(); |
| 366 void PopSafepointRegisters(); | 420 void PopSafepointRegisters(); |
| 367 void PushSafepointRegistersAndDoubles(); | 421 void PushSafepointRegistersAndDoubles(); |
| 368 void PopSafepointRegistersAndDoubles(); | 422 void PopSafepointRegistersAndDoubles(); |
| 369 // Store value in register src in the safepoint stack slot for | 423 // Store value in register src in the safepoint stack slot for |
| 370 // register dst. | 424 // register dst. |
| 371 void StoreToSafepointRegisterSlot(Register src, Register dst); | 425 void StoreToSafepointRegisterSlot(Register src, Register dst); |
| 372 void StoreToSafepointRegistersAndDoublesSlot(Register src, Register dst); | 426 void StoreToSafepointRegistersAndDoublesSlot(Register src, Register dst); |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 // Support functions. | 719 // Support functions. |
| 666 | 720 |
| 667 // Try to get function prototype of a function and puts the value in | 721 // Try to get function prototype of a function and puts the value in |
| 668 // the result register. Checks that the function really is a | 722 // the result register. Checks that the function really is a |
| 669 // function and jumps to the miss label if the fast checks fail. The | 723 // function and jumps to the miss label if the fast checks fail. The |
| 670 // function register will be untouched; the other registers may be | 724 // function register will be untouched; the other registers may be |
| 671 // clobbered. | 725 // clobbered. |
| 672 void TryGetFunctionPrototype(Register function, | 726 void TryGetFunctionPrototype(Register function, |
| 673 Register result, | 727 Register result, |
| 674 Register scratch, | 728 Register scratch, |
| 675 Label* miss); | 729 Label* miss, |
| 730 bool miss_on_bound_function = false); |
| 676 | 731 |
| 677 // Compare object type for heap object. heap_object contains a non-Smi | 732 // Compare object type for heap object. heap_object contains a non-Smi |
| 678 // whose object type should be compared with the given type. This both | 733 // whose object type should be compared with the given type. This both |
| 679 // sets the flags and leaves the object type in the type_reg register. | 734 // sets the flags and leaves the object type in the type_reg register. |
| 680 // It leaves the map in the map register (unless the type_reg and map register | 735 // It leaves the map in the map register (unless the type_reg and map register |
| 681 // are the same register). It leaves the heap object in the heap_object | 736 // are the same register). It leaves the heap object in the heap_object |
| 682 // register unless the heap_object register is the same register as one of the | 737 // register unless the heap_object register is the same register as one of the |
| 683 // other registers. | 738 // other registers. |
| 684 void CompareObjectType(Register heap_object, | 739 void CompareObjectType(Register heap_object, |
| 685 Register map, | 740 Register map, |
| (...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1277 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) | 1332 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) |
| 1278 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm-> | 1333 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm-> |
| 1279 #else | 1334 #else |
| 1280 #define ACCESS_MASM(masm) masm-> | 1335 #define ACCESS_MASM(masm) masm-> |
| 1281 #endif | 1336 #endif |
| 1282 | 1337 |
| 1283 | 1338 |
| 1284 } } // namespace v8::internal | 1339 } } // namespace v8::internal |
| 1285 | 1340 |
| 1286 #endif // V8_ARM_MACRO_ASSEMBLER_ARM_H_ | 1341 #endif // V8_ARM_MACRO_ASSEMBLER_ARM_H_ |
| OLD | NEW |