insert.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /* Copyright (C) 2011-2014 Povilas Kanapickas <[email protected]>
  2. Distributed under the Boost Software License, Version 1.0.
  3. (See accompanying file LICENSE_1_0.txt or copy at
  4. http://www.boost.org/LICENSE_1_0.txt)
  5. */
  6. #ifndef LIBSIMDPP_SIMD_INSERT_H
  7. #define LIBSIMDPP_SIMD_INSERT_H
  8. #ifndef LIBSIMDPP_SIMD_H
  9. #error "This file must be included through simd.h"
  10. #endif
  11. #include <simdpp/types.h>
  12. #include <simdpp/detail/insn/insert.h>
  13. namespace simdpp {
  14. namespace SIMDPP_ARCH_NAMESPACE {
  15. /** Inserts an element into a vector at the position identified by @a id.
  16. @code
  17. r0 = (id == 0) ? x : a0
  18. ...
  19. rN = (id == N) ? x : aN
  20. @endcode
  21. This function may have very high latency.
  22. It is expected that the argument comes from a general-purpose register.
  23. */
  24. template<unsigned id, unsigned N> SIMDPP_INL
  25. uint8<N> insert(const uint8<N>& a, uint8_t x)
  26. {
  27. static_assert(id < N, "index out of bounds");
  28. return detail::insn::i_insert<id>(a, x);
  29. }
  30. template<unsigned id, unsigned N> SIMDPP_INL
  31. int8<N> insert(const int8<N>& a, int8_t x)
  32. {
  33. static_assert(id < N, "index out of bounds");
  34. return (int8<N>) detail::insn::i_insert<id>((uint8<N>) a, (uint8_t)x);
  35. }
  36. template<unsigned id, unsigned N> SIMDPP_INL
  37. uint16<N> insert(const uint16<N>& a, uint16_t x)
  38. {
  39. static_assert(id < N, "index out of bounds");
  40. return detail::insn::i_insert<id>(a, x);
  41. }
  42. template<unsigned id, unsigned N> SIMDPP_INL
  43. int16<N> insert(const int16<N>& a, int16_t x)
  44. {
  45. static_assert(id < N, "index out of bounds");
  46. return (int16<N>) detail::insn::i_insert<id>((uint16<N>) a, (uint16_t)x);
  47. }
  48. template<unsigned id, unsigned N> SIMDPP_INL
  49. uint32<N> insert(const uint32<N>& a, uint32_t x)
  50. {
  51. static_assert(id < N, "index out of bounds");
  52. return detail::insn::i_insert<id>(a, x);
  53. }
  54. template<unsigned id, unsigned N> SIMDPP_INL
  55. int32<N> insert(const int32<N>& a, int32_t x)
  56. {
  57. static_assert(id < N, "index out of bounds");
  58. return (int32<N>) detail::insn::i_insert<id>((uint32<N>)a, (uint32_t)x);
  59. }
  60. template<unsigned id, unsigned N> SIMDPP_INL
  61. uint64<N> insert(const uint64<N>& a, uint64_t x)
  62. {
  63. static_assert(id < N, "index out of bounds");
  64. return detail::insn::i_insert<id>(a, x);
  65. }
  66. template<unsigned id, unsigned N> SIMDPP_INL
  67. int64<N> insert(const int64<N>& a, int64_t x)
  68. {
  69. static_assert(id < N, "index out of bounds");
  70. return (int64<N>) detail::insn::i_insert<id>((uint64<N>)a, (uint64_t)x);
  71. }
  72. template<unsigned id, unsigned N> SIMDPP_INL
  73. float32<N> insert(const float32<N>& a, float x)
  74. {
  75. static_assert(id < N, "index out of bounds");
  76. return detail::insn::i_insert<id>(a, x);
  77. }
  78. template<unsigned id, unsigned N> SIMDPP_INL
  79. float64<N> insert(const float64<N>& a, double x)
  80. {
  81. static_assert(id < N, "index out of bounds");
  82. return detail::insn::i_insert<id>(a, x);
  83. }
  84. } // namespace SIMDPP_ARCH_NAMESPACE
  85. } // namespace simdpp
  86. #endif