Chromium Code Reviews| Index: src/arm/assembler-arm.cc |
| diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc |
| index f748d64f846a8df6f288f00591c7bb16cf2e2e8d..3c35cf8450a61988515912d6dbf5006aff2a94f5 100644 |
| --- a/src/arm/assembler-arm.cc |
| +++ b/src/arm/assembler-arm.cc |
| @@ -4260,7 +4260,7 @@ void Assembler::vtst(NeonSize size, QwNeonRegister dst, |
| void Assembler::vceq(const QwNeonRegister dst, const QwNeonRegister src1, |
| const QwNeonRegister src2) { |
| DCHECK(IsEnabled(NEON)); |
| - // Qd = vceq(Qn, Qm) SIMD integer compare equal. |
| + // Qd = vceq(Qn, Qm) SIMD floating point compare equal. |
| // Instruction details available in ARM DDI 0406C.b, A8-844. |
| int vd, d; |
| dst.split_code(&vd, &d); |
| @@ -4275,7 +4275,7 @@ void Assembler::vceq(const QwNeonRegister dst, const QwNeonRegister src1, |
| void Assembler::vceq(NeonSize size, QwNeonRegister dst, |
| const QwNeonRegister src1, const QwNeonRegister src2) { |
| DCHECK(IsEnabled(NEON)); |
| - // Qd = vceq(Qn, Qm) SIMD bitwise compare equal. |
| + // Qd = vceq(Qn, Qm) SIMD integer compare equal. |
| // Instruction details available in ARM DDI 0406C.b, A8-844. |
| int vd, d; |
| dst.split_code(&vd, &d); |
| @@ -4288,6 +4288,66 @@ void Assembler::vceq(NeonSize size, QwNeonRegister dst, |
| n * B7 | B6 | m * B5 | B4 | vm); |
| } |
| +static Instr EncodeNeonCompareOp(const QwNeonRegister dst, |
|
martyn.capewell
2017/01/06 19:10:21
Why not pass a Condition argument and encapsulate
bbudge
2017/01/10 11:17:51
Done.
|
| + const QwNeonRegister src1, |
| + const QwNeonRegister src2) { |
| + int vd, d; |
| + dst.split_code(&vd, &d); |
| + int vn, n; |
| + src1.split_code(&vn, &n); |
| + int vm, m; |
| + src2.split_code(&vm, &m); |
| + return 0x1E6U * B23 | d * B22 | vn * B16 | vd * B12 | 0xe * B8 | n * B7 | B6 | |
| + m * B5 | vm; |
| +} |
| + |
| +static Instr EncodeNeonCompareOp(NeonDataType dt, const QwNeonRegister dst, |
| + const QwNeonRegister src1, |
| + const QwNeonRegister src2) { |
| + 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 size = (dt & NeonDataTypeSizeMask) / 2; |
| + int U = dt & NeonDataTypeUMask; |
| + return 0x1E4U * B23 | U | d * B22 | size * B20 | vn * B16 | vd * B12 | |
| + 0x3 * B8 | n * B7 | B6 | m * B5 | vm; |
| +} |
| + |
| +void Assembler::vcge(const QwNeonRegister dst, const QwNeonRegister src1, |
| + const QwNeonRegister src2) { |
| + DCHECK(IsEnabled(NEON)); |
| + // Qd = vcge(Qn, Qm) SIMD floating point compare greater or equal. |
| + // Instruction details available in ARM DDI 0406C.b, A8-848. |
| + emit(EncodeNeonCompareOp(dst, src1, src2)); |
| +} |
| + |
| +void Assembler::vcge(NeonDataType dt, QwNeonRegister dst, |
| + const QwNeonRegister src1, const QwNeonRegister src2) { |
| + DCHECK(IsEnabled(NEON)); |
| + // Qd = vcge(Qn, Qm) SIMD integer compare greater or equal. |
| + // Instruction details available in ARM DDI 0406C.b, A8-848. |
| + emit(EncodeNeonCompareOp(dt, dst, src1, src2) | B4); |
| +} |
| + |
| +void Assembler::vcgt(const QwNeonRegister dst, const QwNeonRegister src1, |
| + const QwNeonRegister src2) { |
| + DCHECK(IsEnabled(NEON)); |
| + // Qd = vcgt(Qn, Qm) SIMD floating point compare greater than. |
| + // Instruction details available in ARM DDI 0406C.b, A8-852. |
| + emit(EncodeNeonCompareOp(dst, src1, src2) | B21); |
| +} |
| + |
| +void Assembler::vcgt(NeonDataType dt, QwNeonRegister dst, |
| + const QwNeonRegister src1, const QwNeonRegister src2) { |
| + DCHECK(IsEnabled(NEON)); |
| + // Qd = vcgt(Qn, Qm) SIMD integer compare greater than. |
| + // Instruction details available in ARM DDI 0406C.b, A8-852. |
| + emit(EncodeNeonCompareOp(dt, dst, src1, src2)); |
| +} |
| + |
| void Assembler::vbsl(QwNeonRegister dst, const QwNeonRegister src1, |
| const QwNeonRegister src2) { |
| DCHECK(IsEnabled(NEON)); |