Added clz, ctz, popcount, bswap, bitreverse.

This commit is contained in:
Christoffer Lerno
2022-08-16 21:18:14 +02:00
parent 15586b3076
commit ae51214c47
9 changed files with 114 additions and 2 deletions

41
lib/std/bits.c3 Normal file
View File

@@ -0,0 +1,41 @@
module std::bits;
/**
* @require types::is_intlike($typeof(i)) `The input must be an integer or integer vector`
**/
macro popcount(i)
{
return $$popcount(i);
}
/**
* @require types::is_intlike($typeof(i)) `The input must be an integer or integer vector`
**/
macro reverse(i)
{
return $$bitreverse(i);
}
/**
* @require types::is_intlike($typeof(i)) `The input must be an integer or integer vector`
**/
macro bswap(i) @builtin
{
return $$bswap(i);
}
/**
* @require types::is_intlike($typeof(i)) `The input must be an integer or integer vector`
**/
macro ctz(i) @builtin
{
return $$ctz(i);
}
/**
* @require types::is_intlike($typeof(i)) `The input must be an integer or integer vector`
**/
macro clz(i) @builtin
{
return $$clz(i);
}

View File

@@ -121,6 +121,19 @@ macro bool is_subarray_convertable($Type)
$endswitch;
}
macro bool is_intlike($Type)
{
$switch ($Type.kind):
$case SIGNED_INT:
$case UNSIGNED_INT:
return true;
$case VECTOR:
return is_intlike($Type.inner);
$default:
return false;
$endswitch;
}
macro bool is_equatable_value(value)
{
$if ($defined(value.less) || $defined(value.compare_to) || $defined(value.equals)):