Chromium Code Reviews| Index: runtime/vm/assembler_arm.cc |
| =================================================================== |
| --- runtime/vm/assembler_arm.cc (revision 24916) |
| +++ runtime/vm/assembler_arm.cc (working copy) |
| @@ -22,6 +22,7 @@ |
| DECLARE_FLAG(bool, inline_alloc); |
| bool CPUFeatures::integer_division_supported_ = false; |
| +bool CPUFeatures::neon_supported_ = false; |
| #if defined(DEBUG) |
| bool CPUFeatures::initialized_ = false; |
| #endif |
| @@ -33,12 +34,22 @@ |
| } |
| +bool CPUFeatures::neon_supported() { |
| + DEBUG_ASSERT(initialized_); |
| + return neon_supported_; |
| +} |
| + |
| + |
| // If we are using the simulator, allow tests to enable/disable support for |
| // integer division. |
| #if defined(USING_SIMULATOR) |
| void CPUFeatures::set_integer_division_supported(bool supported) { |
| integer_division_supported_ = supported; |
| } |
| + |
| +void CPUFeatures::set_neon_supported(bool supported) { |
| + neon_supported_ = supported; |
| +} |
| #endif |
| @@ -81,11 +92,13 @@ |
| void CPUFeatures::InitOnce() { |
| #if defined(USING_SIMULATOR) |
| integer_division_supported_ = true; |
| + neon_supported_ = true; |
| #else |
| ASSERT(CPUInfoContainsString("ARMv7")); // Implements ARMv7. |
| ASSERT(CPUInfoContainsString("vfp")); // Has floating point unit. |
| // Has integer division. |
| integer_division_supported_ = CPUInfoContainsString("idiva"); |
| + neon_supported_ = CPUInfoContainsString("neon"); |
| #endif // defined(USING_SIMULATOR) |
| #if defined(DEBUG) |
| initialized_ = true; |
| @@ -1205,6 +1218,33 @@ |
| } |
| +void Assembler::EmitSIMDqqq(int32_t opcode, int sz, |
| + QRegister qd, QRegister qn, QRegister qm) { |
| + int32_t encoding = |
| + (static_cast<int32_t>(kSpecialCondition) << kConditionShift) | |
| + B25 | B6 | |
| + opcode | ((sz & 0x3) * B20) | |
| + ((static_cast<int32_t>(qd * 2) >> 4)*B22) | |
| + ((static_cast<int32_t>(qn * 2) & 0xf)*B16) | |
| + ((static_cast<int32_t>(qd * 2) & 0xf)*B12) | |
| + ((static_cast<int32_t>(qn * 2) >> 4)*B7) | |
| + ((static_cast<int32_t>(qm * 2) >> 4)*B5) | |
| + (static_cast<int32_t>(qm * 2) & 0xf); |
| + Emit(encoding); |
| +} |
| + |
| + |
| +void Assembler::vaddi(int sz, QRegister qd, QRegister qn, QRegister qm) { |
| + ASSERT((sz >= 0) && (sz <= 3)); |
| + EmitSIMDqqq(B11, sz, qd, qn, qm); |
| +} |
| + |
| + |
| +void Assembler::vaddf(QRegister qd, QRegister qn, QRegister qm) { |
| + EmitSIMDqqq(B11 | B10 | B8, 0, qd, qn, qm); |
| +} |
| + |
| + |
| void Assembler::svc(uint32_t imm24, Condition cond) { |
| ASSERT(cond != kNoCondition); |
| ASSERT(imm24 < (1 << 24)); |
| @@ -2017,7 +2057,9 @@ |
| EnterFrame(kDartVolatileCpuRegs | (1 << FP) | (1 << LR), 0); |
| // Preserve all volatile FPU registers. |
| - vstmd(DB_W, SP, kDartFirstVolatileFpuReg, kDartLastVolatileFpuReg); |
| + DRegister firstv = static_cast<DRegister>(kDartFirstVolatileFpuReg * 2); |
|
regis
2013/07/12 22:16:01
An inlined function or #define hiding the static c
zra
2013/07/12 23:22:18
Done.
|
| + DRegister lastv = static_cast<DRegister>(kDartLastVolatileFpuReg * 2); |
|
regis
2013/07/12 22:16:01
You miss one DRegister here, *2+1, or use the seco
zra
2013/07/12 23:22:18
Done.
|
| + vstmd(DB_W, SP, firstv, lastv); |
| ReserveAlignedFrameSpace(frame_space); |
| } |
| @@ -2033,7 +2075,9 @@ |
| AddImmediate(SP, FP, -kPushedRegistersSize); |
| // Restore all volatile FPU registers. |
| - vldmd(IA_W, SP, kDartFirstVolatileFpuReg, kDartLastVolatileFpuReg); |
| + DRegister firstv = static_cast<DRegister>(kDartFirstVolatileFpuReg * 2); |
| + DRegister lastv = static_cast<DRegister>(kDartLastVolatileFpuReg * 2); |
|
regis
2013/07/12 22:16:01
ditto
zra
2013/07/12 23:22:18
Done.
|
| + vldmd(IA_W, SP, firstv, lastv); |
| // Restore volatile CPU registers. |
| LeaveFrame(kDartVolatileCpuRegs | (1 << FP) | (1 << LR)); |
| @@ -2247,11 +2291,9 @@ |
| static const char* fpu_reg_names[kNumberOfFpuRegisters] = { |
| - "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", |
| - "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", |
| + "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", |
| #ifdef VFPv3_D32 |
| - "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", |
| - "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", |
| + "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15", |
| #endif |
| }; |