OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // NOLINT | 5 #include "vm/globals.h" // NOLINT |
6 #if defined(TARGET_ARCH_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
10 #include "vm/longjump.h" | 10 #include "vm/longjump.h" |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 | 403 |
404 // Like mul, but sets condition flags. | 404 // Like mul, but sets condition flags. |
405 void Assembler::muls(Register rd, Register rn, Register rm, Condition cond) { | 405 void Assembler::muls(Register rd, Register rn, Register rm, Condition cond) { |
406 EmitMulOp(cond, B20, R0, rd, rn, rm); | 406 EmitMulOp(cond, B20, R0, rd, rn, rm); |
407 } | 407 } |
408 | 408 |
409 | 409 |
410 void Assembler::mla(Register rd, Register rn, | 410 void Assembler::mla(Register rd, Register rn, |
411 Register rm, Register ra, Condition cond) { | 411 Register rm, Register ra, Condition cond) { |
412 // rd <- ra + rn * rm. | 412 // rd <- ra + rn * rm. |
413 if (TargetCPUFeatures::arm_version() == ARMv7) { | 413 // Assembler registers rd, rn, rm, ra are encoded as rn, rm, rs, rd. |
414 // Assembler registers rd, rn, rm, ra are encoded as rn, rm, rs, rd. | 414 EmitMulOp(cond, B21, ra, rd, rn, rm); |
415 EmitMulOp(cond, B21, ra, rd, rn, rm); | |
416 } else { | |
417 mul(IP, rn, rm, cond); | |
418 add(rd, ra, Operand(IP), cond); | |
419 } | |
420 } | 415 } |
421 | 416 |
422 | 417 |
423 void Assembler::mls(Register rd, Register rn, | 418 void Assembler::mls(Register rd, Register rn, |
424 Register rm, Register ra, Condition cond) { | 419 Register rm, Register ra, Condition cond) { |
425 // rd <- ra - rn * rm. | 420 // rd <- ra - rn * rm. |
426 if (TargetCPUFeatures::arm_version() == ARMv7) { | 421 if (TargetCPUFeatures::arm_version() == ARMv7) { |
427 // Assembler registers rd, rn, rm, ra are encoded as rn, rm, rs, rd. | 422 // Assembler registers rd, rn, rm, ra are encoded as rn, rm, rs, rd. |
428 EmitMulOp(cond, B22 | B21, ra, rd, rn, rm); | 423 EmitMulOp(cond, B22 | B21, ra, rd, rn, rm); |
429 } else { | 424 } else { |
430 mul(IP, rn, rm, cond); | 425 mul(IP, rn, rm, cond); |
431 sub(rd, ra, Operand(IP), cond); | 426 sub(rd, ra, Operand(IP), cond); |
432 } | 427 } |
433 } | 428 } |
434 | 429 |
435 | 430 |
436 void Assembler::smull(Register rd_lo, Register rd_hi, | 431 void Assembler::smull(Register rd_lo, Register rd_hi, |
437 Register rn, Register rm, Condition cond) { | 432 Register rn, Register rm, Condition cond) { |
438 // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs. | 433 // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs. |
439 EmitMulOp(cond, B23 | B22, rd_lo, rd_hi, rn, rm); | 434 EmitMulOp(cond, B23 | B22, rd_lo, rd_hi, rn, rm); |
440 } | 435 } |
441 | 436 |
442 | 437 |
443 void Assembler::umull(Register rd_lo, Register rd_hi, | 438 void Assembler::umull(Register rd_lo, Register rd_hi, |
444 Register rn, Register rm, Condition cond) { | 439 Register rn, Register rm, Condition cond) { |
445 ASSERT(TargetCPUFeatures::arm_version() == ARMv7); | |
446 // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs. | 440 // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs. |
447 EmitMulOp(cond, B23, rd_lo, rd_hi, rn, rm); | 441 EmitMulOp(cond, B23, rd_lo, rd_hi, rn, rm); |
448 } | 442 } |
449 | 443 |
450 | 444 |
451 void Assembler::smlal(Register rd_lo, Register rd_hi, | |
452 Register rn, Register rm, Condition cond) { | |
453 ASSERT(TargetCPUFeatures::arm_version() == ARMv7); | |
454 // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs. | |
455 EmitMulOp(cond, B23 | B22 | B21, rd_lo, rd_hi, rn, rm); | |
456 } | |
457 | |
458 | |
459 void Assembler::umlal(Register rd_lo, Register rd_hi, | 445 void Assembler::umlal(Register rd_lo, Register rd_hi, |
460 Register rn, Register rm, Condition cond) { | 446 Register rn, Register rm, Condition cond) { |
461 ASSERT(TargetCPUFeatures::arm_version() == ARMv7); | |
462 // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs. | 447 // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs. |
463 EmitMulOp(cond, B23 | B21, rd_lo, rd_hi, rn, rm); | 448 EmitMulOp(cond, B23 | B21, rd_lo, rd_hi, rn, rm); |
464 } | 449 } |
465 | 450 |
466 | 451 |
467 void Assembler::umaal(Register rd_lo, Register rd_hi, | 452 void Assembler::umaal(Register rd_lo, Register rd_hi, |
468 Register rn, Register rm, Condition cond) { | 453 Register rn, Register rm) { |
469 ASSERT(TargetCPUFeatures::arm_version() == ARMv7); | 454 ASSERT(rd_lo != IP); |
470 // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs. | 455 ASSERT(rd_hi != IP); |
471 EmitMulOp(cond, B22, rd_lo, rd_hi, rn, rm); | 456 ASSERT(rn != IP); |
| 457 ASSERT(rm != IP); |
| 458 if (TargetCPUFeatures::arm_version() != ARMv5TE) { |
| 459 // Assembler registers rd_lo, rd_hi, rn, rm are encoded as rd, rn, rm, rs. |
| 460 EmitMulOp(AL, B22, rd_lo, rd_hi, rn, rm); |
| 461 } else { |
| 462 mov(IP, Operand(0)); |
| 463 umlal(rd_lo, IP, rn, rm); |
| 464 adds(rd_lo, rd_lo, Operand(rd_hi)); |
| 465 adc(rd_hi, IP, Operand(0)); |
| 466 } |
472 } | 467 } |
473 | 468 |
474 | 469 |
475 void Assembler::EmitDivOp(Condition cond, int32_t opcode, | 470 void Assembler::EmitDivOp(Condition cond, int32_t opcode, |
476 Register rd, Register rn, Register rm) { | 471 Register rd, Register rn, Register rm) { |
477 ASSERT(TargetCPUFeatures::integer_division_supported()); | 472 ASSERT(TargetCPUFeatures::integer_division_supported()); |
478 ASSERT(rd != kNoRegister); | 473 ASSERT(rd != kNoRegister); |
479 ASSERT(rn != kNoRegister); | 474 ASSERT(rn != kNoRegister); |
480 ASSERT(rm != kNoRegister); | 475 ASSERT(rm != kNoRegister); |
481 ASSERT(cond != kNoCondition); | 476 ASSERT(cond != kNoCondition); |
(...skipping 3099 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3581 | 3576 |
3582 | 3577 |
3583 const char* Assembler::FpuRegisterName(FpuRegister reg) { | 3578 const char* Assembler::FpuRegisterName(FpuRegister reg) { |
3584 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters)); | 3579 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters)); |
3585 return fpu_reg_names[reg]; | 3580 return fpu_reg_names[reg]; |
3586 } | 3581 } |
3587 | 3582 |
3588 } // namespace dart | 3583 } // namespace dart |
3589 | 3584 |
3590 #endif // defined TARGET_ARCH_ARM | 3585 #endif // defined TARGET_ARCH_ARM |
OLD | NEW |