mirror of
https://github.com/matrix-construct/construct
synced 2024-09-27 19:28:52 +02:00
ircd::simd: Reorg existing mask related into header.
This commit is contained in:
parent
972fbcc97d
commit
dc14f2f803
3 changed files with 40 additions and 25 deletions
39
include/ircd/simd/mask.h
Normal file
39
include/ircd/simd/mask.h
Normal file
|
@ -0,0 +1,39 @@
|
|||
// 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_MASK_H
|
||||
|
||||
namespace ircd::simd
|
||||
{
|
||||
template<class T> T popmask(const T) noexcept;
|
||||
template<class T> T boolmask(const T) noexcept;
|
||||
}
|
||||
|
||||
/// Convenience template. Extends a bool value where the lsb is 1 or 0 into a
|
||||
/// mask value like the result of vector comparisons.
|
||||
template<class T>
|
||||
inline T
|
||||
ircd::simd::boolmask(const T a)
|
||||
noexcept
|
||||
{
|
||||
return ~(popmask(a) - 1);
|
||||
}
|
||||
|
||||
/// Convenience template. Vector compare instructions yield 0xff on equal;
|
||||
/// sometimes one might need an actual value of 1 for accumulators or maybe
|
||||
/// some bool-type reason...
|
||||
template<class T>
|
||||
inline T
|
||||
ircd::simd::popmask(const T a)
|
||||
noexcept
|
||||
{
|
||||
return a & 1;
|
||||
}
|
|
@ -13,8 +13,6 @@
|
|||
|
||||
namespace ircd::simd
|
||||
{
|
||||
template<class T> T popmask(const T) noexcept;
|
||||
template<class T> T boolmask(const T) noexcept;
|
||||
template<class T> uint popcnt(const T) noexcept;
|
||||
}
|
||||
|
||||
|
@ -36,26 +34,3 @@ noexcept
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/// Convenience template. Extends a bool value where the lsb is 1 or 0 into a
|
||||
/// mask value like the result of vector comparisons.
|
||||
template<class T>
|
||||
[[gnu::always_inline]]
|
||||
inline T
|
||||
ircd::simd::boolmask(const T a)
|
||||
noexcept
|
||||
{
|
||||
return ~(popmask(a) - 1);
|
||||
}
|
||||
|
||||
/// Convenience template. Vector compare instructions yield 0xff on equal;
|
||||
/// sometimes one might need an actual value of 1 for accumulators or maybe
|
||||
/// some bool-type reason...
|
||||
template<class T>
|
||||
[[gnu::always_inline]]
|
||||
inline T
|
||||
ircd::simd::popmask(const T a)
|
||||
noexcept
|
||||
{
|
||||
return a & 1;
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "split.h"
|
||||
#include "lower.h"
|
||||
#include "upper.h"
|
||||
#include "mask.h"
|
||||
#include "gather.h"
|
||||
#include "shl.h"
|
||||
#include "shr.h"
|
||||
|
|
Loading…
Reference in a new issue