OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_ARM_MACRO_ASSEMBLER_ARM_H_ | 5 #ifndef V8_ARM_MACRO_ASSEMBLER_ARM_H_ |
6 #define V8_ARM_MACRO_ASSEMBLER_ARM_H_ | 6 #define V8_ARM_MACRO_ASSEMBLER_ARM_H_ |
7 | 7 |
8 #include "src/assembler.h" | 8 #include "src/assembler.h" |
9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
10 #include "src/frames.h" | 10 #include "src/frames.h" |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 if (src1.code() > src2.code()) { | 318 if (src1.code() > src2.code()) { |
319 stm(db_w, sp, src1.bit() | src2.bit(), cond); | 319 stm(db_w, sp, src1.bit() | src2.bit(), cond); |
320 } else { | 320 } else { |
321 str(src1, MemOperand(sp, 4, NegPreIndex), cond); | 321 str(src1, MemOperand(sp, 4, NegPreIndex), cond); |
322 str(src2, MemOperand(sp, 4, NegPreIndex), cond); | 322 str(src2, MemOperand(sp, 4, NegPreIndex), cond); |
323 } | 323 } |
324 } | 324 } |
325 | 325 |
326 // Push three registers. Pushes leftmost register first (to highest address). | 326 // Push three registers. Pushes leftmost register first (to highest address). |
327 void Push(Register src1, Register src2, Register src3, Condition cond = al) { | 327 void Push(Register src1, Register src2, Register src3, Condition cond = al) { |
328 DCHECK(!src1.is(src2)); | 328 DCHECK(!AreAliased(src1, src2, src3)); |
329 DCHECK(!src2.is(src3)); | |
330 DCHECK(!src1.is(src3)); | |
331 if (src1.code() > src2.code()) { | 329 if (src1.code() > src2.code()) { |
332 if (src2.code() > src3.code()) { | 330 if (src2.code() > src3.code()) { |
333 stm(db_w, sp, src1.bit() | src2.bit() | src3.bit(), cond); | 331 stm(db_w, sp, src1.bit() | src2.bit() | src3.bit(), cond); |
334 } else { | 332 } else { |
335 stm(db_w, sp, src1.bit() | src2.bit(), cond); | 333 stm(db_w, sp, src1.bit() | src2.bit(), cond); |
336 str(src3, MemOperand(sp, 4, NegPreIndex), cond); | 334 str(src3, MemOperand(sp, 4, NegPreIndex), cond); |
337 } | 335 } |
338 } else { | 336 } else { |
339 str(src1, MemOperand(sp, 4, NegPreIndex), cond); | 337 str(src1, MemOperand(sp, 4, NegPreIndex), cond); |
340 Push(src2, src3, cond); | 338 Push(src2, src3, cond); |
341 } | 339 } |
342 } | 340 } |
343 | 341 |
344 // Push four registers. Pushes leftmost register first (to highest address). | 342 // Push four registers. Pushes leftmost register first (to highest address). |
345 void Push(Register src1, | 343 void Push(Register src1, |
346 Register src2, | 344 Register src2, |
347 Register src3, | 345 Register src3, |
348 Register src4, | 346 Register src4, |
349 Condition cond = al) { | 347 Condition cond = al) { |
350 DCHECK(!src1.is(src2)); | 348 DCHECK(!AreAliased(src1, src2, src3, src4)); |
351 DCHECK(!src2.is(src3)); | |
352 DCHECK(!src1.is(src3)); | |
353 DCHECK(!src1.is(src4)); | |
354 DCHECK(!src2.is(src4)); | |
355 DCHECK(!src3.is(src4)); | |
356 if (src1.code() > src2.code()) { | 349 if (src1.code() > src2.code()) { |
357 if (src2.code() > src3.code()) { | 350 if (src2.code() > src3.code()) { |
358 if (src3.code() > src4.code()) { | 351 if (src3.code() > src4.code()) { |
359 stm(db_w, | 352 stm(db_w, |
360 sp, | 353 sp, |
361 src1.bit() | src2.bit() | src3.bit() | src4.bit(), | 354 src1.bit() | src2.bit() | src3.bit() | src4.bit(), |
362 cond); | 355 cond); |
363 } else { | 356 } else { |
364 stm(db_w, sp, src1.bit() | src2.bit() | src3.bit(), cond); | 357 stm(db_w, sp, src1.bit() | src2.bit() | src3.bit(), cond); |
365 str(src4, MemOperand(sp, 4, NegPreIndex), cond); | 358 str(src4, MemOperand(sp, 4, NegPreIndex), cond); |
366 } | 359 } |
367 } else { | 360 } else { |
368 stm(db_w, sp, src1.bit() | src2.bit(), cond); | 361 stm(db_w, sp, src1.bit() | src2.bit(), cond); |
369 Push(src3, src4, cond); | 362 Push(src3, src4, cond); |
370 } | 363 } |
371 } else { | 364 } else { |
372 str(src1, MemOperand(sp, 4, NegPreIndex), cond); | 365 str(src1, MemOperand(sp, 4, NegPreIndex), cond); |
373 Push(src2, src3, src4, cond); | 366 Push(src2, src3, src4, cond); |
374 } | 367 } |
375 } | 368 } |
376 | 369 |
| 370 // Push five registers. Pushes leftmost register first (to highest address). |
| 371 void Push(Register src1, Register src2, Register src3, Register src4, |
| 372 Register src5, Condition cond = al) { |
| 373 DCHECK(!AreAliased(src1, src2, src3, src4, src5)); |
| 374 if (src1.code() > src2.code()) { |
| 375 if (src2.code() > src3.code()) { |
| 376 if (src3.code() > src4.code()) { |
| 377 if (src4.code() > src5.code()) { |
| 378 stm(db_w, sp, |
| 379 src1.bit() | src2.bit() | src3.bit() | src4.bit() | src5.bit(), |
| 380 cond); |
| 381 } else { |
| 382 stm(db_w, sp, src1.bit() | src2.bit() | src3.bit() | src4.bit(), |
| 383 cond); |
| 384 str(src5, MemOperand(sp, 4, NegPreIndex), cond); |
| 385 } |
| 386 } else { |
| 387 stm(db_w, sp, src1.bit() | src2.bit() | src3.bit(), cond); |
| 388 Push(src4, src5, cond); |
| 389 } |
| 390 } else { |
| 391 stm(db_w, sp, src1.bit() | src2.bit(), cond); |
| 392 Push(src3, src4, src5, cond); |
| 393 } |
| 394 } else { |
| 395 str(src1, MemOperand(sp, 4, NegPreIndex), cond); |
| 396 Push(src2, src3, src4, src5, cond); |
| 397 } |
| 398 } |
| 399 |
377 // Pop two registers. Pops rightmost register first (from lower address). | 400 // Pop two registers. Pops rightmost register first (from lower address). |
378 void Pop(Register src1, Register src2, Condition cond = al) { | 401 void Pop(Register src1, Register src2, Condition cond = al) { |
379 DCHECK(!src1.is(src2)); | 402 DCHECK(!src1.is(src2)); |
380 if (src1.code() > src2.code()) { | 403 if (src1.code() > src2.code()) { |
381 ldm(ia_w, sp, src1.bit() | src2.bit(), cond); | 404 ldm(ia_w, sp, src1.bit() | src2.bit(), cond); |
382 } else { | 405 } else { |
383 ldr(src2, MemOperand(sp, 4, PostIndex), cond); | 406 ldr(src2, MemOperand(sp, 4, PostIndex), cond); |
384 ldr(src1, MemOperand(sp, 4, PostIndex), cond); | 407 ldr(src1, MemOperand(sp, 4, PostIndex), cond); |
385 } | 408 } |
386 } | 409 } |
387 | 410 |
388 // Pop three registers. Pops rightmost register first (from lower address). | 411 // Pop three registers. Pops rightmost register first (from lower address). |
389 void Pop(Register src1, Register src2, Register src3, Condition cond = al) { | 412 void Pop(Register src1, Register src2, Register src3, Condition cond = al) { |
390 DCHECK(!src1.is(src2)); | 413 DCHECK(!AreAliased(src1, src2, src3)); |
391 DCHECK(!src2.is(src3)); | |
392 DCHECK(!src1.is(src3)); | |
393 if (src1.code() > src2.code()) { | 414 if (src1.code() > src2.code()) { |
394 if (src2.code() > src3.code()) { | 415 if (src2.code() > src3.code()) { |
395 ldm(ia_w, sp, src1.bit() | src2.bit() | src3.bit(), cond); | 416 ldm(ia_w, sp, src1.bit() | src2.bit() | src3.bit(), cond); |
396 } else { | 417 } else { |
397 ldr(src3, MemOperand(sp, 4, PostIndex), cond); | 418 ldr(src3, MemOperand(sp, 4, PostIndex), cond); |
398 ldm(ia_w, sp, src1.bit() | src2.bit(), cond); | 419 ldm(ia_w, sp, src1.bit() | src2.bit(), cond); |
399 } | 420 } |
400 } else { | 421 } else { |
401 Pop(src2, src3, cond); | 422 Pop(src2, src3, cond); |
402 ldr(src1, MemOperand(sp, 4, PostIndex), cond); | 423 ldr(src1, MemOperand(sp, 4, PostIndex), cond); |
403 } | 424 } |
404 } | 425 } |
405 | 426 |
406 // Pop four registers. Pops rightmost register first (from lower address). | 427 // Pop four registers. Pops rightmost register first (from lower address). |
407 void Pop(Register src1, | 428 void Pop(Register src1, |
408 Register src2, | 429 Register src2, |
409 Register src3, | 430 Register src3, |
410 Register src4, | 431 Register src4, |
411 Condition cond = al) { | 432 Condition cond = al) { |
412 DCHECK(!src1.is(src2)); | 433 DCHECK(!AreAliased(src1, src2, src3, src4)); |
413 DCHECK(!src2.is(src3)); | |
414 DCHECK(!src1.is(src3)); | |
415 DCHECK(!src1.is(src4)); | |
416 DCHECK(!src2.is(src4)); | |
417 DCHECK(!src3.is(src4)); | |
418 if (src1.code() > src2.code()) { | 434 if (src1.code() > src2.code()) { |
419 if (src2.code() > src3.code()) { | 435 if (src2.code() > src3.code()) { |
420 if (src3.code() > src4.code()) { | 436 if (src3.code() > src4.code()) { |
421 ldm(ia_w, | 437 ldm(ia_w, |
422 sp, | 438 sp, |
423 src1.bit() | src2.bit() | src3.bit() | src4.bit(), | 439 src1.bit() | src2.bit() | src3.bit() | src4.bit(), |
424 cond); | 440 cond); |
425 } else { | 441 } else { |
426 ldr(src4, MemOperand(sp, 4, PostIndex), cond); | 442 ldr(src4, MemOperand(sp, 4, PostIndex), cond); |
427 ldm(ia_w, sp, src1.bit() | src2.bit() | src3.bit(), cond); | 443 ldm(ia_w, sp, src1.bit() | src2.bit() | src3.bit(), cond); |
(...skipping 1120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1548 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) | 1564 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) |
1549 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm-> | 1565 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm-> |
1550 #else | 1566 #else |
1551 #define ACCESS_MASM(masm) masm-> | 1567 #define ACCESS_MASM(masm) masm-> |
1552 #endif | 1568 #endif |
1553 | 1569 |
1554 | 1570 |
1555 } } // namespace v8::internal | 1571 } } // namespace v8::internal |
1556 | 1572 |
1557 #endif // V8_ARM_MACRO_ASSEMBLER_ARM_H_ | 1573 #endif // V8_ARM_MACRO_ASSEMBLER_ARM_H_ |
OLD | NEW |