Index: src/arm/assembler-arm.cc |
diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc |
index b109130b6d616a240cea7195c7009db1dd119f1f..60beea4b842a7be343a3568468165e88b2dd6e19 100644 |
--- a/src/arm/assembler-arm.cc |
+++ b/src/arm/assembler-arm.cc |
@@ -3934,16 +3934,9 @@ void Assembler::vmov(NeonDataType dt, Register dst, DwVfpRegister src, |
} |
void Assembler::vmov(const QwNeonRegister dst, const QwNeonRegister src) { |
- DCHECK(IsEnabled(NEON)); |
// Instruction details available in ARM DDI 0406C.b, A8-938. |
- DCHECK(VfpRegisterIsAvailable(dst)); |
- DCHECK(VfpRegisterIsAvailable(src)); |
- int vd, d; |
- dst.split_code(&vd, &d); |
- int vm, m; |
- src.split_code(&vm, &m); |
- emit(0x1E4U * B23 | d * B22 | 2 * B20 | vm * B16 | vd * B12 | B8 | m * B7 | |
- B6 | m * B5 | B4 | vm); |
+ // vmov is encoded as vorr. |
+ vorr(dst, src, src); |
} |
void Assembler::vmvn(const QwNeonRegister dst, const QwNeonRegister src) { |
@@ -4138,19 +4131,82 @@ void Assembler::veor(DwVfpRegister dst, DwVfpRegister src1, |
B4 | vm); |
} |
-void Assembler::veor(QwNeonRegister dst, QwNeonRegister src1, |
- QwNeonRegister src2) { |
- // Qd = veor(Qn, Qm) SIMD integer exclusive OR. |
- // Instruction details available in ARM DDI 0406C.b, A8.8.888. |
- DCHECK(IsEnabled(NEON)); |
+enum BinaryBitwiseOp { VAND, VBIC, VBIF, VBIT, VBSL, VEOR, VORR, VORN }; |
+ |
+static Instr EncodeNeonBinaryBitwiseOp(BinaryBitwiseOp op, |
+ const QwNeonRegister dst, |
+ const QwNeonRegister src1, |
+ const QwNeonRegister src2) { |
+ int op_encoding = 0; |
+ switch (op) { |
+ case VBIC: |
+ op_encoding = 0x1 * B20; |
+ break; |
+ case VBIF: |
+ op_encoding = B24 | 0x3 * B20; |
+ break; |
+ case VBIT: |
+ op_encoding = B24 | 0x2 * B20; |
+ break; |
+ case VBSL: |
+ op_encoding = B24 | 0x1 * B20; |
+ break; |
+ case VEOR: |
+ op_encoding = B24; |
+ break; |
+ case VORR: |
+ op_encoding = 0x2 * B20; |
+ break; |
+ case VORN: |
+ op_encoding = 0x3 * B20; |
+ break; |
+ case VAND: |
+ // op_encoding is 0. |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ break; |
+ } |
int vd, d; |
dst.split_code(&vd, &d); |
int vn, n; |
src1.split_code(&vn, &n); |
int vm, m; |
src2.split_code(&vm, &m); |
- emit(0x1E6U * B23 | d * B22 | vn * B16 | vd * B12 | B8 | n * B7 | B6 | |
- m * B5 | B4 | vm); |
+ return 0x1E4U * B23 | op_encoding | d * B22 | vn * B16 | vd * B12 | B8 | |
+ n * B7 | B6 | m * B5 | B4 | vm; |
+} |
+ |
+void Assembler::vand(QwNeonRegister dst, QwNeonRegister src1, |
+ QwNeonRegister src2) { |
+ // Qd = vand(Qn, Qm) SIMD AND. |
+ // Instruction details available in ARM DDI 0406C.b, A8.8.836. |
+ DCHECK(IsEnabled(NEON)); |
+ emit(EncodeNeonBinaryBitwiseOp(VAND, dst, src1, src2)); |
+} |
+ |
+void Assembler::vbsl(QwNeonRegister dst, const QwNeonRegister src1, |
+ const QwNeonRegister src2) { |
+ DCHECK(IsEnabled(NEON)); |
+ // Qd = vbsl(Qn, Qm) SIMD bitwise select. |
+ // Instruction details available in ARM DDI 0406C.b, A8-844. |
+ emit(EncodeNeonBinaryBitwiseOp(VBSL, dst, src1, src2)); |
+} |
+ |
+void Assembler::veor(QwNeonRegister dst, QwNeonRegister src1, |
+ QwNeonRegister src2) { |
+ // Qd = veor(Qn, Qm) SIMD exclusive OR. |
+ // Instruction details available in ARM DDI 0406C.b, A8.8.888. |
+ DCHECK(IsEnabled(NEON)); |
+ emit(EncodeNeonBinaryBitwiseOp(VEOR, dst, src1, src2)); |
+} |
+ |
+void Assembler::vorr(QwNeonRegister dst, QwNeonRegister src1, |
+ QwNeonRegister src2) { |
+ // Qd = vorr(Qn, Qm) SIMD OR. |
+ // Instruction details available in ARM DDI 0406C.b, A8.8.976. |
+ DCHECK(IsEnabled(NEON)); |
+ emit(EncodeNeonBinaryBitwiseOp(VORR, dst, src1, src2)); |
} |
void Assembler::vadd(QwNeonRegister dst, const QwNeonRegister src1, |
@@ -4411,22 +4467,6 @@ void Assembler::vcgt(NeonDataType dt, QwNeonRegister dst, |
emit(EncodeNeonCompareOp(dt, dst, src1, src2, gt)); |
} |
-void Assembler::vbsl(QwNeonRegister dst, const QwNeonRegister src1, |
- const QwNeonRegister src2) { |
- DCHECK(IsEnabled(NEON)); |
- // Qd = vbsl(Qn, Qm) SIMD bitwise select. |
- // Instruction details available in ARM DDI 0406C.b, A8-844. |
- int vd, d; |
- dst.split_code(&vd, &d); |
- int vn, n; |
- src1.split_code(&vn, &n); |
- int vm, m; |
- src2.split_code(&vm, &m); |
- int op = 1; // vbsl |
- emit(0x1E6U * B23 | d * B22 | op * B20 | vn * B16 | vd * B12 | 0x1 * B8 | |
- n * B7 | B6 | m * B5 | B4 | vm); |
-} |
- |
void Assembler::vext(QwNeonRegister dst, const QwNeonRegister src1, |
const QwNeonRegister src2, int bytes) { |
DCHECK(IsEnabled(NEON)); |