message: bitwise xor op now uses vectorised xor on CPU.
  To get vectorised xor on CUDA, additional changes need to be made to Eigen;
  specifically adding packetwise xor operations for the various float and double
  types (float2, float4, double2).  Once those are in, this op will magically
  pick them up as well.
diff: @@ -43,7 +43,8 @@ struct functor_traits<scalar_fmod2_op<T>> {
  };
  };
  -template<typename T> struct scalar_asinh_op {
  +template <typename T>
  +struct scalar_asinh_op {
  EIGEN_EMPTY_STRUCT_CTOR(scalar_asinh_op)
  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T operator()(const T& a) const {
  return std::asinh(a);
  @@ -54,7 +55,8 @@ struct functor_traits<scalar_asinh_op<T>> {
  enum { Cost = 5 * NumTraits<T>::MulCost, PacketAccess = false };
  };
  -template<typename T> struct scalar_acosh_op {
  +template <typename T>
  +struct scalar_acosh_op {
  EIGEN_EMPTY_STRUCT_CTOR(scalar_acosh_op)
  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T operator()(const T& a) const {
  return std::acosh(a);
  @@ -65,7 +67,8 @@ struct functor_traits<scalar_acosh_op<T>> {
  enum { Cost = 5 * NumTraits<T>::MulCost, PacketAccess = false };
  };
  -template<typename T> struct scalar_atanh_op {
  +template <typename T>
  +struct scalar_atanh_op {
  EIGEN_EMPTY_STRUCT_CTOR(scalar_atanh_op)
  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T operator()(const T& a) const {
  return std::atanh(a);
  @@ -401,6 +404,25 @@ struct functor_traits<scalar_round_op_google<Scalar>> {
  #undef ENABLE_FLOAT_EQUALITY_WARNING
  #undef DISABLE_FLOAT_EQUALITY_WARNING
  +template <typename Scalar>
  +struct bitwise_xor_op {
  + EIGEN_EMPTY_STRUCT_CTOR(bitwise_xor_op)
  + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar
  + operator()(const Scalar& x, const Scalar& y) const {
  + return x ^ y;
  + }
  + typedef typename Eigen::internal::packet_traits<Scalar>::type Packet;
  + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a,
  + const Packet& b) const {
  + return Eigen::internal::pxor(a, b);
  + }
  +};
  +
  +template <typename Scalar>
  +struct functor_traits<bitwise_xor_op<Scalar>> {
  + enum { Cost = Eigen::NumTraits<Scalar>::AddCost, PacketAccess = true };
  +};
  +
  } // end namespace internal
  } // end namespace Eigen
  @@ -779,15 +801,6 @@ struct bitwise_or_op {
  }
  };
  -template <typename T>
  -struct bitwise_xor_op {
  - EIGEN_EMPTY_STRUCT_CTOR(bitwise_xor_op)
  - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T operator()(const T& x,
  - const T& y) const {
  - return x ^ y;
  - }
  -};
  -
  template <typename T>
  struct bitwise_and : base<T, bitwise_and_op<T>> {};
  @@ -795,7 +808,7 @@ template <typename T>
  struct bitwise_or : base<T, bitwise_or_op<T>> {};
  template <typename T>
  -struct bitwise_xor : base<T, bitwise_xor_op<T>> {};
  +struct bitwise_xor : base<T, Eigen::internal::bitwise_xor_op<T>> {};
  template <typename T>
  struct make_complex_func {
  