| 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 |