| 390 | |
| 391 | template <typename Scalar, typename Packet> |
| 392 | void packetmath() { |
| 393 | typedef internal::packet_traits<Scalar> PacketTraits; |
| 394 | const int PacketSize = internal::unpacket_traits<Packet>::size; |
| 395 | typedef typename NumTraits<Scalar>::Real RealScalar; |
| 396 | |
| 397 | if (g_first_pass) |
| 398 | std::cerr << "=== Testing packet of type '" << typeid(Packet).name() << "' and scalar type '" |
| 399 | << typeid(Scalar).name() << "' and size '" << PacketSize << "' ===\n"; |
| 400 | |
| 401 | const int max_size = PacketSize > 4 ? PacketSize : 4; |
| 402 | const int size = PacketSize * max_size; |
| 403 | EIGEN_ALIGN_MAX Scalar data1[size]; |
| 404 | EIGEN_ALIGN_MAX Scalar data2[size]; |
| 405 | EIGEN_ALIGN_MAX Scalar data3[size]; |
| 406 | EIGEN_ALIGN_MAX Scalar ref[size]; |
| 407 | RealScalar refvalue = RealScalar(0); |
| 408 | |
| 409 | eigen_optimization_barrier_test<Packet>::run(); |
| 410 | eigen_optimization_barrier_test<Scalar>::run(); |
| 411 | |
| 412 | for (int i = 0; i < size; ++i) { |
| 413 | data1[i] = internal::random<Scalar>() / RealScalar(PacketSize); |
| 414 | data2[i] = internal::random<Scalar>() / RealScalar(PacketSize); |
| 415 | refvalue = (std::max)(refvalue, numext::abs(data1[i])); |
| 416 | } |
| 417 | |
| 418 | internal::pstore(data2, internal::pload<Packet>(data1)); |
| 419 | VERIFY(test::areApprox(data1, data2, PacketSize) && "aligned load/store"); |
| 420 | |
| 421 | for (int offset = 0; offset < PacketSize; ++offset) { |
| 422 | internal::pstore(data2, internal::ploadu<Packet>(data1 + offset)); |
| 423 | VERIFY(test::areApprox(data1 + offset, data2, PacketSize) && "internal::ploadu"); |
| 424 | } |
| 425 | |
| 426 | for (int offset = 0; offset < PacketSize; ++offset) { |
| 427 | internal::pstoreu(data2 + offset, internal::pload<Packet>(data1)); |
| 428 | VERIFY(test::areApprox(data1, data2 + offset, PacketSize) && "internal::pstoreu"); |
| 429 | } |
| 430 | |
| 431 | if (internal::unpacket_traits<Packet>::masked_load_available) { |
| 432 | test::packet_helper<internal::unpacket_traits<Packet>::masked_load_available, Packet> h; |
| 433 | unsigned long long max_umask = (0x1ull << PacketSize); |
| 434 | |
| 435 | for (int offset = 0; offset < PacketSize; ++offset) { |
| 436 | for (unsigned long long umask = 0; umask < max_umask; ++umask) { |
| 437 | h.store(data2, h.load(data1 + offset, umask)); |
| 438 | for (int k = 0; k < PacketSize; ++k) data3[k] = ((umask & (0x1ull << k)) >> k) ? data1[k + offset] : Scalar(0); |
| 439 | VERIFY(test::areApprox(data3, data2, PacketSize) && "internal::ploadu masked"); |
| 440 | } |
| 441 | } |
| 442 | } |
| 443 | |
| 444 | if (internal::unpacket_traits<Packet>::masked_store_available) { |
| 445 | test::packet_helper<internal::unpacket_traits<Packet>::masked_store_available, Packet> h; |
| 446 | unsigned long long max_umask = (0x1ull << PacketSize); |
| 447 | |
| 448 | for (int offset = 0; offset < PacketSize; ++offset) { |
| 449 | for (unsigned long long umask = 0; umask < max_umask; ++umask) { |
nothing calls this directly
no test coverage detected