OLD | NEW |
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
2 // All Rights Reserved. | 2 // All Rights Reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions | 5 // modification, are permitted provided that the following conditions |
6 // are met: | 6 // are met: |
7 // | 7 // |
8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
10 // | 10 // |
(...skipping 3916 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3927 DCHECK(dt == NeonS32 || dt == NeonU32 || IsEnabled(NEON)); | 3927 DCHECK(dt == NeonS32 || dt == NeonU32 || IsEnabled(NEON)); |
3928 int vn, n; | 3928 int vn, n; |
3929 src.split_code(&vn, &n); | 3929 src.split_code(&vn, &n); |
3930 int opc1_opc2 = EncodeScalar(dt, index); | 3930 int opc1_opc2 = EncodeScalar(dt, index); |
3931 int u = (dt & NeonDataTypeUMask) != 0 ? 1 : 0; | 3931 int u = (dt & NeonDataTypeUMask) != 0 ? 1 : 0; |
3932 emit(0xEEu * B24 | u * B23 | B20 | vn * B16 | dst.code() * B12 | 0xB * B8 | | 3932 emit(0xEEu * B24 | u * B23 | B20 | vn * B16 | dst.code() * B12 | 0xB * B8 | |
3933 n * B7 | B4 | opc1_opc2); | 3933 n * B7 | B4 | opc1_opc2); |
3934 } | 3934 } |
3935 | 3935 |
3936 void Assembler::vmov(const QwNeonRegister dst, const QwNeonRegister src) { | 3936 void Assembler::vmov(const QwNeonRegister dst, const QwNeonRegister src) { |
3937 DCHECK(IsEnabled(NEON)); | |
3938 // Instruction details available in ARM DDI 0406C.b, A8-938. | 3937 // Instruction details available in ARM DDI 0406C.b, A8-938. |
3939 DCHECK(VfpRegisterIsAvailable(dst)); | 3938 // vmov is encoded as vorr. |
3940 DCHECK(VfpRegisterIsAvailable(src)); | 3939 vorr(dst, src, src); |
3941 int vd, d; | |
3942 dst.split_code(&vd, &d); | |
3943 int vm, m; | |
3944 src.split_code(&vm, &m); | |
3945 emit(0x1E4U * B23 | d * B22 | 2 * B20 | vm * B16 | vd * B12 | B8 | m * B7 | | |
3946 B6 | m * B5 | B4 | vm); | |
3947 } | 3940 } |
3948 | 3941 |
3949 void Assembler::vmvn(const QwNeonRegister dst, const QwNeonRegister src) { | 3942 void Assembler::vmvn(const QwNeonRegister dst, const QwNeonRegister src) { |
3950 DCHECK(IsEnabled(NEON)); | 3943 DCHECK(IsEnabled(NEON)); |
3951 // Instruction details available in ARM DDI 0406C.b, A8-966. | 3944 // Instruction details available in ARM DDI 0406C.b, A8-966. |
3952 DCHECK(VfpRegisterIsAvailable(dst)); | 3945 DCHECK(VfpRegisterIsAvailable(dst)); |
3953 DCHECK(VfpRegisterIsAvailable(src)); | 3946 DCHECK(VfpRegisterIsAvailable(src)); |
3954 int vd, d; | 3947 int vd, d; |
3955 dst.split_code(&vd, &d); | 3948 dst.split_code(&vd, &d); |
3956 int vm, m; | 3949 int vm, m; |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4131 int vd, d; | 4124 int vd, d; |
4132 dst.split_code(&vd, &d); | 4125 dst.split_code(&vd, &d); |
4133 int vn, n; | 4126 int vn, n; |
4134 src1.split_code(&vn, &n); | 4127 src1.split_code(&vn, &n); |
4135 int vm, m; | 4128 int vm, m; |
4136 src2.split_code(&vm, &m); | 4129 src2.split_code(&vm, &m); |
4137 emit(0x1E6U * B23 | d * B22 | vn * B16 | vd * B12 | B8 | n * B7 | m * B5 | | 4130 emit(0x1E6U * B23 | d * B22 | vn * B16 | vd * B12 | B8 | n * B7 | m * B5 | |
4138 B4 | vm); | 4131 B4 | vm); |
4139 } | 4132 } |
4140 | 4133 |
4141 void Assembler::veor(QwNeonRegister dst, QwNeonRegister src1, | 4134 enum BinaryBitwiseOp { VAND, VBIC, VBIF, VBIT, VBSL, VEOR, VORR, VORN }; |
4142 QwNeonRegister src2) { | 4135 |
4143 // Qd = veor(Qn, Qm) SIMD integer exclusive OR. | 4136 static Instr EncodeNeonBinaryBitwiseOp(BinaryBitwiseOp op, |
4144 // Instruction details available in ARM DDI 0406C.b, A8.8.888. | 4137 const QwNeonRegister dst, |
4145 DCHECK(IsEnabled(NEON)); | 4138 const QwNeonRegister src1, |
| 4139 const QwNeonRegister src2) { |
| 4140 int op_encoding = 0; |
| 4141 switch (op) { |
| 4142 case VBIC: |
| 4143 op_encoding = 0x1 * B20; |
| 4144 break; |
| 4145 case VBIF: |
| 4146 op_encoding = B24 | 0x3 * B20; |
| 4147 break; |
| 4148 case VBIT: |
| 4149 op_encoding = B24 | 0x2 * B20; |
| 4150 break; |
| 4151 case VBSL: |
| 4152 op_encoding = B24 | 0x1 * B20; |
| 4153 break; |
| 4154 case VEOR: |
| 4155 op_encoding = B24; |
| 4156 break; |
| 4157 case VORR: |
| 4158 op_encoding = 0x2 * B20; |
| 4159 break; |
| 4160 case VORN: |
| 4161 op_encoding = 0x3 * B20; |
| 4162 break; |
| 4163 case VAND: |
| 4164 // op_encoding is 0. |
| 4165 break; |
| 4166 default: |
| 4167 UNREACHABLE(); |
| 4168 break; |
| 4169 } |
4146 int vd, d; | 4170 int vd, d; |
4147 dst.split_code(&vd, &d); | 4171 dst.split_code(&vd, &d); |
4148 int vn, n; | 4172 int vn, n; |
4149 src1.split_code(&vn, &n); | 4173 src1.split_code(&vn, &n); |
4150 int vm, m; | 4174 int vm, m; |
4151 src2.split_code(&vm, &m); | 4175 src2.split_code(&vm, &m); |
4152 emit(0x1E6U * B23 | d * B22 | vn * B16 | vd * B12 | B8 | n * B7 | B6 | | 4176 return 0x1E4U * B23 | op_encoding | d * B22 | vn * B16 | vd * B12 | B8 | |
4153 m * B5 | B4 | vm); | 4177 n * B7 | B6 | m * B5 | B4 | vm; |
| 4178 } |
| 4179 |
| 4180 void Assembler::vand(QwNeonRegister dst, QwNeonRegister src1, |
| 4181 QwNeonRegister src2) { |
| 4182 // Qd = vand(Qn, Qm) SIMD AND. |
| 4183 // Instruction details available in ARM DDI 0406C.b, A8.8.836. |
| 4184 DCHECK(IsEnabled(NEON)); |
| 4185 emit(EncodeNeonBinaryBitwiseOp(VAND, dst, src1, src2)); |
| 4186 } |
| 4187 |
| 4188 void Assembler::vbsl(QwNeonRegister dst, const QwNeonRegister src1, |
| 4189 const QwNeonRegister src2) { |
| 4190 DCHECK(IsEnabled(NEON)); |
| 4191 // Qd = vbsl(Qn, Qm) SIMD bitwise select. |
| 4192 // Instruction details available in ARM DDI 0406C.b, A8-844. |
| 4193 emit(EncodeNeonBinaryBitwiseOp(VBSL, dst, src1, src2)); |
| 4194 } |
| 4195 |
| 4196 void Assembler::veor(QwNeonRegister dst, QwNeonRegister src1, |
| 4197 QwNeonRegister src2) { |
| 4198 // Qd = veor(Qn, Qm) SIMD exclusive OR. |
| 4199 // Instruction details available in ARM DDI 0406C.b, A8.8.888. |
| 4200 DCHECK(IsEnabled(NEON)); |
| 4201 emit(EncodeNeonBinaryBitwiseOp(VEOR, dst, src1, src2)); |
| 4202 } |
| 4203 |
| 4204 void Assembler::vorr(QwNeonRegister dst, QwNeonRegister src1, |
| 4205 QwNeonRegister src2) { |
| 4206 // Qd = vorr(Qn, Qm) SIMD OR. |
| 4207 // Instruction details available in ARM DDI 0406C.b, A8.8.976. |
| 4208 DCHECK(IsEnabled(NEON)); |
| 4209 emit(EncodeNeonBinaryBitwiseOp(VORR, dst, src1, src2)); |
4154 } | 4210 } |
4155 | 4211 |
4156 void Assembler::vadd(QwNeonRegister dst, const QwNeonRegister src1, | 4212 void Assembler::vadd(QwNeonRegister dst, const QwNeonRegister src1, |
4157 const QwNeonRegister src2) { | 4213 const QwNeonRegister src2) { |
4158 DCHECK(IsEnabled(NEON)); | 4214 DCHECK(IsEnabled(NEON)); |
4159 // Qd = vadd(Qn, Qm) SIMD floating point addition. | 4215 // Qd = vadd(Qn, Qm) SIMD floating point addition. |
4160 // Instruction details available in ARM DDI 0406C.b, A8-830. | 4216 // Instruction details available in ARM DDI 0406C.b, A8-830. |
4161 int vd, d; | 4217 int vd, d; |
4162 dst.split_code(&vd, &d); | 4218 dst.split_code(&vd, &d); |
4163 int vn, n; | 4219 int vn, n; |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4404 } | 4460 } |
4405 | 4461 |
4406 void Assembler::vcgt(NeonDataType dt, QwNeonRegister dst, | 4462 void Assembler::vcgt(NeonDataType dt, QwNeonRegister dst, |
4407 const QwNeonRegister src1, const QwNeonRegister src2) { | 4463 const QwNeonRegister src1, const QwNeonRegister src2) { |
4408 DCHECK(IsEnabled(NEON)); | 4464 DCHECK(IsEnabled(NEON)); |
4409 // Qd = vcgt(Qn, Qm) SIMD integer compare greater than. | 4465 // Qd = vcgt(Qn, Qm) SIMD integer compare greater than. |
4410 // Instruction details available in ARM DDI 0406C.b, A8-852. | 4466 // Instruction details available in ARM DDI 0406C.b, A8-852. |
4411 emit(EncodeNeonCompareOp(dt, dst, src1, src2, gt)); | 4467 emit(EncodeNeonCompareOp(dt, dst, src1, src2, gt)); |
4412 } | 4468 } |
4413 | 4469 |
4414 void Assembler::vbsl(QwNeonRegister dst, const QwNeonRegister src1, | |
4415 const QwNeonRegister src2) { | |
4416 DCHECK(IsEnabled(NEON)); | |
4417 // Qd = vbsl(Qn, Qm) SIMD bitwise select. | |
4418 // Instruction details available in ARM DDI 0406C.b, A8-844. | |
4419 int vd, d; | |
4420 dst.split_code(&vd, &d); | |
4421 int vn, n; | |
4422 src1.split_code(&vn, &n); | |
4423 int vm, m; | |
4424 src2.split_code(&vm, &m); | |
4425 int op = 1; // vbsl | |
4426 emit(0x1E6U * B23 | d * B22 | op * B20 | vn * B16 | vd * B12 | 0x1 * B8 | | |
4427 n * B7 | B6 | m * B5 | B4 | vm); | |
4428 } | |
4429 | |
4430 void Assembler::vext(QwNeonRegister dst, const QwNeonRegister src1, | 4470 void Assembler::vext(QwNeonRegister dst, const QwNeonRegister src1, |
4431 const QwNeonRegister src2, int bytes) { | 4471 const QwNeonRegister src2, int bytes) { |
4432 DCHECK(IsEnabled(NEON)); | 4472 DCHECK(IsEnabled(NEON)); |
4433 // Qd = vext(Qn, Qm) SIMD byte extract. | 4473 // Qd = vext(Qn, Qm) SIMD byte extract. |
4434 // Instruction details available in ARM DDI 0406C.b, A8-890. | 4474 // Instruction details available in ARM DDI 0406C.b, A8-890. |
4435 int vd, d; | 4475 int vd, d; |
4436 dst.split_code(&vd, &d); | 4476 dst.split_code(&vd, &d); |
4437 int vn, n; | 4477 int vn, n; |
4438 src1.split_code(&vn, &n); | 4478 src1.split_code(&vn, &n); |
4439 int vm, m; | 4479 int vm, m; |
(...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5067 DCHECK(is_uint12(offset)); | 5107 DCHECK(is_uint12(offset)); |
5068 instr_at_put(pc, SetLdrRegisterImmediateOffset(instr, offset)); | 5108 instr_at_put(pc, SetLdrRegisterImmediateOffset(instr, offset)); |
5069 } | 5109 } |
5070 } | 5110 } |
5071 | 5111 |
5072 | 5112 |
5073 } // namespace internal | 5113 } // namespace internal |
5074 } // namespace v8 | 5114 } // namespace v8 |
5075 | 5115 |
5076 #endif // V8_TARGET_ARCH_ARM | 5116 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |