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 4254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4265 int vd, d; | 4265 int vd, d; |
4266 dst.split_code(&vd, &d); | 4266 dst.split_code(&vd, &d); |
4267 int vn, n; | 4267 int vn, n; |
4268 src1.split_code(&vn, &n); | 4268 src1.split_code(&vn, &n); |
4269 int vm, m; | 4269 int vm, m; |
4270 src2.split_code(&vm, &m); | 4270 src2.split_code(&vm, &m); |
4271 return 0x1E4U * B23 | d * B22 | vn * B16 | vd * B12 | n * B7 | B6 | m * B5 | | 4271 return 0x1E4U * B23 | d * B22 | vn * B16 | vd * B12 | n * B7 | B6 | m * B5 | |
4272 vm | op_encoding; | 4272 vm | op_encoding; |
4273 } | 4273 } |
4274 | 4274 |
4275 enum IntegerBinOp { VADD, VSUB, VMUL, VMIN, VMAX, VTST, VCEQ, VCGE, VCGT }; | 4275 enum IntegerBinOp { |
| 4276 VADD, |
| 4277 VQADD, |
| 4278 VSUB, |
| 4279 VQSUB, |
| 4280 VMUL, |
| 4281 VMIN, |
| 4282 VMAX, |
| 4283 VTST, |
| 4284 VCEQ, |
| 4285 VCGE, |
| 4286 VCGT |
| 4287 }; |
4276 | 4288 |
4277 static Instr EncodeNeonBinOp(IntegerBinOp op, NeonDataType dt, | 4289 static Instr EncodeNeonBinOp(IntegerBinOp op, NeonDataType dt, |
4278 const QwNeonRegister dst, | 4290 const QwNeonRegister dst, |
4279 const QwNeonRegister src1, | 4291 const QwNeonRegister src1, |
4280 const QwNeonRegister src2) { | 4292 const QwNeonRegister src2) { |
4281 int op_encoding = 0; | 4293 int op_encoding = 0; |
4282 switch (op) { | 4294 switch (op) { |
4283 case VADD: | 4295 case VADD: |
4284 op_encoding = 0x8 * B8; | 4296 op_encoding = 0x8 * B8; |
4285 break; | 4297 break; |
| 4298 case VQADD: |
| 4299 op_encoding = B4; |
| 4300 break; |
4286 case VSUB: | 4301 case VSUB: |
4287 op_encoding = B24 | 0x8 * B8; | 4302 op_encoding = B24 | 0x8 * B8; |
4288 break; | 4303 break; |
| 4304 case VQSUB: |
| 4305 op_encoding = 0x2 * B8 | B4; |
| 4306 break; |
4289 case VMUL: | 4307 case VMUL: |
4290 op_encoding = 0x9 * B8 | B4; | 4308 op_encoding = 0x9 * B8 | B4; |
4291 break; | 4309 break; |
4292 case VMIN: | 4310 case VMIN: |
4293 op_encoding = 0x6 * B8 | B4; | 4311 op_encoding = 0x6 * B8 | B4; |
4294 break; | 4312 break; |
4295 case VMAX: | 4313 case VMAX: |
4296 op_encoding = 0x6 * B8; | 4314 op_encoding = 0x6 * B8; |
4297 break; | 4315 break; |
4298 case VTST: | 4316 case VTST: |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4341 } | 4359 } |
4342 | 4360 |
4343 void Assembler::vadd(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, | 4361 void Assembler::vadd(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, |
4344 QwNeonRegister src2) { | 4362 QwNeonRegister src2) { |
4345 DCHECK(IsEnabled(NEON)); | 4363 DCHECK(IsEnabled(NEON)); |
4346 // Qd = vadd(Qn, Qm) SIMD integer addition. | 4364 // Qd = vadd(Qn, Qm) SIMD integer addition. |
4347 // Instruction details available in ARM DDI 0406C.b, A8-828. | 4365 // Instruction details available in ARM DDI 0406C.b, A8-828. |
4348 emit(EncodeNeonBinOp(VADD, size, dst, src1, src2)); | 4366 emit(EncodeNeonBinOp(VADD, size, dst, src1, src2)); |
4349 } | 4367 } |
4350 | 4368 |
| 4369 void Assembler::vqadd(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, |
| 4370 QwNeonRegister src2) { |
| 4371 DCHECK(IsEnabled(NEON)); |
| 4372 // Qd = vqadd(Qn, Qm) SIMD integer saturating addition. |
| 4373 // Instruction details available in ARM DDI 0406C.b, A8-996. |
| 4374 emit(EncodeNeonBinOp(VQADD, dt, dst, src1, src2)); |
| 4375 } |
| 4376 |
4351 void Assembler::vsub(QwNeonRegister dst, QwNeonRegister src1, | 4377 void Assembler::vsub(QwNeonRegister dst, QwNeonRegister src1, |
4352 QwNeonRegister src2) { | 4378 QwNeonRegister src2) { |
4353 DCHECK(IsEnabled(NEON)); | 4379 DCHECK(IsEnabled(NEON)); |
4354 // Qd = vsub(Qn, Qm) SIMD floating point subtraction. | 4380 // Qd = vsub(Qn, Qm) SIMD floating point subtraction. |
4355 // Instruction details available in ARM DDI 0406C.b, A8-1086. | 4381 // Instruction details available in ARM DDI 0406C.b, A8-1086. |
4356 emit(EncodeNeonBinOp(VSUBF, dst, src1, src2)); | 4382 emit(EncodeNeonBinOp(VSUBF, dst, src1, src2)); |
4357 } | 4383 } |
4358 | 4384 |
4359 void Assembler::vsub(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, | 4385 void Assembler::vsub(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, |
4360 QwNeonRegister src2) { | 4386 QwNeonRegister src2) { |
4361 DCHECK(IsEnabled(NEON)); | 4387 DCHECK(IsEnabled(NEON)); |
4362 // Qd = vsub(Qn, Qm) SIMD integer subtraction. | 4388 // Qd = vsub(Qn, Qm) SIMD integer subtraction. |
4363 // Instruction details available in ARM DDI 0406C.b, A8-1084. | 4389 // Instruction details available in ARM DDI 0406C.b, A8-1084. |
4364 emit(EncodeNeonBinOp(VSUB, size, dst, src1, src2)); | 4390 emit(EncodeNeonBinOp(VSUB, size, dst, src1, src2)); |
4365 } | 4391 } |
4366 | 4392 |
| 4393 void Assembler::vqsub(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, |
| 4394 QwNeonRegister src2) { |
| 4395 DCHECK(IsEnabled(NEON)); |
| 4396 // Qd = vqsub(Qn, Qm) SIMD integer saturating subtraction. |
| 4397 // Instruction details available in ARM DDI 0406C.b, A8-1020. |
| 4398 emit(EncodeNeonBinOp(VQSUB, dt, dst, src1, src2)); |
| 4399 } |
| 4400 |
4367 void Assembler::vmul(QwNeonRegister dst, QwNeonRegister src1, | 4401 void Assembler::vmul(QwNeonRegister dst, QwNeonRegister src1, |
4368 QwNeonRegister src2) { | 4402 QwNeonRegister src2) { |
4369 DCHECK(IsEnabled(NEON)); | 4403 DCHECK(IsEnabled(NEON)); |
4370 // Qd = vadd(Qn, Qm) SIMD floating point multiply. | 4404 // Qd = vadd(Qn, Qm) SIMD floating point multiply. |
4371 // Instruction details available in ARM DDI 0406C.b, A8-958. | 4405 // Instruction details available in ARM DDI 0406C.b, A8-958. |
4372 emit(EncodeNeonBinOp(VMULF, dst, src1, src2)); | 4406 emit(EncodeNeonBinOp(VMULF, dst, src1, src2)); |
4373 } | 4407 } |
4374 | 4408 |
4375 void Assembler::vmul(NeonSize size, QwNeonRegister dst, | 4409 void Assembler::vmul(NeonSize size, QwNeonRegister dst, |
4376 const QwNeonRegister src1, const QwNeonRegister src2) { | 4410 const QwNeonRegister src1, const QwNeonRegister src2) { |
(...skipping 814 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5191 DCHECK(is_uint12(offset)); | 5225 DCHECK(is_uint12(offset)); |
5192 instr_at_put(pc, SetLdrRegisterImmediateOffset(instr, offset)); | 5226 instr_at_put(pc, SetLdrRegisterImmediateOffset(instr, offset)); |
5193 } | 5227 } |
5194 } | 5228 } |
5195 | 5229 |
5196 | 5230 |
5197 } // namespace internal | 5231 } // namespace internal |
5198 } // namespace v8 | 5232 } // namespace v8 |
5199 | 5233 |
5200 #endif // V8_TARGET_ARCH_ARM | 5234 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |