| Index: src/arm/assembler-arm.h
|
| diff --git a/src/arm/assembler-arm.h b/src/arm/assembler-arm.h
|
| index 3ee980699da1d94f5935d0b21ecb01d684e7a768..235d80be8386489cdc79b84fd509577c24d28e6a 100644
|
| --- a/src/arm/assembler-arm.h
|
| +++ b/src/arm/assembler-arm.h
|
| @@ -640,12 +640,26 @@ class NeonMemOperand BASE_EMBEDDED {
|
| // Class NeonListOperand represents a list of NEON registers
|
| class NeonListOperand BASE_EMBEDDED {
|
| public:
|
| - explicit NeonListOperand(DoubleRegister base, int registers_count = 1);
|
| + explicit NeonListOperand(DoubleRegister base, int register_count = 1)
|
| + : base_(base), register_count_(register_count) {}
|
| + explicit NeonListOperand(QwNeonRegister q_reg)
|
| + : base_(q_reg.low()), register_count_(2) {}
|
| DoubleRegister base() const { return base_; }
|
| - NeonListType type() const { return type_; }
|
| + int register_count() { return register_count_; }
|
| + int length() const { return register_count_ - 1; }
|
| + NeonListType type() const {
|
| + switch (register_count_) {
|
| + default: UNREACHABLE();
|
| + // Fall through.
|
| + case 1: return nlt_1;
|
| + case 2: return nlt_2;
|
| + case 3: return nlt_3;
|
| + case 4: return nlt_4;
|
| + }
|
| + }
|
| private:
|
| DoubleRegister base_;
|
| - NeonListType type_;
|
| + int register_count_;
|
| };
|
|
|
|
|
| @@ -1149,6 +1163,8 @@ class Assembler : public AssemblerBase {
|
| void vmov(const DwVfpRegister dst,
|
| const DwVfpRegister src,
|
| const Condition cond = al);
|
| + // TODO(bbudge) Replace uses of these with the more general core register to
|
| + // scalar register vmov's.
|
| void vmov(const DwVfpRegister dst,
|
| const VmovIndex index,
|
| const Register src,
|
| @@ -1329,11 +1345,43 @@ class Assembler : public AssemblerBase {
|
| const NeonMemOperand& dst);
|
| void vmovl(NeonDataType dt, QwNeonRegister dst, DwVfpRegister src);
|
|
|
| + // Only unconditional core <-> scalar moves are currently supported.
|
| + void vmov(NeonDataType dt, DwVfpRegister dst, int index, Register src);
|
| + void vmov(NeonDataType dt, Register dst, DwVfpRegister src, int index);
|
| +
|
| void vmov(const QwNeonRegister dst, const QwNeonRegister src);
|
| + void vmvn(const QwNeonRegister dst, const QwNeonRegister src);
|
| void vswp(DwVfpRegister dst, DwVfpRegister src);
|
| void vswp(QwNeonRegister dst, QwNeonRegister src);
|
| + // vdup conditional execution isn't supported.
|
| + void vdup(NeonSize size, const QwNeonRegister dst, const Register src);
|
| + void vdup(const QwNeonRegister dst, const SwVfpRegister src);
|
| +
|
| + void vcvt_f32_s32(const QwNeonRegister dst, const QwNeonRegister src);
|
| + void vcvt_f32_u32(const QwNeonRegister dst, const QwNeonRegister src);
|
| + void vcvt_s32_f32(const QwNeonRegister dst, const QwNeonRegister src);
|
| + void vcvt_u32_f32(const QwNeonRegister dst, const QwNeonRegister src);
|
| +
|
| void veor(DwVfpRegister dst, DwVfpRegister src1, DwVfpRegister src2);
|
| void veor(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
|
| + void vadd(const QwNeonRegister dst, const QwNeonRegister src1,
|
| + const QwNeonRegister src2);
|
| + void vadd(NeonSize size, const QwNeonRegister dst, const QwNeonRegister src1,
|
| + const QwNeonRegister src2);
|
| + void vsub(const QwNeonRegister dst, const QwNeonRegister src1,
|
| + const QwNeonRegister src2);
|
| + void vsub(NeonSize size, const QwNeonRegister dst, const QwNeonRegister src1,
|
| + const QwNeonRegister src2);
|
| + void vtst(NeonSize size, const QwNeonRegister dst, const QwNeonRegister src1,
|
| + const QwNeonRegister src2);
|
| + void vceq(NeonSize size, const QwNeonRegister dst, const QwNeonRegister src1,
|
| + const QwNeonRegister src2);
|
| + void vbsl(const QwNeonRegister dst, const QwNeonRegister src1,
|
| + const QwNeonRegister src2);
|
| + void vtbl(const DwVfpRegister dst, const NeonListOperand& list,
|
| + const DwVfpRegister index);
|
| + void vtbx(const DwVfpRegister dst, const NeonListOperand& list,
|
| + const DwVfpRegister index);
|
|
|
| // Pseudo instructions
|
|
|
|
|