2020-06-29 01:37:00 +02:00
|
|
|
// The Construct
|
|
|
|
//
|
|
|
|
// Copyright (C) The Construct Developers, Authors & Contributors
|
|
|
|
// Copyright (C) 2016-2020 Jason Volk <jason@zemos.net>
|
|
|
|
//
|
|
|
|
// Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
// purpose with or without fee is hereby granted, provided that the above
|
|
|
|
// copyright notice and this permission notice is present in all copies. The
|
|
|
|
// full license for this software is available in the LICENSE file.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
#define HAVE_IRCD_SIMD_LANE_CAST_H
|
|
|
|
|
|
|
|
namespace ircd::simd
|
|
|
|
{
|
|
|
|
template<class R,
|
|
|
|
class T>
|
2021-08-11 18:11:15 +02:00
|
|
|
R lane_cast(const T);
|
2020-06-29 01:37:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Convert each lane from a smaller type to a larger type
|
|
|
|
template<class R,
|
|
|
|
class T>
|
2021-08-11 18:11:15 +02:00
|
|
|
[[using gnu: always_inline, gnu_inline, artificial]]
|
|
|
|
extern inline R
|
|
|
|
ircd::simd::lane_cast(const T in)
|
2020-06-29 01:37:00 +02:00
|
|
|
{
|
2020-07-10 11:38:27 +02:00
|
|
|
#if __has_builtin(__builtin_convertvector)
|
2020-06-29 01:37:00 +02:00
|
|
|
return __builtin_convertvector(in, R);
|
2021-08-11 18:11:15 +02:00
|
|
|
#else
|
|
|
|
R ret;
|
|
|
|
for(size_t i(0); i < lanes<R>(); ++i)
|
|
|
|
ret[i] = in[i];
|
2020-06-29 01:37:00 +02:00
|
|
|
|
2021-08-11 18:11:15 +02:00
|
|
|
return ret;
|
|
|
|
#endif
|
2020-06-29 01:37:00 +02:00
|
|
|
|
2021-08-11 18:11:15 +02:00
|
|
|
static_assert
|
|
|
|
(
|
|
|
|
lanes<R>() == lanes<T>(), "Types must have matching number of lanes."
|
|
|
|
);
|
2020-06-29 01:37:00 +02:00
|
|
|
}
|